工具定义快速入门

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严格按照工具的计算结果返回答案,不要自作主张纠错,解决方法有:

1、 如示例代码一样,在系统提示词中给出明确的指示、

2、 也可以在用户问题中明确,例如:"3 加 5 等于多少?然后减 4 呢?请严格按照工具计算结果给出答案"

这种“AI 自我修正”现象说明:模型会根据工具结果的合理性做判断,并不总是无条件采纳。通过明确的系统提示词,可以引导模型按预期使用工具结果。下一节,我们将介绍如何设计工具描述,让 AI 更准确地选择工具。


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