函数调用原理

从工具 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 个课程坐标,必须进入正文解释、交互观察或练习证据。

术语与状态合同

本页不变量是:每个工具结果都能追溯到唯一请求、已验证参数、策略判定和具体实现。任何“成功”结论都要保存以下证据:工具定义版本、调用 id、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别,不能把模型口头确认当作环境事实。

关键机制与可推翻实验

工具 schema 是 agent-computer interface

名称、描述、字段和示例共同影响模型是否选对工具。相似工具边界模糊时,模型即使能力足够也会稳定误选。

动手试:为两个相近搜索工具加入正反例,比较误选率。

模型生成请求,应用决定执行

tool-use block 只是带名称和参数的候选动作。应用必须在注册表中查找实现、校验参数和策略,再决定执行或拒绝。

动手试:构造未知名称、错类型和越权参数,确认三者都停在运行时。

工具结果要绑定调用标识

并发或多轮调用必须用稳定 id 把结果回送到正确请求。只按工具名关联会在重复调用时串线。

动手试:并发调用同一工具两次并乱序返回,确认观察仍各归其位。

错误也是结构化观察

超时、权限拒绝和业务失败应以受控结构回灌,让下一轮能改计划;堆栈、密钥和内部路径不得直接暴露给模型。

动手试:注入超时,检查模型看到错误类别和可恢复建议而非内部堆栈。

先预测,再操作三类证据

分步1 / 3

1. 模型与结构边界

在“函数调用原理”中先画出责任、数据或候选空间,再预测“把模型提出工具请求与运行时执行副作用严格分离”会在哪个节点改变结果。

函数调用原理、工具 schema、工具选择、参数对象、注册表分发、工具结果、调用标识、执行权限
可交互
一回合函数调用:模型只「请求」,真去执行的是外部运行时看工具清单 → 输出调用请求 → 外部执行 → 结果回灌 → 据此作答模型一侧(只动嘴)外部运行时(真动手)模型看工具清单有哪些工具能调输出调用请求get_weather(city="上海")我们真去执行运行那个 Python 函数把结果回灌「上海 26℃」塞回去模型据此作答「上海今天 26 度」

第 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、模型参数、校验结果、策略判定、执行时长、结果摘要与错误类别。

阅读导航

← 结构化输出 · ReAct 循环 →

资料与写作方式声明

本章以Building effective agents(站内九单元课程改编)权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…