跳转至

Tool Calling 可靠性

单元 23|难度:中级|前置:结构化输出、幂等、权限|目标:让模型只能提出受控操作,不能绕过后端边界

标准流程

用户请求
  → 模型选择工具并生成参数
  → Schema 解析
  → 身份与权限检查
  → 业务规则检查
  → 幂等检查
  → 执行工具
  → 保存结果
  → 把结果返回模型

模型不能承担的责任

模型可以建议调用什么工具,但不能成为最终安全边界。以下责任必须留在服务端:

  • 用户身份和租户隔离;
  • 工具白名单;
  • 参数类型与业务范围;
  • 速率、预算和并发限制;
  • 幂等;
  • 高风险操作审批;
  • 审计与脱敏。

Schema 校验仍然不够

下面的参数在类型上可能完全合法:

{
  "device_id": "device-42",
  "duration_seconds": 86400
}

但业务可能只允许重启操作最长持续 30 秒,或者当前用户根本无权操作该设备。因此需要:

JSON Schema / Pydantic
  + 业务规则
  + 权限策略

重试与幂等

如果工具已经成功,但网络响应丢失,Agent 可能再次调用。对会产生副作用的工具,应带稳定的 operation_id

{
  "operation_id": "task-123:create-ticket:incident-88",
  "device_id": "device-42"
}

重复请求返回第一次的执行结果,而不是创建第二张工单。

工具分类

类型 示例 默认策略
只读 查询设备、检索文档 权限、限流、脱敏
可逆写入 修改草稿、创建待审记录 幂等、审计、可撤销
外部副作用 发邮件、创建工单 幂等、确认、结果保存
高风险 删除数据、支付、控制设备 强审批、最小权限、沙箱/策略

最大步骤和停止条件

Agent 循环必须设置:

  • 最大工具调用次数;
  • 总执行时间;
  • 总 Token / 费用;
  • 连续失败次数;
  • 重复调用检测;
  • 明确的成功和失败终态。

“让模型自己判断什么时候停止”不能成为唯一保护。

自测

  1. Tool Schema 合法为什么仍需业务校验?
  2. 只读、外部副作用和高风险工具的策略有什么不同?
  3. operation_id 如何在模型重试时保持稳定?
  4. 为什么必须由程序设置停止条件?

完成标准

  • 能画出完整 Tool 执行链
  • 能为工具设计 Schema、权限和业务校验
  • 能设计稳定 operation_id
  • 完成 Tool 幂等实验

下一单元:RAG 检索链路