AIAssistant

TsgcHTMLAIAssistant:把用自然语言输入的问题转换为适用于网格、数据表、数据透视表或表单的经过验证的操作集,支持 Delphi、C++ Builder 和 .NET。它从不接触您的数据集,不构建 SQL,也不输出 HTML。

TsgcHTMLAIAssistant

一个非可视组件。它把问题转换为一组封闭的操作:针对网格的筛选、排序、分组、高亮和数量限制,或针对数据透视表的行、列、度量和聚合,再由数据组件把它们应用到自己的行上。提供商是可选的:内置解析器无需 API 密钥即可作答。

组件类

TsgcHTMLAIAssistant(单元 sgcHTML_AI,非可视,一个 TsgcComponent_Base

渲染为

无标记:它返回经过验证的操作,由数据组件渲染这些操作

家族

聊天与 AI

语言

Delphi, C++ Builder, .NET

创建它,指定它,路由查询

可以用 ProviderAPIKeyModel 选择性地配置提供商。把助手指定给数据组件的 AIAssistant 属性,设置 AIQueryEnabled 以渲染查询栏,并路由该栏回传的操作。您也可以直接调用助手。

uses
  sgcHTML_AI, sgcHTML_Component_Grid;

FAI := TsgcHTMLAIAssistant.Create(Self);
FAI.Provider := aiprOpenAI;
FAI.APIKey := 'API_KEY';   // optional, the built-in parser answers without it
FAI.Model := 'gpt-4o-mini';
FAI.AllowRowDataToProvider := False;   // the default

oGrid.AIAssistant := FAI;
oGrid.AIQueryEnabled := True;

// in the message handler, action = gridAIQuery
oGrid.LoadAIQueryState(vState);   // empty when the state lives in the session
oGrid.ProcessAIQuery(vQuery);
oGrid.LoadFromDataSource;         // when the grid is bound to a dataset
oHTMX.PushFragment(vGuid, oGrid.HTML);

// Or call it directly and read the validated operations
oCols := TsgcHTMLAIColumns.Create;
oOps := TsgcHTMLGridOps.Create;
try
  oCols.Add('Amount', aidtFloat, 'Order amount');
  oCols.Add('Country', aidtString).AddSample('Spain');
  oCols.Add('Date', aidtDate);
  if FAI.QueryToGridOps('amount greater than 500 sort by date desc',
    oCols, oOps) then
    vText := oOps.ToText;   // what survived validation, as text
finally
  oOps.Free;
  oCols.Free;
end;
// includes: sgcHTML_AI.hpp, sgcHTML_Component_Grid.hpp

FAI = new TsgcHTMLAIAssistant(this);
FAI->Provider = aiprOpenAI;
FAI->APIKey = "API_KEY";   // optional, the built-in parser answers without it
FAI->Model = "gpt-4o-mini";
FAI->AllowRowDataToProvider = false;   // the default

oGrid->AIAssistant = FAI;
oGrid->AIQueryEnabled = true;

// in the message handler, action = gridAIQuery
oGrid->LoadAIQueryState(vState);   // empty when the state lives in the session
oGrid->ProcessAIQuery(vQuery);
oGrid->LoadFromDataSource();       // when the grid is bound to a dataset
oHTMX->PushFragment(vGuid, oGrid->HTML);

// Or call it directly and read the validated operations
String vText;
TsgcHTMLAIColumns *oCols = new TsgcHTMLAIColumns();
TsgcHTMLGridOps *oOps = new TsgcHTMLGridOps();
try
{
  oCols->Add("Amount", aidtFloat, "Order amount");
  oCols->Add("Country", aidtString, "")->AddSample("Spain");
  oCols->Add("Date", aidtDate, "");
  if (FAI->QueryToGridOps("amount greater than 500 sort by date desc",
    oCols, oOps))
    vText = oOps->ToText();   // what survived validation, as text
}
__finally
{
  delete oOps;
  delete oCols;
}
using esegece.sgcWebSockets;

var ai = new TsgcHTMLAIAssistant();
ai.Provider = TsgcHTMLAIAssistant.TsgcHTMLAIProvider.aiprOpenAI;
ai.APIKey = "API_KEY";   // optional, the built-in parser answers without it
ai.Model = "gpt-4o-mini";
ai.AllowRowDataToProvider = false;   // the default

grid.AIAssistant = ai;
grid.AIQueryEnabled = true;

// in the message handler, action = gridAIQuery
grid.LoadAIQueryState(state);   // empty when the state lives in the session
grid.ProcessAIQuery(query);
grid.LoadFromDataSource();      // when the grid is bound to a dataset
htmx.PushFragment(guid, grid.HTML);

// Or call it directly and read the validated operations
var cols = new TsgcHTMLAIColumns();
var ops = new TsgcHTMLGridOps();
cols.Add("Amount", TsgcHTMLAIDataType.aidtFloat, "Order amount");
cols.Add("Country", TsgcHTMLAIDataType.aidtString).AddSample("Spain");
cols.Add("Date", TsgcHTMLAIDataType.aidtDate);
if (ai.QueryToGridOps("amount greater than 500 sort by date desc", cols, ops))
{
    string text = ops.ToText();   // what survived validation, as text
}

关键属性与方法

您最常使用的成员。

版本与平台

使用提供商需要 Enterprise 或 All-Access 版本的 AI 单元,或者 sgcAI 包,并且它们仅限 Windows。内置解析器在所有平台上都无需提供商即可作答。该单元在定义了 SGC_HTML 时编译,sgcVer.inc 不会为 Android 和 iOS 定义它,并且 sgcHTML 是独立的包,与 sgcWebSockets 分开销售。

在哪里指定

AIAssistant 存在于 TsgcHTMLComponent_GridTsgcHTMLComponent_DataTableTsgcHTMLComponent_PivotTableTsgcHTMLComponent_FormTsgcHTMLComponent_InlineAIPrompt 上。AIQueryEnabled 存在于网格、数据表和数据透视表上:它渲染查询栏、“解释为”小标签和清除控件。表单没有 AIQueryEnabled,它使用助手进行智能粘贴,InlineAIPrompt 用它来生成答案。在没有指定助手时,网格完全不会渲染任何 AI 标记。

哪些数据会离开本机

网格或数据透视表的问题会发送列名、标题、类型,以及每列最多三个示例值,每个值截取到 40 个字符。除此之外不发送任何内容,无论开关如何设置。只有涉及行数据的调用才会发送行,并且仅当 AllowRowDataToProviderTrue 时才会发送,而默认值并非如此:默认情况下 SuggestColumnValuesSummarize 返回 False 且不发送任何内容,MaxRows 限制它们可以携带的数量。智能粘贴发送用户粘贴的文本以及每个字段的名称、标签和类型,不发送表单的任何值。

验证就是边界

提供商返回的一切都被视为不可信文本。每个列名都必须与您的白名单匹配,按完整名称匹配,不区分大小写。每个运算符必须是 TsgcHTMLAIOperator 的 13 个之一,每个聚合必须是 sum、count、avg、min 和 max 之一,每个值都按其列的类型进行强制转换:无法转换的值会使其整个操作被丢弃。高亮样式必须是 primary、secondary、success、danger、warning、info、light 或 dark 之一。限制会被限定在 MaxLimit 以内,最多 32 个筛选、32 个排序和 32 个高亮,控制字符会被剥离,任何未知内容都会被静默丢弃。如果没有任何内容留下来,整个集合(包括说明)都会被清空。提示词注入只会产生空的或部分的集合,绝不会产生异常。

操作模型

TsgcHTMLGridOps 包含 FiltersSortsHighlightsGroupByLimitExplanationTsgcHTMLPivotOps 包含 RowsColumnsMeasureAggregateExplanationTsgcHTMLAIColumns 是白名单:为每一列调用 Add(aName, aDataType, aCaption),用 AddSample 添加示例。两个操作类都提供 IsEmptyToTextToJSON,只有在传入列时,FromJSON 才是完整的边界,因此请对从浏览器读回的任何内容,用实时白名单重新验证。

选择提供商

ProvideraiprOpenAI(默认值)、aiprAnthropicaiprGeminiaiprDeepSeekaiprOllamaaiprGrokaiprMistral 之一,即 TsgcAIChatProvider(位于 sgcAI_Chat)的七个取值。设置 APIKeyBaseUrl,助手就拥有一个 TsgcAI_Chat,由 ProviderAPIKeyModel(为空则保持聊天默认值)和 BaseUrl 配置。或者把您自己的聊天组件指定给 Chat,它只在编译了 AI 单元的地方才有声明。每次调用都会请求遵循 JSON schema 的结构化输出,之后您的聊天会被恢复。HasProvider 说明您处于哪种情况。

基于规则的回退

没有提供商时,助手用自己的解析器作答,UseRuleBasedFallback(默认开启)也让它在提供商调用失败时作答。它读取“列 运算符 值”形式的子句,用 and 或逗号连接,另外还有 sort by、group by、top N、between A and B 和 highlight,对于数据透视表则读取行、列和聚合。它接受每个运算符常见的英文写法以及两种小数分隔符。它不理解的问题不会产生任何操作,页面保持其行不变。SuggestColumnValuesSummarize 没有回退。

表单的 SmartPaste

SmartPaste(aText, aFields, aValues) 把粘贴的文本映射到一组字段上。把 SmartPasteEnabled 设置在 TsgcHTMLComponent_Form 上,它就会渲染一个粘贴区;ProcessSmartPaste(aText) 把文本交给助手,按名称把返回的内容写入字段,并将它们标记为由 AI 填写,在标签上带一个小徽章。基于规则的解析器无需提供商即可作答,换行符在传到服务器的过程中会保留。

列助手

SuggestColumnValues(aPrompt, aRows, aValues) 驱动网格的列助手。AIMode 不是 acOff 的列会渲染一个建议控件,ProcessAIColumnValues(aColumnName) 一次调用为每个可见行请求一个值,答案成为 AIProposals,带有 Accept 和 Reject 控件。库不会写入任何内容:被接受的建议会触发 OnAIColumnValues,由您的应用将其持久化。该调用会发送行数据,因此需要提供商,并且需要开启 AllowRowDataToProvider

答案设置与事件

Language 设置自由文本的语言,为空表示使用请求的区域设置。CacheMinutes(5)对相同列集上的相同问题从缓存中作答,ClearCache 清空缓存。MaxLimit(1000)不能提高到 1000 以上。OnBeforeQuery(Sender, aPrompt, aAllow) 在每次调用提供商之前可以看到完整的提示词,并在您把 aAllow 设为 False 时阻止调用。任何方法都不会引发异常:提供商失败会触发 OnAIError(Sender, E, aHandled)

宿主约定

没有 HTTP 路由。每个控件都是一个 data-sgc-ws-send 表单,您的应用根据 action 分派:gridAIQuerygridAICleargridAIColumngridAIAcceptgridAIRejectpivotAIQuerypivotAIClearformSmartPaste,以及内联提示的四个操作。以带外片段的形式返回重新渲染的组件。一组组件对应一个用户,因此请为每个会话使用各自的一组,并在服务器上保留每个操作所执行内容的授权。

继续探索

在线帮助此组件的完整 API 参考和使用指南。
AI Data Pack 指南全貌:模型收到什么、验证、基于规则的解析器、宿主约定和限制。
所有 sgcHTML 组件浏览 80 多个组件的完整功能矩阵。
下载免费试用版30 天试用版包含 60.HTML 演示项目,其中 18.AIData 用自然语言向网格、数据透视表和表单提问。
价格Single、Team 和 Site 授权,均含完整源代码。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好开始了吗?

下载免费试用版,开始在 Delphi、C++ Builder 和 .NET 中构建 Web 界面。