第 1.6.4 节:为工具失败、越权和重复调用设计兜底与审计
工具失败、越权和重复调用只有拆成可执行步骤,才容易复核、排错和交接。完成本节后,你应该能够设计工具失败、越权和重复调用的角色权限、审批条件、审计记录和越权处理。
| 任务卡 | 内容 |
|---|---|
| 本节任务 | 为工具调用设计失败兜底和审计日志字段。 |
| 你会产出 | 一张“失败兜底表”和一张“审计日志字段表”。 |
| 使用场景 | 未登录、无权限、缺字段、工具超时、重复提交、高风险动作。 |
| 完成标准 | 每类失败都有系统处理方式、用户回答方式和日志记录字段。 |
工具调用最危险的不是失败,而是失败后让模型自由补答案。客服场景里,如果订单工具超时,Agent 不能说“你的订单明天送达”;如果退款审批失败,Agent 不能说“退款已完成”。
失败兜底要同时解决三个问题:
| 问题 | 要求 | 客服例子 |
|---|---|---|
| 系统怎么处理 | 重试、追问、拒绝、转人工、展示已有状态。 | 工具超时可有限重试,越权必须拒绝。 |
| 用户怎么感知 | 不泄露内部细节,但说明下一步。 | “当前订单系统暂时无响应,可以稍后重试或转人工。” |
| 日志怎么复盘 | 记录 trace_id、工具、状态、错误和处理结果。 | 复盘为什么没有创建工单或为什么进入审批。 |
审计日志不是把所有隐私数据复制一份。日志只记录复盘需要的摘要字段,不能记录 API Key、完整身份证号、完整地址等敏感原文。
实现步骤或决策流程
- 从前三节的工具清单里列出每个工具可能失败的情况。
- 把失败分成身份问题、权限问题、字段问题、业务规则问题、系统问题和重复提交。
- 为每类失败写系统处理:追问、拒绝、重试、转人工或展示已有状态。
- 写用户回答方式,确保模型不编造工具结果。
- 设计审计日志字段,能串起用户请求、工具调用、工具结果和最终回答。
- 把失败样例加入验收清单,不能只验成功路径。
可复制模板:失败兜底表
## 工具调用失败兜底表
| 工具名称 | 失败场景 | 系统处理方式 | 用户回答方式 | 是否转人工 | 需要记录的日志 |
| --- | --- | --- | --- | --- | --- |
| | | | | | |
可复制模板:审计日志字段表
## 工具调用审计日志字段表
| 日志字段 | 含义 | 来源 | 是否必填 | 脱敏要求 |
| --- | --- | --- | --- | --- |
| trace_id | 串联一次请求 | 系统生成 | 是 | 无 |
| | | | | |
示例填写
| 工具名称 | 失败场景 | 系统处理方式 | 用户回答方式 | 是否转人工 | 需要记录的日志 |
|---|---|---|---|---|---|
| query_order_status | 订单不属于当前用户 | 拒绝查询,记录越权尝试 | “该订单无法在当前账号下查询。” | 否 | trace_id、user_id、tool_name、NO_PERMISSION |
| query_order_status | 订单系统超时 | 有限重试一次,仍失败则提示稍后或转人工 | “订单系统暂时无响应,可以稍后重试或转人工。” | 可选 | trace_id、tool_name、TIMEOUT、retry_count |
| create_support_ticket | 重复提交 | 查询已有工单并返回状态 | “你已有进行中的工单,我为你展示当前进度。” | 否 | trace_id、dedupe_key、ticket_id、DUPLICATE_REQUEST |
| create_refund_review | 高风险动作缺少审批 | 阻断直接退款,转审批流程 | “我可以帮你提交退款审批,不能直接完成退款。” | 是 | trace_id、order_id、review_required、blocked_action |
新手自查清单
- 我有没有为每个工具准备成功以外的失败样例?
- 工具超时后,Agent 是否被禁止编造业务结果?
- 越权查询是否明确拒绝,而不是模糊提示?
- 重复提交是否能返回已有状态,而不是重复创建?
- 日志是否能串起 trace_id、工具名称、输入摘要、输出摘要和错误状态?
- 日志是否避免记录完整隐私资料和密钥?
本节交付物与面试讲法
本节交付物包括两张表:失败兜底表和审计日志字段表。合格标准是每个关键工具至少覆盖无权限、缺字段、超时、重复提交和高风险阻断。
面试时可以这样讲:
我会把工具失败当成正常路径设计,而不是只做成功演示。比如订单工具超时,系统可以有限重试,但模型不能编造订单状态;越权查询要拒绝并记录日志;重复创建工单要通过幂等键返回已有工单。所有工具调用都会记录 trace_id、工具名、执行状态、错误码和处理结果,方便排查和审计。