Function Calling 实战:让模型学会调你的 API

谭老师451 阅读

Function Calling 是大模型落地最实用的能力之一:模型不直接回答,而是输出一个"我想调用某个函数"的结构化结果,你的代码去执行,再把结果回填给它。本文讲讲完整链路和坑。

第一步:定义工具。OpenAI 格式大概是:

JSON
{ "type": "function", "function": { "name": "get_weather", "description": "查询指定城市的天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名" } }, "required": ["city"] } } }

description 写得越详细,模型调用越准。这一步偷懒后面全是坑。

第二步:请求时把工具传进去。模型可能会返回两种结果:正常回答,或者一个 tool_calls 数组。判断:

Python
if msg.tool_calls: # 执行工具 result = call_your_api(msg.tool_calls[0].function.arguments) # 把结果作为新消息发回去 else: # 正常回答

第三步:结果回填。执行完工具后,要把结果作为一条 role=tool 的消息追加进对话,再请求一次,模型才能基于结果生成最终回答。漏掉这一步,模型就不知道工具返回了什么。

坑一:本地模型的 function calling 不稳定。用 Ollama 跑 Qwen 时,模型可能不返回结构化的 tool_calls,而是把工具调用写成一段自然语言。我的应对方案是:在 system prompt 里强调"必须输出 JSON",并对输出做容错解析。

坑二:参数要校验。模型可能传非法的参数值,比如日期格式不对。别直接信模型的输出,先过一遍 zod 或 pydantic 校验。

坑三:循环调用。模型可能连续调用好几个工具,别只处理第一个。要循环处理所有 tool_calls,直到没有为止。

坑四:工具数量别太多。一次传 20 个工具,模型会选错。控制在 5-8 个以内,或者分层:先用一个"路由工具"决定走哪组工具。

Function Calling 做好之后,Agent 的能力边界一下就打开了。

评论0

还没有评论,来抢沙发~