Function Calling 详解
本节定位
上一节你已经知道 Function Calling 是“模型产出结构化工具调用”。
这一节我们不再停留在“会调用”,而要进入真正重要的问题:
怎样把函数调用做得稳定、可控、可扩展?
这才是它在 Agent 系统里真正的工程价值。
学习目标
- 理解 Function Calling 的完整工程链路
- 学会设计更稳的工具 schema
- 理解参数校验、失败处理和错误恢复
- 看懂一个多步工具调用的小型闭环
- 分清“模型做决定”和“程序做执行”各自负责什么
一、为什么要把 Function Calling 单独深挖?
1.1 初级版本只解决“能不能调”
最简单的函数调用系统只要求:
- 模型选对工具
- 参数大致对
这在 demo 阶段通常够了。
1.2 真正上线后会立刻遇到更难的问题
比如:
- 工具很多,模型经常选错
- 参数经常缺字段
- 某些调用必须做权限控制
- 工具失败后怎么恢复?
- 多步调用时怎样避免无限循环?
所以真正的 Function Calling,不只是一个 JSON 结构,而是一套工程机制。
二、先把完整链路看清楚
2.1 Function Calling 的标准闭环
2.2 哪些环节分别归谁负责?
| 环节 | 谁负责 |
|---|---|
| 识别要不要调工具 | 模型 |
| 产出调用结构 | 模型 |
| 校验参数是否合法 | 程序 |
| 执行工具 | 程序 |
| 根据结果继续下一步 | 模型 / 工作流 / Agent 调度器 |
这是一个特别关键的边界:
模型负责“决定”,程序负责“保证执行安全和稳定”。
三、Schema 设计为什么会直接影响效果?
3.1 一个坏 schema 长什么样?
bad_schema = {
"name": "search",
"description": "做一些查询",
"parameters": {
"q": {"type": "string"}
}
}
print(bad_schema)
这个 schema 的问题在于:
- 工具名太模糊
- 描述太空
- 参数语义不清
模型拿到这种 schema,很容易糊涂。