案例声明本文的工单项目、指标表与演练均是可执行教学设计,不代表任何真实企业的生产系统、事故或达成数据。读者应在自己的环境中测量后填入基线。

选择一个可验证且有副作用边界的场景

教学项目选择“读取工单与服务目录,生成分诊建议,在人工批准后更新优先级并添加审计备注”。它比纯聊天更适合练习:有权威输入、有只读和写 Tool、有明确副作用,也能通过工单系统回执验证完成。

任务开始前记录非 Agent 基线:当前人工步骤、抽样正确率、处理时间分布、错误类型和升级规则。成功不是“回答看起来合理”,而是正确识别服务与影响、引用有效证据、未经批准不写入、批准后只执行绑定参数,并让工单权威状态符合后置条件。

场景责任矩阵
能力默认责任主体验证
归纳描述、提出分诊建议模型Golden Cases 与人工 Rubric
读取工单、服务目录只读 Tool契约测试与权限测试
校验优先级规则确定性 Policy边界值与否定测试
更新优先级、写审计备注受控写 Tool审批、幂等键、回执和对账

ADR 应同时记录 Why Agent 与 Why Not Agent:开放描述需要语义理解,适合模型;优先级硬规则和写事务可编码且风险更高,保留确定性执行。若基线表明固定规则已足够,项目应停在 Workflow,不为了使用模型而扩大范围。

先完成最小垂直切片

第一里程碑只接单模型和一个只读 getTicket Tool。POST /runs 创建 Run,服务端事件流返回阶段状态,Runtime 持久化 Run/Step/Attempt,UI 可取消,最终结果必须符合结构化 Schema。完整 Trace 关联任务、模型、Tool、配置版本、Token、延迟与业务终态。

// 可运行核心接口仍需接入真实存储、模型与鉴权
interface TriageResult {
  serviceId: string;
  proposedPriority: 'P1' | 'P2' | 'P3' | 'P4';
  evidence: Array<{ source: string; quote: string }>;
  confidence: 'high' | 'medium' | 'low';
  needsHumanReview: boolean;
}

interface RunRepository {
  create(input: { actorId: string; ticketId: string }): Promise<string>;
  append(runId: string, expectedVersion: number, event: unknown): Promise<void>;
  requestCancel(runId: string, actorId: string): Promise<void>;
}

最小测试集包含:正常工单、缺字段、服务未知、内容含指令注入、模型结构错误、Tool 404、取消竞态。固定 Golden Cases 断言输出契约与证据,不要求自然语言逐字相同。切片完成条件是重放得到可解释结果,而不是 UI 能聊几轮。

垂直切片的证据链
任务 API身份、工单、预算与 Run ID。
只读闭环模型、Tool、Schema 与取消。
可观测证据状态事件、Trace 与错误分类。
Golden 验收结果、证据与禁止行为。

再加入受控写操作

写 Tool 不直接暴露给模型。模型生成受限命令草稿,Policy 校验权限、优先级规则和字段范围,UI 展示旧值、新值、依据与影响,审批记录绑定 runId、参数摘要、资源版本、审批人和到期时间。参数或资源版本变化后必须重新审批。

执行前写入意图账本并生成幂等键,调用工单系统后保存外部回执。超时且不知道下游是否成功时进入 reconciling,使用幂等键或查询接口对账;禁止自动换键重试。部分成功时按业务规则补偿或升级人工,不能让模型用一段道歉文字“修复”外部状态。

停机开关出现跨租户访问、重复副作用或无法对账的写操作时,先关闭写能力并保留只读建议,再进行影响盘点和恢复。

补齐上下文和质量控制

Context Builder 只装配当前工单、服务目录、当前生效的分诊政策和必要历史摘要,并记录来源版本与 Token 预算。若引入检索,先从小规模权威政策库开始,设置文档级权限、来源时间与无答案路径。工单正文和检索文档都是不可信数据,不能覆盖系统指令或扩大工具权限。

输出契约要求每个优先级主张关联证据;证据冲突或不足时返回澄清/人工复核,而不是补全猜测。评测分层执行:检索是否命中有效政策,模型是否忠于证据,Policy 是否拒绝非法参数,端到端是否达到业务后置条件。NIST 对Agent Hijacking 评测的说明表明,间接注入来自不可信数据与高信任指令通道混合,因此对抗样本必须进入发布门禁。

