选择一个可验证且有副作用边界的场景
教学项目选择“读取工单与服务目录,生成分诊建议,在人工批准后更新优先级并添加审计备注”。它比纯聊天更适合练习:有权威输入、有只读和写 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 能聊几轮。
再加入受控写操作
写 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 超时后,为什么不能直接重试写操作?
扩展判断:何时应该从只读建议升级为受控写操作?
资料与事实边界
以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。
- NIST:AI RMF Core — 持续风险治理、测量、非 AI 替代与停用机制
- NIST:Strengthening AI Agent Hijacking Evaluations — 不可信数据诱导 Agent 采取非预期行动的评测背景
- OpenTelemetry:Semantic Conventions 1.44.0 — 截至 2026-08 的 Trace、Metric、Event 统一语义