Function Call 与 Agent:从工具协议到错误恢复
0. 元信息
- 主题路径:
docs/topics/llm-applications/subtopics/function-call-and-agent/ - 父主题:
llm-applications - 适合对象:已能调用模型 API、会写 Python 服务的学习者
- 建议周期:1~2 周
- 前置知识:无额外前置(继承父主题依赖)
- 最终目标:能实现受限 Agent loop,完成工具校验、状态转移、超时、重试、降级和审计
1. 学习路线
Function schema
→ 工具注册与参数校验
→ Agent loop 与状态机
→ 超时、重试、幂等与预算
→ 错误恢复、降级与可观测性
3. 阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. Function Call | 工具名、JSON schema、调用与返回协议 | 天气/订单查询工具 | 能拒绝非法参数,记录 request id |
| 2. Agent loop | observe-plan-act、消息状态、终止条件 | 两工具 Agent | 能画状态机并限制最大步数 |
| 3. 错误处理 | 超时、网络错误、业务错误、重复调用 | 可恢复工具执行器 | 能区分可重试与不可重试错误 |
| 4. 安全与审计 | 最小权限、敏感操作确认、日志脱敏 | 审计日志与拒绝路径 | 工具权限、预算和失败原因可追踪 |
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
Function Call 把自然语言决策转换为结构化工具请求,Agent 则把多轮决策组织成受约束的状态机。工程重点不是让模型“自主”,而是让每一步可验证、可停止、可恢复。
9.2 概念地图
stateDiagram-v2
[*] --> Plan
Plan --> CallTool
CallTool --> Validate
Validate --> Observe: 合法
Validate --> Recover: 非法
Observe --> Plan: 未完成
Observe --> Done: 完成
CallTool --> Recover: 超时/错误
Recover --> Plan: 可恢复
Recover --> Failed: 超预算或不可恢复
9.3 基础知识讲解
主推模型供应商官方工具调用文档和 JSON Schema 文档;备查 LangGraph 等状态图框架。先用 Python 显式循环实现,再比较框架;工具实现和日志代码使用前确认依赖许可证。
9.4 经典问题与经典案例
| 问题 | 最简答案 |
|---|---|
| 参数类型错误 | schema 校验后返回可读错误,不直接执行 |
| 工具超时 | 设置 deadline,按错误类别有限重试 |
| Agent 无限循环 | 最大步数、重复动作检测和总预算 |
| 重试造成副作用 | 写操作使用幂等键或要求确认 |
| 工具结果过长 | 摘要/分页后再交给模型 |
| 敏感工具误调用 | 最小权限、白名单和人工确认 |
9.5 学习难点
- 概念难点:工具调用不是普通文本;必须区分模型意图、参数和执行结果。
- 思维难点:先定义状态、转移和终止条件,再写 loop。
- 工程难点:失败恢复必须幂等且有预算,不能用无限重试掩盖故障。
9.6 技术标准与接口
Entity
Tool schema、tool call、tool result、state、trace、deadline、retry policy、idempotency key。
Scope
Function Call 规定模型与应用的结构化交互,不授权工具本身,也不保证调用安全。
Structure
掌握 name、description、parameters、arguments、result、error、status、step count 和 token budget。
Ecosystem
供应商原生工具调用、OpenAI-compatible API、LangGraph 等框架各有消息格式和状态管理方式;以实际响应为准。
Depth Tiers
L0 知道工具调用存在;L1 看懂 schema;L2 能实现单工具调用;L3 能恢复错误并审计;L4 能设计权限和多 Agent 协作。本子主题要求 L3。
Source
官方工具调用、JSON Schema 和 LangGraph 文档;版本快照日期:2026-07-28。
引用父主题:../../README.md