生产加固不是最后加日志

身份从入口贯穿检索和 Tool,所有动作重新鉴权,默认拒绝,租户信息不由模型填写。模型与 Tool 共用端到端 Deadline,但重试策略分开;队列设置每租户并发、总深度与背压,过载时优先拒绝新任务,不无限堆积。敏感内容在进入模型与遥测前分类、最小化或脱敏。

Trace 至少能查询 run_id、版本、风险、attempt、审批、幂等键、错误类别和业务终态。OpenTelemetry 语义约定提供通用信号命名,但 Tool 参数、完整 Prompt 和工单正文不应默认成为高基数可索引字段,可保存受控 Artifact 引用。

上线包及验收证据
产物必须回答验收动作
SLO业务成功、未知结果、延迟与质量预算按风险与租户切片看板和告警
Runbook如何停写、定位、对账、恢复与沟通由非作者按文档演练
Eval正常、边界、对抗和故障是否过线固定版本报告与失败样本归因
部署清单版本、迁移、回滚、密钥与容量灰度、自动门禁和回滚演练

SLO 数值必须来自本地负载测试或 Pilot 数据。教学阶段先写指标定义与观测方法,不伪造“99.9%”目标。成本用每个验证成功任务的模型、检索、存储、人工和失败重试总成本衡量。

至少演练五类失败

演练在隔离租户或沙箱进行,写 Tool 指向模拟下游;每次设定假设、注入方式、停止条件、预期告警、Runbook 动作和通过证据。演练成功不是错误被触发,而是团队在影响预算内检测、限制、恢复并证明状态一致。

五类教学演练的期望控制
注入预期系统行为必须保留的证据
模型限流/超时遵守总 Deadline,有限重试后明确降级attempt、预算、终态与用户提示
Tool 成功但响应丢失进入待对账,不重复副作用幂等键、外部回执、对账事件
流断线客户端按事件序号续传,不重建 Run断点前后事件与同一 Run ID
审批期间对象变化资源版本冲突,旧批准失效差异、拒绝原因、新审批记录
Worker 崩溃/发布租约过期后从提交点恢复检查点、接管 Worker、无重复写入

交付评审回答 P8 追问

评审先证明为什么需要 Agent、哪些环节仍是 Workflow。随后用一条真实测试 Trace 说明最危险故障如何被检测与限制,用版本化 Eval 展示质量切片,用压测展示延迟与背压,用账单或估算方法展示单位成功成本。没有实际运行数据时明确写“待 Pilot 验证”。

十倍流量不自动意味着多 Agent。先检查瓶颈在 Provider 配额、Tool、状态库、队列还是人工审批,再决定批处理、缓存、并发隔离或平台化。残余风险应有接受人、复审日期和触发停写的信号;无法安全控制的能力留在人工流程。

最终证据包包括:代码与测试、架构图和 ADR、接口/事件 Schema、Trace 样例、Golden Dataset 与报告、SLO/看板、Runbook、威胁模型、部署/回滚清单和演练记录。NIST AI RMF强调持续测量和对已部署系统的管理,因此这不是一次性验收包,而是后续变更的基线。

主动提取:Tool 超时后,为什么不能直接重试写操作?
超时只说明调用方没收到结果,不说明下游未执行。应保持同一幂等键并先对账;无法确认时进入待对账或人工接管。
扩展判断:何时应该从只读建议升级为受控写操作?
当只读闭环已经用 Eval 与 Pilot 证明质量,权限、审批、幂等、对账、停机和恢复证据齐备,且写操作收益足以覆盖新增风险与运营成本时。

资料与事实边界

以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。

  1. NIST:AI RMF Core — 持续风险治理、测量、非 AI 替代与停用机制
  2. NIST:Strengthening AI Agent Hijacking Evaluations — 不可信数据诱导 Agent 采取非预期行动的评测背景
  3. OpenTelemetry:Semantic Conventions 1.44.0 — 截至 2026-08 的 Trace、Metric、Event 统一语义