Function Calling 实战
FC(Function Calling / Tool Calling)是 Agent 的发动机。面试主线:schema 设计、多工具协作、错误处理、工程化。
基本流程
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名"},
},
"required": ["city"],
},
},
}]
resp = client.chat.completions.create(model="gpt-4o",
messages=messages, tools=tools)
# 模型可能返回 tool_calls, 执行后把结果作为 tool 消息回填, 再调一次核心循环:模型请求工具 → 执行 → 结果回填 → 再调模型,直到模型直接回答(见 LangChain 核心抽象篇)。
Schema 设计要点
| 要点 | 说明 |
|---|---|
| 描述精准 | 何时用、参数含义(决定调用准确率) |
| 参数严格 | 类型、必填、枚举、格式约束 |
| 粒度合适 | 工具太小调用多轮,太大参数复杂 |
| 数量控制 | 几十个时模型选择困难(分组或子代理) |
| 命名清晰 | 动词 + 对象(search_orders) |
多工具协作
- 一次响应可返回多个 tool_calls(并行调用)
- 工具结果按 tool_call_id 一一对应回填(见 LangChain 工具篇的 ToolMessage)
- 依赖场景:工具 B 需要工具 A 的结果,模型会分轮调用
- 工程注意:执行超时、失败重试、结果截断(大结果要截断或落盘,见 DeepAgents 上下文管理)
错误处理
| 错误 | 处理 |
|---|---|
| 参数错 | 把校验错误作为工具结果回填,模型会修正重调 |
| 执行失败 | 返回友好错误信息,模型可换方案 |
| 模型乱调工具 | 描述约束 + 权限校验 + 调用审计 |
| 循环卡死 | 最大轮数限制 + 超时(见 loop-engineering) |
关键认知:工具错误信息会回到模型眼里,错误信息要写清楚(模型能据此自救)。
与 MCP 的关系
- MCP 服务器暴露的工具,经适配器转成 FC schema(mcp-adapters,见 MCP 篇)
- 两者是生态层(MCP)与能力层(FC)的关系:MCP 是工具源,FC 是调用机制
面试追问
- FC 流程? 模型返回 tool_calls → 执行 → 结果回填 → 再调模型,直到直接回答
- schema 怎么写好? 描述精准(何时用、参数含义)、参数严格、粒度合适。描述决定准确率
- 多工具怎么并行? 一次响应多个 tool_calls,按 tool_call_id 回填。依赖场景分轮
- 工具报错怎么办? 错误信息回填给模型,它会修正或换方案。错误信息要写清楚
- 和 MCP 的关系? MCP 是工具源(协议),FC 是调用机制(API 能力)。适配器转换