函数调用原理
从工具 schema、模型请求、运行时分发到工具结果回灌,证明模型只提出调用而执行权属于应用。
学习目标
- 能解释“函数调用原理”如何把模型提出工具请求与运行时执行副作用严格分离
- 能区分工具 schema、工具请求、注册表、工具结果、调用标识,并指出它们在请求、状态或执行边界中的位置
- 能固定输入,沿以下证据定位首个分叉:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别
- 能注入“把模型生成的工具名拼进 eval,并把异常堆栈原样回传”,在同一预算和权限下完成故障、恢复与重放
来源、课程编排与适用边界
“函数调用原理”以Anthropic 公开全文《Building effective agents》为总纲,并用Anthropic《Building effective agents》核对本单元机制;工具与外部能力的角色再由MCP 官方规范交叉检查。
这不是一本具有“官方九章目录”的纸质书。平台把公开文章中的 augmented LLM、工作流、智能体、上下文和工具工程重组为 9 个教学单元;下列 72 个节点是站内课程地图,不冒充 Anthropic 原文目录。正文、代码、图表和练习均为独立教学重写,产品或模型版本变化时应重新验证。
本单元的八个课程坐标
- 函数调用原理:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 1 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 工具 schema:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 2 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 工具选择:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 3 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 参数对象:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 4 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 注册表分发:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 5 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 工具结果:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 6 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 调用标识:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 7 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 执行权限:作为“把模型提出工具请求与运行时执行副作用严格分离”的第 8 个课程坐标,必须进入正文解释、交互观察或练习证据。
术语与状态合同
↡工具 schema:向模型描述工具名称、用途和参数合同的结构;在“函数调用原理”中按以下证据核对:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。、↡工具请求:模型生成的候选工具名、参数与调用标识;在“函数调用原理”中按以下证据核对:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。、↡注册表:由允许名称映射到受控实现的确定性表;在“函数调用原理”中按以下证据核对:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。、↡工具结果:运行时执行后回灌给模型的结构化观察;在“函数调用原理”中按以下证据核对:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。、↡调用标识:把请求与异步或多轮结果唯一关联的 id;在“函数调用原理”中按以下证据核对:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。。
本页不变量是:每个工具结果都能追溯到唯一请求、已验证参数、策略判定和具体实现。任何“成功”结论都要保存以下证据:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别,不能把模型口头确认当作环境事实。
关键机制与可推翻实验
工具 schema 是 agent-computer interface
名称、描述、字段和示例共同影响模型是否选对工具。相似工具边界模糊时,模型即使能力足够也会稳定误选。
动手试:为两个相近搜索工具加入正反例,比较误选率。
模型生成请求,应用决定执行
tool-use block 只是带名称和参数的候选动作。应用必须在注册表中查找实现、校验参数和策略,再决定执行或拒绝。
动手试:构造未知名称、错类型和越权参数,确认三者都停在运行时。
工具结果要绑定调用标识
并发或多轮调用必须用稳定 id 把结果回送到正确请求。只按工具名关联会在重复调用时串线。
动手试:并发调用同一工具两次并乱序返回,确认观察仍各归其位。
错误也是结构化观察
超时、权限拒绝和业务失败应以受控结构回灌,让下一轮能改计划;堆栈、密钥和内部路径不得直接暴露给模型。
动手试:注入超时,检查模型看到错误类别和可恢复建议而非内部堆栈。
先预测,再操作三类证据
1. 模型与结构边界
在“函数调用原理”中先画出责任、数据或候选空间,再预测“把模型提出工具请求与运行时执行副作用严格分离”会在哪个节点改变结果。
第 1 / 5 步 · ① 模型先看到「工具清单」——屋里有哪些电话能打(每个工具带名字和说明)
函数调用一回合:看工具清单 → 输出请求 → 外部执行 → 结果回灌 → 据此作答。可暂停、单步、拖进度。
最小可运行实现
def dispatch(call, registry, policy):
tool = registry.get(call.name)
if tool is None:
return {"call_id": call.id, "ok": False, "error": "unknown_tool"}
args = tool.schema.validate(call.input)
policy.authorize(tool, args)
try:
return {"call_id": call.id, "ok": True, "value": tool.run(**args)}
except TimeoutError:
return {"call_id": call.id, "ok": False, "error": "timeout"}这段实现只负责暴露“把模型提出工具请求与运行时执行副作用严格分离”的最小合同。交付版本还要补齐超时、日志、权限、密钥隔离和可重复评测;缺少以下证据时,代码能运行也不代表本章结论成立:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
练习与答案
练习
问题 1:系统边界。 怎样用最小输入证明“每个工具结果都能追溯到唯一请求、已验证参数、策略判定和具体实现”?
问题 2:课程坐标。 函数调用原理、工具 schema、工具选择、参数对象、注册表分发、工具结果、调用标识、执行权限如何进入可操作验证?
问题 3:故障恢复。 怎样证明“把模型生成的工具名拼进 eval,并把异常堆栈原样回传”已经修复?
本章回顾
- “函数调用原理”的主问题是把模型提出工具请求与运行时执行副作用严格分离。
- 核心不变量是每个工具结果都能追溯到唯一请求、已验证参数、策略判定和具体实现。
- 首要反例是把模型生成的工具名拼进 eval,并把异常堆栈原样回传。
- 最小证据包包含工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 工具 schema
向模型描述工具名称、用途和参数合同的结构。在“函数调用原理”中必须能按以下证据重新定位:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
- 工具请求
模型生成的候选工具名、参数与调用标识。在“函数调用原理”中必须能按以下证据重新定位:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
- 注册表
由允许名称映射到受控实现的确定性表。在“函数调用原理”中必须能按以下证据重新定位:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
- 工具结果
运行时执行后回灌给模型的结构化观察。在“函数调用原理”中必须能按以下证据重新定位:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。
- 调用标识
把请求与异步或多轮结果唯一关联的 id。在“函数调用原理”中必须能按以下证据重新定位:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。