为Foxtable设计AI工具


本节内容参考CaseStudy目录下的文件"LLMCaller.Table"的窗口"Foxtable AI工具"。

本节的任务是为Foxtable设计几个小的AI工具,能通过对话框实现数据计算、增加行、查看表结构等操作。


要完成这个任务,
只需修改窗口AfterLoad事件中初始化LLMCaller的代码,加上相关工具的定义和执行代码:

' 1、初始化LLMCaller
Dim
caller As New LLMCaller("https://api.deepseek.com/chat/completions", "deepseek-flash", "sk-a734b83536da45e9aedc3e42605bfb3a") '请替换为自己的密钥
caller.stream =
True '开启流式输出
caller.Messages =
New JArray() '开启多轮对话
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复" '设置系统提示词
Vars(
"caller") = caller '将初始化好的LLMCaller存放在Var变量中,方便复用
'
定义五个工具,分别用于条件计算、增加行、获取指定表结构、列出所有表、获取今天日期 ----
With
caller.AddTool("compute_table", "对指定数据表进行条件统计,使用前应该先获取表结构(同一个表只需获取一次,不用重复获取),返回满足条件的聚合值(如总和、平均值、计数、最大值、最小值等)。当用户需要计算某个数值列的总和、平均值、计数等,并且可以指定筛选条件时,使用此工具。")
    .AddParameter(
"table_name", "string", "要统计的数据表名称(用户可能会说'XX表',请忽略末尾的'表'字,只取核心名称),必须是当前项目中已存在的表名", True)
    .AddParameter(
"expression", "string", "统计表达式,使用聚合函数,例如:'Sum(数量)'、'Avg(金额)'、'Count(客户)'、'Max(成绩)'、'Min(年龄)'。不支持'Count(*)'.聚合函数支持:Sum、Avg、Count、Max、Min、StDev、Var。", True)
    .AddParameter(
"filter", "string", "可选条件,用于筛选统计的记录,格式为条件表达式,例如:'产品 = ''PD01'''、'日期 >= #1/1/1999# And 日期 <= #12/31/1999#'、'数量 > 100 And 折扣 = 0'。如果不需要条件,可以不传此参数。", False)
End
With
With
caller.AddTool("add_row", "向指定的数据表中添加一行数据,使用前应该先获取表结构(同一个表只需获取一次,不用重复获取)。当用户需要录入新记录时使用此工具;对于有表达式的列,不需要赋值,因为系统会根据表达式自动计算。")
    .AddParameter(
"table_name", "string", "要添加数据的目标数据表名称(用户可能会说'XX表',请忽略末尾的'表'字,只取核心名称),必须是当前项目中已存在的表名", True)
    .AddParameter(
"row_data", "object", "要添加的数据,键为列名,值为列值。例如:{""日期"":""2026-07-14"", ""客户"":""CS01"", ""产品"":""电脑"", ""数量"":20}。日期值请使用 'YYYY-MM-DD' 格式;字符串值使用双引号包裹;数值使用数字类型。", True)
End
With
With
caller.AddTool("get_table_schema", "获取指定数据表的结构信息,包括所有列的名称、数据类型和表达式(如果有的话)。当用户需要了解某个表的列信息以便构造查询、赋值或添加数据时,使用此工具。表结构不会变化,同一个表只需获取一次,不用重复获取")
    .AddParameter(
"table_name", "string", "要获取结构的数据表名称(用户可能会说'XX表',请忽略末尾的'表'字,只取核心名称),必须是当前项目中已存在的表名", True)
End
With
caller.AddTool(
"list_tables", "获取当前项目中所有数据表的表名。当不确定有哪些表可用时,使用此工具查询。")
caller.AddTool(
"get_today_date", "获取当前系统日期时间,以 yyyy-MM-dd 格式返回。当用户询问今天几号、今天日期、当前日期等信息时使用此工具。无需任何参数。")
caller.ToolExecutor =

Function
(ttoolName As String, targs As JObject) As String
   
Select Case ttoolName
       
Case "compute_table" '条件计算
           
Dim tableName As String = targs("table_name").ToString()
           
If DataTables.Contains(tableName) = False Then
               
Return "{""error"":""表 '" & tableName & "' 不存在""}"
           
End If
           
Dim expression As String = targs("expression").ToString()
           
Dim filter As String = ""
           
If targs.ContainsKey("filter") Then filter = targs("filter").ToString()
           
Try
               
Dim dt As DataTable = DataTables(tableName)
               
Dim result As Object = dt.Compute(expression, filter)
               
Return result.ToString()
           
Catch ex As Exception
               
Return "{""error"":""" & ex.Message & """}"
           
End Try
       
Case "add_row" '增加行
           
Dim tableName As String = targs("table_name").ToString()
           
If DataTables.Contains(tableName) = False Then
               
Return "{""error"":""表 '" & tableName & "' 不存在""}"
           
End If
           
Dim rowData As JObject = targs("row_data")
           
Try
               
Dim dt As DataTable = DataTables(tableName)
               
Dim dr As DataRow = dt.AddNew() ' 添加新行
               
' 遍历 row_data 中的每个键值对
               
For Each prop As JProperty In rowData.Properties()
                   
Dim colName As String = prop.Name
                   
Dim colValue As JToken = prop.Value
                   
If Not dt.DataCols.Contains(colName) Then ' 检查列是否存在
                       
Continue For ' 列不存在,跳过
                   
End If
                     dr(colName) = colValue.ToString()
               
Next
               
Return "{""message"":""行已成功添加到表 '" & tableName & "',请手动保存数据。""}"
           
Catch ex As Exception
               
Return "{""error"":""" & ex.Message & """}"
           
End Try
       
Case "get_today_date"
           
Return Format(Date.Now, "yyyy-MM-dd")
       
Case "list_tables" '辅助工具,返回所有表名,以JSON数组形式返回
           
Dim nms As New JArray
           
For Each dt As DataTable In DataTables
                nms.Add(dt.Name)
           
Next
           
Return nms.ToString()
       
Case "get_table_schema" '辅助工具,用于获取指定表的表结构,用JSON数组形式返回
           
Dim tableName As String = targs("table_name").ToString()
           
If DataTables.Contains(tableName) = False Then
               
Return "{""error"":""表 '" & tableName & "' 不存在""}"
           
End If
           
Dim dt As DataTable = DataTables(tableName)
           
Dim columns As New JArray
           
For Each dc As DataCol In dt.DataCols
               
Dim column As New JObject
                column(
"name") = dc.Name
                column(
"type") = dc.DataType.Name
               
If dc.Expression > "" Then
                    column(
"expression") = dc.Expression
               
End If
                columns.Add(column)
           
Next
           
Return columns.ToString()
       
Case Else
           
Return "未知工具:" & ttoolName
   
End Select
End
Function

现在你就可以在对话框中统计数据、增加行、查看表结构了:

 


本页地址:http://www.foxtable.com/webhelp/topics/7217.htm