Skip to content

一句话总结:Function Calling 本质是"让模型输出结构化调用指令,宿主程序执行、结果回注再推理"——它是 Agent 与外部世界的唯一接口,也是最脆弱的一环。

本质与流程

  • 本质:结构化文本生成,不是模型真的执行函数。模型按工具描述输出符合 JSON Schema 的调用请求,宿主执行并回注结果
  • 完整闭环(两次请求)
    1. 用户输入 → 第一次请求(附工具声明)→ 模型返回 tool_calls
    2. 宿主程序执行函数拿结果
    3. 第二次请求: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