为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
现在你就可以在对话框中统计数据、增加行、查看表结构了:


