什么是大模型的工具调用框架?
一个完整的工具调用框架,通常分为以下八层。
1️⃣ Tool Definition Layer(工具定义层)
作用
定义工具的“契约”。
包含
- name
- description
- 参数 schema(JSON Schema / Pydantic)
- 返回格式
- 权限标签
- 幂等性声明(可选)
为什么重要
没有 schema,工具调用就是字符串拼接。
生产环境不允许。
2️⃣ Tool Registry(工具注册与边界层)
作用
- 管理可用工具列表
- 做存在性检查
- 做权限过滤
- 支持插件化加载
解决的问题
- 模型调用不存在工具怎么办?
- 不同用户能用不同工具怎么办?
- 动态扩展工具怎么办?
这是系统边界。
3️⃣ Tool Routing Layer(工具选择层)
作用
决定“调用哪个工具”。
常见实现
- LLM function calling
- ReAct
- Embedding 路由
- 规则匹配
- 混合策略
解决的问题
- 工具很多时如何选?
- 避免误触发
- 控制调用成本
4️⃣ Argument Generation & Validation(参数层)
作用
处理模型生成的参数。
包含
- JSON 解析
- 类型校验
- 必填字段检查
- 默认值填充
- 自动纠错
- 重试机制
解决的问题
- 参数缺失
- 类型错误
- 拼写错误
- 幻觉字段
这是第一道安全护栏。
5️⃣ Execution Control Layer(执行控制层)🔥最核心
这是框架真正的复杂度来源。
包含中间件链
1 | |
解决的问题
- 工具超时怎么办?
- API 失败怎么办?
- 防止重复执行
- 限制危险操作
- 记录谁调用了什么
- 控制成本
没有这层,就不是工程系统。
6️⃣ State Management(状态管理层)
Agent 不只是单步调用。
包含
- 当前任务状态
- 每步结果 artifacts
- 依赖关系
- 状态机(pending / running / failed)
解决的问题
- 多步任务如何串联?
- 第3步失败怎么办?
- 是否支持回滚?
- 是否支持并行?
很多人完全忽略这层。
7️⃣ Memory & Context Layer(记忆与上下文层)
工具调用必须结合上下文管理。
包含
- 短期记忆(会话)
- 长期记忆(向量库)
- 结果摘要
- 上下文裁剪
- Token 预算控制
解决的问题
- 上下文爆炸
- 结果过大
- 历史信息污染
- 记忆写入策略
工具调用和 RAG 在生产系统里是耦合的。
8️⃣ Grounding & Observation Layer(结果注入层)
工具执行完成后:
- 注入多少结果给模型?
- 注入摘要还是全文?
- 是否存储引用 ID?
- 如何防止 hallucination?
这是很多人忽视的一层。
9️⃣ Observability & Evaluation(可观测与评估层)
这是生产级加分项。
包含
- Trace(调用链)
- 延迟统计
- 成功率
- 成本统计
- 自动化测试场景
你可以把完整框架理解成这样:
1 | |
现在我们来逐层解析每层的内容。
首先我们讲解:
1. Tool Definition Layer(工具定义层)
这一层首先我们要定义一个基本的工具类。
这里我们采用一个pydantic的库进行参数校验。
采用pydantic的库的好处是
通过pydantic的库,我们可以定义工具的参数,不同的工具可以自动进行参数校验。
这个basemodel具有以下几个功能:
1. 类型检查:如果我们需要的参数是str,但是我们传入的参数是int,那么这个库会自动修正
2. 缺失报错,如果我们缺少了参数,那么这个库会报错,我们可以把错误传给ai,让ai重新生成调用工具的参数。
3. 他会根据这个工具我们定义的参数格式,自动将json的需求拼入prompt中
1 | |
3. 工具注册与边界层
这一层我们用一个代码完成工具的定义操作
我们实现
注册工具、找工具、列出所有的工具、检查工具是否存在
1 | |
2. Execution Control Layer(执行控制层)🔥
这一层我们首先限定工具的调用模式:
1 | |
通过这样两个类指定模型输出的结构化结构和工具执行的结构化结果,我们可以确保模型输出的工具调用是符合我们定义的格式的,同时也可以确保工具执行的结果是符合我们定义的格式的。
3. Execution Control Layer(执行控制层 / 中间件链)
执行层的主要目的是失败不会让系统崩、有重试策略、有退避策略、有 trace 可复盘。
通过这一串代码,我们可以优雅的实现,工具存在性校验、参数校验、超时等待、全程观测等功能。
1 | |
什么是大模型的工具调用框架?
https://norushcoder.com/2026/02/23/scheme-for-tool-calling-20260223/