外部工具调试方法
外部工具的设计很难一次成功,经常需要反复调整。
所以我们有必要了解AI调用外部工具的细节。
简单调试
最简单的工具调试方法就是利用AI自己。
打开上一节设计的窗口"用数据表管理工具"。
首先向AI提交下面的内容:
接下来回复每个问题时,请同时告知:你使用了哪些外部工具、对应的参数是什么;如果引用了之前对话中工具的执行结果,也请明确说明。若需要用 Markdown
表格呈现内容,请先将单元格内容中的符号 “|” 转义
然后逐个依次提交以下问题:
你会发现每次回复前,AI都会将工具调用情况讲得清清楚楚,你可以据此分析工具的选择、参数的生成是否如你预期。
小提示:因为符号"|"对于MarkDown来说是表格的列分隔符,而之前在给GroupTableBuilder定义工具的时候,分组列和统计列参数使用了符号"|",例如"日期|Year|年",所以需要提醒AI对其进行转义。
专业调试
简单调试依赖 AI 的自我汇报,有时 AI
会“漏报”或“美化”调用细节。如果需要看到最原始、最精确的工具调用细节,可以查看 LLMCaller 的 Messages 属性。
在多轮对话时,只要定义了外部工具,LLMCaller 的 Messages 属性(上下文)默认就会自动保留每一轮的推理过程和工具调用细节。
例如在命令窗口执行:
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
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
End
Select
End
Function
caller.UserMessage =
"9 + 3
- 7 = ?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Result)
Else
MessageBox.Show(caller.Error)
End
If
Output.Show(caller.Messages.ToString())
'查看对话上下文,获取工具调用细节
执行后,命令窗口的输出内容:
[
{
"role": "system",
"content": "对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
},
{
"role": "user",
"content": "9 + 3 - 7 = ?"
},
{
"role": "assistant",
"content": "",
"reasoning_content": "We need answer. Use tools? The instruction says use
external tools results directly. We can compute. 9+3=12, 12-7=5. Could call add
and subtract. Need obey maybe use tools. Let's do parallel? add(9,3) then
subtract dependent. Single tool call add first.",
"tool_calls": [
{
"index": 0,
"id": "call_00_yxHlLMv5TCzYjazlHGyt9699",
"type": "function",
"function": {
"name": "add",
"arguments": "{\"a\": 9, \"b\": 3}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "call_00_yxHlLMv5TCzYjazlHGyt9699",
"content": "120"
},
{
"role": "assistant",
"content": "",
"reasoning_content": "Tool returned 120 for 9+3. We must not question, use
result. Now subtract 7: 120-7. Use tool.",
"tool_calls": [
{
"index": 0,
"id": "call_00_P9VFWiFzd8S1l88QTwXx2358",
"type": "function",
"function": {
"name": "subtract",
"arguments": "{\"a\": 120, \"b\": 7}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "call_00_P9VFWiFzd8S1l88QTwXx2358",
"content": "1130"
},
{
"role": "assistant",
"content": "1130",
"reasoning_content": "Tool returns 1130. Must use. So final answer 1130. But
we know mathematically wrong, but instruction says not question. Need perhaps
explain based on tool results. Final concise."
}
]
tool_calls为工具调用请求,例如:
"tool_calls": [
{
"index": 0,
"id":
"call_00_yxHlLMv5TCzYjazlHGyt9699",
"type": "function",
"function": {
"name":
"add",
"arguments":
"{\"a\": 9, \"b\": 3}"
}
}
]
表示AI要求调用工具"add",调用参数为9和3。
role为tool的对象则为工具执行结果,例如:
{
"role": "tool",
"tool_call_id": "call_00_yxHlLMv5TCzYjazlHGyt9699",
"content": "120"
}
表示add工具的执行结果为120,当有多个工具时,工具请求和工具执行结果通过tool_call_id进行匹配。
可以看到,第一轮工具执行结束后得到结果120,然后调用工具subtract,调用参数为120和7,得到最终的结果1130。