Appearance
一句话总结:Function Calling 本质是"让模型输出结构化调用指令,宿主程序执行、结果回注再推理"——它是 Agent 与外部世界的唯一接口,也是最脆弱的一环。
本质与流程
- 本质:结构化文本生成,不是模型真的执行函数。模型按工具描述输出符合 JSON Schema 的调用请求,宿主执行并回注结果
- 完整闭环(两次请求):
- 用户输入 → 第一次请求(附工具声明)→ 模型返回
tool_calls - 宿主程序执行函数拿结果
- 第二次请求:
tool角色结果回传 → 模型生成最终回复(或继续调更多工具)
- 用户输入 → 第一次请求(附工具声明)→ 模型返回
- 各厂商命名:OpenAI Function Calling、Anthropic Tool Use、MCP(统一协议)
工具声明:JSON Schema 是"通信协议"
Anthropic 工具参数四要素:
name:^[a-zA-Z0-9_-]{1,64}$description:详细说明做什么、何时用、行为input_schema:JSON Schema 定义参数input_examples(可选):示例输入
Schema 设计要点:描述具体、用 enum 约束取值、写明边界、控制工具数量、required 列必填、strict 模式设 additionalProperties: false 降参数漂移。
结构化输出 vs Function Calling vs JSON Mode
- Function Calling:让模型"选择调用什么工具"
- Structured Outputs:让模型"输出符合 Schema 的 JSON"——Function Calling 的特化,共享 JSON Schema;
strict: true保证 100% 符合 - JSON Mode:只保证合法 JSON,不保证符合 Schema(旧方案)
并行与多步
- 并行调用:同轮互不依赖的工具可一次返回多个
tool_calls并行执行;跨轮依赖必须串行 - 多步工具链:模型可能连续多轮工具调用直到完成
- 循环控制:设 turn budget / 最大步数,硬性停环防跑飞
错误处理(生产关键)
先分类错误再定策略:
| 错误类型 | 示例 | 是否重试 | 处理 |
|---|---|---|---|
| 瞬态 transient | 超时、429、503、网络抖动 | 是 | 指数退避 + 全抖动(jitter)、遵守 Retry-After |
| 校验 validation | 参数格式错、缺字段 | 否 | 让模型自纠(错误作为正常 tool result 返回) |
| 业务 business | 业务规则阻止 | 否 | 解释约束 |
| 权限 permission | 无权访问 | 否 | 说明访问限制 |
| 不存在 not_found | 实体不存在 | 否 | 让用户核实 |
关键原则:
- 把失败作为正常工具结果返回(带可行动信息),别抛异常杀死整个 Agent
- 原始堆栈 trace 是坏的错误信息——转成 LLM 能读、能自纠的消息
- 只重试幂等/可重放安全的调用(防重复副作用)
- 写入类/危险操作:沙箱隔离 + 人工确认(HITL)
可靠性 / 安全 / 可观测三支柱
- 可靠性:确定性 schema、健壮校验、可预期重试
- 安全:最小权限凭据、沙箱执行、策略强制
- 可观测:每轮记录结构化 trace(工具、参数、结果、耗时)供复盘
面试要点
- 画出两次请求闭环(tool_calls → 执行 → 回注 → 最终回答)
- 说清"模型只生成调用指令,执行在宿主"
- 知道 JSON Schema 是通信协议 + strict / Structured Outputs
- 知道并行 vs 串行(同轮可并行、跨轮串行)
- 会按错误分型决策:瞬态才重试(退避+抖动),其余回给模型自纠
- 知道循环控制(turn budget)与写入类工具的 HITL