跳到主要内容

02-工具调用与权限模型

核对日期:2026-05-13。

不稳定项:工具调用协议、MCP 生态、浏览器/电脑操作能力、企业权限系统和模型结构化输出能力变化较快;真实工具接入前必须按目标 SDK 和安全策略复核。

1. 学习目标

本专题关注 Agent 的“手”:工具。工具设计决定 Agent 能做什么,也决定它能造成多大破坏。

学完后你应该能做到:

  • 设计包含权限、幂等性、错误码和审批规则的工具 schema。
  • 区分只读工具、草稿写入、低风险写入和高风险执行。
  • 明确模型建议调用与系统允许执行之间的边界。
  • 为工具调用设计审计、参数校验、速率限制和预算。
  • 识别工具描述模糊、权限过宽、返回污染等常见问题。

2. 工具不是普通 API

普通 API 文档给工程师看,Agent 工具 schema 给模型和系统共同使用。

一个合格工具定义要同时服务:

  • 模型:理解什么时候用、需要什么参数。
  • 系统:校验权限、参数、预算和审批。
  • 审计:知道谁在什么上下文中调用了什么。
  • 评测:判断工具选择和参数是否正确。

工具 schema 越模糊,模型越容易猜。

3. 工具 schema 模板

{
"name": "create_refund_draft",
"description": "创建退款申请草稿,不会直接退款。必须由人工审批后才能提交。",
"permission": "write_draft",
"risk_level": "medium",
"idempotent": true,
"requires_approval": true,
"side_effect": "draft_only",
"input_schema": {
"type": "object",
"required": ["order_id", "amount", "reason"],
"properties": {
"order_id": {"type": "string"},
"amount": {"type": "number", "minimum": 0},
"reason": {"type": "string", "maxLength": 200}
}
},
"output_schema": {
"type": "object",
"required": ["draft_id", "status"],
"properties": {
"draft_id": {"type": "string"},
"status": {"type": "string"}
}
},
"error_codes": ["PERMISSION_DENIED", "VALIDATION_ERROR", "ORDER_NOT_FOUND"],
"example": {
"order_id": "ord_123",
"amount": 99.0,
"reason": "用户反馈重复扣费,需要人工审核。"
}
}

关键字段:

  • permission:系统权限级别。
  • risk_level:风险等级。
  • idempotent:是否可安全重试。
  • requires_approval:是否需要人工确认。
  • side_effect:是否有外部副作用。

4. 权限分级

等级能力示例策略
L0无外部访问文本总结无需审批
L1公开只读Web 搜索、公开文档记录来源
L2内部只读CRM 查询、代码读取鉴权、脱敏
L3创建草稿工单草稿、退款草稿人工确认
L4低风险写入打标签、更新备注审计、可撤销
L5高风险写入付款、退款、删除、发邮件强审批、双人复核
L6执行环境shell、浏览器、数据库写入沙箱、最小权限、人工批准

模型可以提出“想调用什么工具”,但系统必须决定是否允许。

5. 参数校验

工具调用前必须校验:

  • 参数类型。
  • 必填字段。
  • 范围限制。
  • 字符串长度。
  • 枚举值。
  • 用户和资源归属。
  • 当前任务是否允许。
  • 是否超过预算。

示例:退款金额不能只由模型填写,还要由规则引擎校验订单金额、退款政策和用户归属。

6. 幂等性与副作用

自动重试前必须知道工具是否幂等。

类型示例重试策略
幂等只读查询订单可重试
幂等草稿用 idempotency key 创建草稿可有限重试
非幂等写入发送邮件、提交退款不自动重试
高风险执行删除、支付、生产变更人工审批

所有写操作都应支持:

  • idempotency key。
  • 审计日志。
  • 预览或 dry-run。
  • 回滚或撤销路径。

7. 工具返回设计

工具返回不应是一大段无结构文本。

推荐返回:

{
"ok": true,
"data": {},
"source": {
"system": "crm",
"record_id": "ord_123",
"updated_at": "2026-05-13"
},
"warnings": [],
"next_allowed_actions": ["create_refund_draft"]
}

好处:

  • 模型能理解结果。
  • 系统能做下一步限制。
  • trace 能记录来源。
  • eval 能判断工具是否成功。

8. MCP 与工具生态

MCP 或类似协议解决的是工具连接和上下文暴露方式,不自动解决安全。

接入时要问:

  • 工具发现是否可控。
  • 工具描述是否可信。
  • 谁授权工具访问。
  • 工具返回是否可能包含恶意指令。
  • 工具调用是否有审计。
  • 是否支持按用户和任务限制权限。

协议能让工具更容易接入,也会让错误工具更容易被暴露。连接越方便,治理越重要。

9. 工程案例

9.1 客服工单 Agent

工具:

  • read_ticket:L2,只读。
  • search_policy:L2,只读。
  • create_reply_draft:L3,草稿。
  • send_reply:L5,高风险外发,需要人工确认。

安全设计:

  • Agent 只能创建草稿。
  • 发送动作由固定 Workflow 执行。
  • 审批卡片展示证据、影响和撤销方式。

9.2 代码修改 Agent

工具:

  • search_files:L2。
  • read_file:L2。
  • edit_file:L4。
  • run_tests:L6 沙箱。
  • git_push:禁用或人工执行。

安全设计:

  • 限制工作目录。
  • 禁止读取密钥文件。
  • 测试命令沙箱执行。
  • diff 必须人工 review。

10. 常见反模式

反模式表现后果修正
工具描述含糊“处理订单”模型误用具体动词和边界
权限只写 Prompt让模型别越权不可靠系统鉴权
直接暴露高危 APIrefund/delete/send事故不可逆草稿和审批
返回大段文本噪声入上下文决策变差结构化返回
无错误码只有异常字符串无法恢复标准错误
无审计字段不知道谁调用无法追责trace 和 request id

11. 练习

为“退款申请 Agent”设计 4 个工具:

  • 查询订单。
  • 查询退款政策。
  • 创建退款草稿。
  • 提交审批请求。

每个工具写出权限等级、schema、错误码、是否幂等、是否需要审批和审计字段。

12. 验收题

  1. Agent 工具 schema 为什么不是普通 API 文档?
  2. 工具权限应该如何分级?
  3. 为什么写操作优先设计成草稿或申请单?
  4. 哪些工具可以自动重试,哪些不可以?
  5. 工具返回为什么要结构化?
  6. MCP 解决了什么问题,又没有解决什么问题?