Tool Calling
工具调用 · Function Calling
模型根据工具描述生成结构化调用请求,再由应用执行真实函数并把结果返回给模型的机制。
用一个类比理解
像模型填写一张操作申请单:它负责选择工具和参数,真正执行的人仍是你的应用代码。这篇能帮你解决什么
带着目标读,读完可以验证
- 说清模型提出调用、应用验证执行和结果回传的分工
- 为一次工具调用定义参数、权限、失败与重复执行策略
它解决什么
- 让模型请求外部数据或确定性能力
- 将自然语言意图转换为结构化参数
它不是什么
- 模型不会直接执行函数
- 结构正确不代表参数合理或操作获授权
适合使用
- 模型需要查询外部数据或执行动作
- 参数能用明确 schema 表达
暂时别用
- 普通代码已知道该调用什么
- 目标无法形成清晰工具契约
常见失败方式
- 工具说明模糊
- 未验证参数
- 把高风险动作交给模型自动执行
从查询订单理解工具调用#
用户说“查一下订单到哪了”,模型本身并不拥有你的订单数据库。应用可以提供一个查询函数,模型提出调用请求,由应用执行查询。OpenAI 和 Google 的文档都明确区分了“提出调用”和“执行函数”。1 2
一次调用经过哪些步骤#
- 应用提供工具名称、用途和参数结构。
- 模型提出工具名与参数,也可能不调用工具或请求补充信息。
- 应用检查工具是否在允许列表中、参数是否合法、用户是否有权限。
- 应用执行查询,将结果或经过处理的错误回传。
- 模型据此回复,或提出下一次调用。1
教学示意,不是某个 API 的原始响应格式:
用户请求 → get_order_status({ order_id: "ORD-204" })
应用校验 → 查询数据库 → { status: "shipped" }
模型回复 → 根据查询结果说明订单已发货
工具契约要写清什么#
以下是本站的实现检查清单:
- 输入: 订单号是否必填?允许哪些格式?缺失时应询问,还是返回错误?
- 身份: 从可信登录会话获取用户身份,而不是让模型填写
user_id就算授权。 - 输出: 区分找到结果、没有结果、拒绝访问和暂时不可用,避免所有情况都返回空字符串。
- 副作用: 查询和修改是否分开?执行修改前需要什么确认?
- 重复: 超时之后是没有执行,还是执行了却没收到结果?有副作用的操作要考虑幂等,即同一请求重复提交不应重复产生业务效果。
为什么格式正确仍会失败#
模型可能选择了错误工具,也可能把“取消提醒”理解成“取消订单”。参数结构正确,只代表请求长得像一张合格表单,不能证明意图、事实和权限都正确。
一个可检查的日志应包含调用标识、工具名、参数校验结果、授权结果、执行状态和耗时。敏感参数需要按实际数据政策处理,不宜无差别写入日志。
工具调用和其他概念怎么分#
需要模型返回一份分类结果,通常关注 结构化输出;需要应用执行动作,关注工具调用。两者都可能使用结构化参数,但职责不同。
一次工具调用不自动构成 Agent。只有后续步骤由模型根据结果持续选择时,才涉及更完整的自主决策循环。MCP 则处理连接与能力交换,不能替代这里的执行与授权设计。
检验理解 · 教学情境
你会怎么判断?
模型生成了合法的工具参数:查询订单 ORD-204。该订单存在,但属于另一位用户。参数 Schema 校验通过后,应用可以直接返回订单信息吗?
想好后,展开参考答案
不可以。格式校验只说明编号的结构符合要求,不能证明当前用户拥有查询权限。应用必须使用可信的登录身份验证订单归属。用户身份不能由模型生成的参数替代,拒绝访问后也不应把订单详情作为错误信息返回。
可信来源
依据在哪里,能说明什么
正文中的编号链接对应下列资料。教学案例与操作建议由本站整理,不是原作者的实验结果或普遍保证。
Function calling
支持的结论:描述工具声明、模型提出调用、应用执行代码、回传结果和继续响应的调用流程。
适用边界:参数字段与调用方式依赖具体 API;工具描述不能替代应用的授权和业务校验。
资料核验于 2026-09-05返回正文 ↑Function calling with the Gemini API
支持的结论:明确函数执行由应用负责,模型负责提出函数名与参数,结果可回传给模型。
适用边界:SDK 可能包装自动执行流程,但执行责任没有因此转移给语言模型。
资料核验于 2026-09-05返回正文 ↑