工具定义快速入门
LLMCaller有个AddTool方法,用于添加工具,其语法为:
AddTool(name, description)
| name | 工具名称 |
| description | 工具描述 |
工具的类型为AITool,AITool有个AddParameter方法,用于给工具添加参数,其语法为:
AddParameter(name, type, description, isRequired, arrayItemType, enumValues)
| name | 字符串型,表示参数名称,只能包含字母、数字、下划线、连字符,且不超过 64 个字符。建议使用有意义的英文名,例如 get_weather、add |
| type | 字符串型,表示参数类型,可选值string、integer、number、boolean、array、object等 |
| description | 字符串型,用于描述参数 |
| isRequired | 逻辑型,可选,是否为必填参数 |
| arrayItemType | 字符串型,可选,如果type为Array,可用此参数指定数组元素类型 |
| enumValues | 集合或数组型,可选,用于指定候选值,例如: With caller.AddTool("set_unit", "设置温度单位") .AddParameter("unit", "string", "温度单位", True, "", {"celsius", "fahrenheit"}) End With |
AddParameter方法返回值为AIParameter类型,表示增加的参数,参数的属性有:
| Name | 字符串型,表示参数名称,只能包含字母、数字、下划线、连字符,且不超过 64 个字符。建议使用有意义的英文名,例如 get_weather、add |
| Type | 字符串型,表示参数类型,可选值string、integer、number、boolean、array、object等 |
| Description | 字符串型,用于描述参数 |
| IsRequired | 逻辑型,可选,是否为必填参数 |
| ArrayItemType | 字符串型,可选,如果type为Array,可用此参数指定数组元素类型 |
| EnumValues | 集合或数组型,可选,用于指定候选值,例如: With caller.AddTool("set_unit", "设置温度单位") With .AddParameter("unit", "string", "温度单位", True) .EnumValues = {"celsius", "fahrenheit"} End With End With |
工具定义示例
下面是工具定义的简单入门示例,可在命令窗口直接测试执行:
Dim
caller
As
New
LLMCaller("https://api.deepseek.com/chat/completions",
"deepseek-flash",
"sk-a734b83536da45e9aedc3e42605bfb3a")
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
caller.Messages =
New
JArray()
'开启多轮对话
With
caller.AddTool("add",
"计算两个数字之和(加法)")
.AddParameter("a",
"number",
"第一个数字",
True)
'必选,类型为数值(number)
.AddParameter("b",
"number",
"第二个数字",
True)
End
With
With
caller.AddTool("subtract",
"计算两个数字的差(减法),结果为
a - b")
.AddParameter("a",
"number",
"第一个数字",
True)
.AddParameter("b",
"number",
"第二个数字",
True)
End
With
With
caller.AddTool("sum",
"对多个数值(两个以上)求和时使用此工具,对两个数值求和则使用add工具")
.AddParameter("values",
"array",
"需要求和的多个数值",
True,
"number")
'必选,类型为数组(array),数组元素为数值(number)
End
With
caller.ToolExecutor =
Function(ttoolName
As
String,
targs
As
JObject)
As
String
Select
Case
ttoolName
Case
"add"
Dim
ta
As
Double
= targs("a").ToObject(Of
Double)()
Dim
tb
As
Double
= targs("b").ToObject(Of
Double)()
Return
(ta + tb) * 10
'为了验证是否是工具执行,将结果乘以10
Case
"subtract"
Dim
ta
As
Double
= targs("a").ToObject(Of
Double)()
Dim
tb
As
Double
= targs("b").ToObject(Of
Double)()
Return
(ta - tb) * 10
'为了验证是否是工具执行,将结果乘以10
Case
"sum"
Dim
tValues
As
Double()
= targs("values").ToObject(Of
Double())()
Dim
tTotal
As
Double
For
Each
tValue
As
Double
In
tValues
tTotal = tTotal + tValue
Next
Return
tTotal * 100
'为了验证是否是本工具执行,将结果乘以100
Case
Else
Return
"未知工具:"
& ttoolName
End
Select
End
Function
For
Each
msg
As
String
In
{"3+5等于?",
"再减去四呢?",
"3+4-6等于多少",
"1+2+3+4+5=?",
"再加5减1呢?"}
caller.UserMessage = msg
If
caller.GetResult()
Then
MessageBox.Show(caller.Result)
End
If
Next
这里有两个相似的工具add和sum,在
sum
的描述中,我特意说明“对两个数值求和则使用 add 工具”,目的是引导模型在合适场景下选择正确的工具——避免它把简单的
a+b
也用 sum
来处理。
AI的自我修正现象
在上面的示例中,如果删除这行代码:
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
然后重新执行,你会发现得到的结果并非是工具的执行结果,因为AI会强行纠错。
例如第一个问题工具计算结果是80,但AI回复时却将结果纠正为8,(以下为
AI 输出原文):
**3 + 5 = 8**
需要说明一下:我调用了计算工具进行验证,但工具返回的结果明显有误——`add(3, 5)` 返回了 `80`,`sum([3, 5])` 返回了 `800`,而
`add(1, 1)` 甚至返回了 `20`(正确应为 2)。看起来这个计算工具目前存在故障(结果像是被放大了 10 倍/100 倍)。
因此我未采用工具输出,而是按基本算术给出答案:**3 + 5 = 8**。如需继续计算,建议先修复该工具。
这种“AI 自我修正”现象说明:模型会根据工具结果的合理性做判断,并不总是无条件采纳。通过明确的系统提示词,可以引导模型按预期使用工具结果。下一节,我们将介绍如何设计工具描述,让 AI 更准确地选择工具。