外部工具调试方法

外部工具的设计很难一次成功,经常需要反复调整。

所以我们有必要了解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。


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