AI 学习笔记(二十三):LLM 事故证据留存与 Postmortem Action Tracking 最小实践
上一篇我们把自动止血、恢复流程和恢复验收门槛拆开了。
但线上事故真正走到收尾时,很多团队还会遇到另一个更麻烦的问题:
系统看起来恢复了,可真正能留下来的事故证据很少,复盘 action item 也没有被持续跟踪。
结果通常会变成这样:
- 当时谁切了哪个 fallback,几天后已经说不清
- 到底是
prompt、retrieval、tool还是provider出的问题,只能靠回忆拼 - 复盘会上列了很多 action item,但一周后没有 owner、没有截止时间、也没有验证结果
所以这篇继续生产运维主线,补上事故治理里很容易被忽略的一环:
把 incident evidence 和 postmortem action tracking 做成可持续执行的工程闭环。
先说结论:
- 事故证据不是“复盘时再去找”,而是事故发生时就要结构化留存
- postmortem action item 不应该只是一份会议纪要,而应该是一份可跟踪、可验收、可进入发布门禁的任务清单
- 如果没有证据包和 action register,团队通常只会记住情绪最强的部分,而记不住真正可复用的工程输入
1. 为什么“证据留存”和“复盘跟踪”必须独立设计
很多团队已经会做 incident response,也会开复盘会。
但真正落地时,问题经常出在两件事上:
证据分散
dashboard 截图在聊天记录里,trace 在 A 系统,prompt 版本在 B 系统,工具副作用日志又在 C 系统动作失焦
会议里说了 8 个 action item,但没人知道哪个是防再发,哪个只是临时修补
这就导致两个典型后果:
- 事故复盘更像“还原故事”,而不是“验证系统哪里失效”
- action item 只能写进文档,却进不了日常工程节奏
更稳的做法,是把事故收尾产物拆成两份:
1) Incident Evidence Package
回答的是:
- 事故什么时候开始、什么时候被发现、什么时候被止血
- 当时系统到底跑的是哪个模型、哪个 prompt、哪个检索配置、哪些工具
- 哪些坏样本、坏副作用、坏路径被真实观测到
2) Postmortem Action Register
回答的是:
- 哪些问题需要修
- 谁负责修
- 什么时候修完
- 修完以后靠什么证据证明它真的降低了风险
只有这两份东西同时存在,incident 才算从“处理完成”走向“工程沉淀完成”。
2. 最小事故证据包:至少保留 6 层信息
一个对 LLM 应用足够实用的最小 incident evidence package,建议至少包含下面 6 层:
1) 事故摘要层
最少要有:
incident_idseveritystart_timedetected_timemitigated_timeverified_timeimpact_summary
这层解决的是“这次事故到底是什么”。
2) 请求路径层
至少保留:
request_idtrace_idroutetenant / workspace / regionrelease_version
这层解决的是“受影响的是哪条路径、哪批请求、哪次发布”。
3) 模型与 prompt 层
对 LLM 系统来说,这是最容易丢、但又最关键的一层:
providermodelprompt_version或prompt_hashtemperature / top_p / max_tokensstructured_output_schema_versionfallback_used
没有这层,后面几乎无法判断是:
- 模型漂了
- prompt 改坏了
- schema 严格度变了
- fallback 路由把行为改了
4) 检索与上下文层
如果系统接了知识库、RAG 或工具编排,还要保留:
retrieval_index_versiondoc_ids / chunk_idsrerank_strategycontext_budgettool_search / mcp / plugin是否启用
很多“回答变差”的事故,本质并不在模型,而在这层。
5) 工具与副作用层
如果请求会调用工具、发消息、写工单、写数据库,这层必须单独留:
tool_callstool_arguments_hashwrite_side_effectsexternal_message_idsrollback_action
否则复盘只能停留在“模型好像做错了”,但说不清楚它到底错写了什么。
6) 止血与恢复层
这层记录的是事故过程中真正执行过的工程动作:
- 切了哪个 fallback
- 哪个高风险工具被关了
- 是否进入
readonly - 哪些 release / prompt rollout 被冻结
- 恢复验收用了哪些门槛
也就是说:
事故证据包不只是“问题证据”,还应该是“处理证据”。
下面是一份可以直接落盘成 json 或 yaml 的最小结构:
1 | incident_evidence: |
3. 前 30 分钟先固化什么证据
证据留存最怕的是“等开复盘会时再收集”。
因为很多关键信息在 30 分钟后已经开始漂移:
- dashboard 时间窗口滚过去了
- 新版本已经继续发布
- 热修复 prompt 覆盖了旧版本
- 工具副作用被人工回滚了
所以更稳的原则是:
事故进入 mitigating 后,先冻结易丢证据,再继续修。
建议前 30 分钟至少完成下面 5 件事:
1) 导出异常请求样本
至少保留:
- Top N 失败请求
- Top N 高延迟请求
- Top N 有副作用的请求
2) 固定模型与 prompt 快照
不要只记版本名,最好连配置一起冻结:
- 当前 provider / model
- prompt hash
- schema 版本
- tool allowlist
3) 固定检索上下文
如果系统依赖 RAG,要保留:
- 检索索引版本
- chunk id 列表
- rerank 参数
4) 固定副作用记录
例如:
- 发出的通知 ID
- 新建的工单 ID
- 写回数据库的记录 ID
5) 固定处理动作时间线
把“谁在什么时候做了什么”结构化下来:
- 谁冻结了发布
- 谁切了 fallback
- 谁关了高风险工具
- 谁确认了恢复验收通过
很多复盘之所以写成“当时大家感觉可能是……”,就是因为这个时间线没被留下来。
4. Postmortem Action Tracking:别再把 action item 写成散文
证据包解决的是“发生了什么”。
action tracking 解决的是“我们接下来到底要改什么”。
这里最常见的错误,是把 action item 写成下面这种样子:
- 优化一下监控
- 后续补充回滚策略
- 再看看工具权限问题
这种写法几乎不可执行。
一个可跟踪的 action item,至少要有下面 7 个字段:
idtypedetective/preventive/corrective/governanceproblem_statementownerdue_dateverificationstatus
其中 verification 很关键。
因为 action item 的目标不是“有人说做了”,而是“系统里真的多了一条防线”。
例如:
1 | postmortem_actions: |
4.1 先按类型拆,而不是按部门拆
一个很实用的拆法是:
corrective
修这次已经暴露出来的直接问题preventive
防止同类事故再发生detective
让下次更早发现governance
把规则接进权限、发布、审批、审计
这样比“前端 2 条、后端 3 条、平台 1 条”更容易判断优先级。
4.2 action item 要和证据包挂钩
每个 action item 最好都能指向一个明确证据:
- 哪个 trace 暴露了问题
- 哪个坏样本证明当前系统会出错
- 哪个副作用记录说明风险真实存在
否则 action item 很容易退化成“经验性优化”,优先级不断下滑。
4.3 高优 action item 要么入门禁,要么显式接受风险
对于 P1 / P2 事故里暴露出的高风险问题,不能停留在“排期中”。
更稳的做法只有两种:
- 接进发布门禁
- 显式写下风险接受说明
这能避免团队在下次发布时重复踩同一个坑。
5. 一段可直接接到服务层的最小实现示例
下面这段 Node.js 示例演示两件事:
- 把 incident snapshot 收敛成 evidence package
- 根据事故特征自动生成最小 action register
1 | function buildEvidencePackage(snapshot) { |
这段代码不追求复杂,重点是把两个产物分开:
evidence package回答“到底出了什么事”postmortem actions回答“后面要做什么改动”
6. 怎么把它接进发布门禁
如果 incident evidence 和 postmortem actions 最终没有进入日常发布流程,它们很快又会退化成一次性文档。
更实用的方式,是为 P1 / P2 事故补两条简单规则:
1) 没有证据包,不允许关闭 incident
至少要求:
- 有结构化时间线
- 有坏样本
- 有模型 / prompt / 检索 / 工具证据
2) 没有高优 action 的验证结果,不允许恢复高风险变更
例如:
- 高风险写工具暂不恢复自动执行
- 相关 prompt rollout 继续冻结
- 相关发布需要手动审批
可以先从一个很小的检查器开始:
1 | export function validatePostmortemReadiness(report) { |
这样一来,postmortem 就不只是“写完发群里”,而是真的进入系统约束。
7. 一周落地建议:先把证据结构和 action 模板定下来
如果你想一周内落地,建议按这个节奏推进:
Day 1
定义 incident evidence 的最小字段:时间线、trace、model、prompt、retrieval、tool side effectsDay 2
在 incident runbook 里加入“前 30 分钟证据冻结”步骤Day 3
固定 postmortem action 模板:type / owner / due_date / verification / statusDay 4
把高优 action 接进发布门禁或显式风险接受流程Day 5
用一次故障演练验证:团队能不能在 15 分钟内收齐证据包,能不能在复盘后一周内追到 action 落地证据
不要一开始就追求特别完整的平台。
先做到证据可留、动作可跟、验证可查,incident 治理质量就会明显提高。
总结
自动止血和恢复验收解决的是“系统先稳定下来”。
incident evidence 和 postmortem action tracking 解决的是“团队下次别再靠回忆救火”。
如果这周你只做一件事,我建议优先完成:
给每一次 P1 / P2 事故固定一个 evidence package 模板,再要求每个高优 action item 都带 owner、截止时间和验证方式。
这样复盘才会真正变成工程资产,而不是一篇情绪还原。