标准工具调用
工具名称要求
有的LLM会严格校验工具名称,所以工具名称最好是函数命名风格的, 大小写+数字+下划线,63个字符以内。
工具调用应该是成对出现
tips:
- 即一条rool=assistant消息,对应着一条role=tool消息
- tool_call_id要对应
- 有的模型会要求tool_calls消息后,应该紧跟着结果消息
- 如果LLM返回的tool_calls解析报错,或者本地执行报错,都应该返回role=tool的结果消息,返回报错信息。有的LLM会严格要求
{
"role": "assistant",
"content": "老板~ 小米(01810.HK)的日线数据已经成功获取啦!(๑•̀ㅂ•́)و✧ 现在需要获取关键技术指标(如MACD、RSI、均线等)来进行趋势分析,我这就调用`mcp_tt.get_technical_indicators`工具获取最近60天的技术指标数据~",
"tool_calls": [{
"id": "call_2lzdhh4w8t7j783xoam5f27t",
"function": {
"arguments": " {\"market\": \"HK\", \"stock_code\": \"01810.HK\", \"period\": 60}",
"name": "mcp_tt.get_technical_indicators"
},
"type": "function"
}]
}, {
"role": "tool",
"content": "{\"result\":{\"meta\":null,\"structuredContent\.....",
"tool_call_id": "call_2lzdhh4w8t7j783xoam5f27t"
}
LLM可能会返回错误的工具调用
抓包分析,发现LLM返回了如下工具调用,其中有些奇怪的字符, 如]<|FunctionCallEnd|>. 下面是SSE合并后的结果,合并工具:OpenAI SSE Data Merger
{
"id": "0217654415215304aa509763bcfc4a023d494b51b31f69b2adb1f",
"object": "chat.completion",
"created": 1765441522,
"model": "doubao-seed-1-6-250615",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "",
"tool_calls": [
{
"index": 0,
"function": {
"name": "",
"arguments": "]<|FunctionCallEnd|>"
}
}
]
},
"finish_reason": null,
"logprobs": null
}
],
"usage": null
}
gemini告诉我这是一种**特殊控制标记泄漏(Special Token Leakage)**现象。
客户端没办法避免,只能做好容错,提交报错信息给LLM。