大语言模型已经能在数秒内阅读大量日志、告警和链路追踪数据,但这不等于它已经具备独立处理生产事故的能力。将 LLM 引入 incident response 的关键,不是让它替值班工程师“修好一切”,而是让它承担信息密集、重复且容易遗漏的观察工作,同时把因果判断、变更决策和责任边界留在人类手中。
LLM 最擅长的是扩大观测面
一次事故往往不是没有数据,而是数据太多:多个服务的错误日志、指标突刺、发布记录、Trace,以及不同频道里的人工补充。人类值班工程师必须在有限时间内建立事件时间线,而模型可以快速完成几类高价值工作:
- 聚合相似错误,消除重复日志带来的噪声。
- 按时间窗口整理指标、部署和异常请求,生成初步时间线。
- 从 trace 中找出高延迟路径、共同下游依赖和失败请求属性。
- 将原始信号转换成可读摘要,并保留原始证据的链接或查询条件。
这类工作本质上是模式识别、检索和压缩。模型可以比人工更快地横向扫描大量信号,因此适合成为值班人员的“观测副驾驶”。
但摘要不能替代证据。一个可靠的事故助手应该明确区分“观测到的事实”“模型推断”和“尚待验证的问题”。例如,“10:14 后支付服务的 5xx 与 Redis 超时同时上升”是事实;“Redis 超时导致支付失败”则仍然只是待验证假设。
相关性不是根因
根因分析最容易被 LLM 的流畅表达误导。模型能够发现两个事件同时发生,却未必能证明其中一个事件导致另一个事件。
假设 10:00 发布了新版本,10:03 数据库连接耗尽,10:05 API 错误率上升。模型可能会自然地把发布描述为根因,但真实原因也可能是定时任务在 10:02 触发了连接风暴,发布只是恰好同时发生。
因此,事故响应中的 LLM 输出应该使用假设驱动的格式:
| 内容 | 应有表达 |
|---|---|
| 证据 | api-gateway 的 5xx 在 10:05 从 0.2% 升至 18% |
| 假设 | 新版本可能增加了每个请求的数据库连接数 |
| 验证动作 | 对比回滚后连接数;检查新旧版本的连接池指标 |
| 置信度 | 中等:时间相关,但缺少请求级证据 |
这种约束会迫使模型暴露推理边界,也让工程师可以直接选择下一个验证动作,而不是接受一段看似完整的事故结论。
把模型接入工作流,而不是直接接入生产权限
初期落地时,推荐把 LLM 放在只读、可审计的位置。它可以读取经过脱敏和范围控制的日志、指标摘要、trace 查询结果与部署事件,但不应直接拥有执行数据库命令、扩缩容、回滚或修改配置的权限。
可以为每次事故准备一个结构化上下文,并要求模型严格按固定格式返回。例如,下面的 Python 脚本模拟将事件数据交给内部模型网关。将 INCIDENT_LLM_URL 和认证方式替换为团队实际使用的服务;生产环境还应在发送前完成密钥、用户标识和请求体的脱敏。
import json
import os
import requests
incident_context = {
"incident_id": "inc-2025-031",
"service": "checkout-api",
"time_window": "2025-03-08T10:00:00Z/2025-03-08T10:20:00Z",
"alerts": [
"5xx rate exceeded 10% at 10:05 UTC",
"p99 latency exceeded 3s at 10:06 UTC"
],
"deployments": [
"checkout-api v2025.03.08.2 deployed at 10:00 UTC"
],
"evidence": [
"db_pool_active_connections: 42 -> 200 between 10:02 and 10:05",
"trace: 81% of failed requests timed out on POST /orders",
"log: 'connection pool exhausted' appears 2,341 times after 10:03"
]
}
prompt = f"""You are an incident-response assistant.
Use only the supplied evidence. Do not claim causation without a verification step.
Return valid JSON with these keys:
- facts: array of directly observed facts
- hypotheses: array of objects with hypothesis, confidence, evidence, verification
- immediate_actions: safe, reversible actions only
- unknowns: array of missing information
Incident data:
{json.dumps(incident_context, ensure_ascii=False)}
"""
response = requests.post(
os.environ["INCIDENT_LLM_URL"],
headers={"Authorization": f"Bearer {os.environ['INCIDENT_LLM_TOKEN']}"},
json={"model": "incident-assistant", "input": prompt},
timeout=30,
)
response.raise_for_status()
print(json.dumps(response.json(), ensure_ascii=False, indent=2))
调用前设置环境变量:
export INCIDENT_LLM_URL="https://llm-gateway.example.internal/v1/responses"
export INCIDENT_LLM_TOKEN="replace-with-short-lived-token"
python incident_assistant.py
这里最重要的不是模型名称,而是输出契约:事实、假设、验证动作和未知项必须分开。这样,模型即使判断错误,也更容易被人类审阅和纠正。
让人类能力不被自动化侵蚀
事故处理能力来自持续练习:读图、建模、提出反证、在风险下做决策。如果团队把告警归类、故障定位和事后复盘全部外包给模型,值班人员会逐渐失去理解系统的能力,最终在模型不可用或遇到新型故障时缺少判断基础。
更稳妥的做法是把 LLM 设计为训练和复盘工具:
- 在事故中,由值班工程师确认假设和执行操作,模型负责整理证据与记录时间线。
- 在复盘中,用模型生成待核对的事件摘要,而不是自动生成并直接发布结论。
- 在演练中,要求工程师先写出自己的诊断路径,再与模型建议对照,讨论遗漏的信号和错误假设。
- 为模型建议记录采纳率、误导案例和人工修正原因,持续调整提示词、数据范围与权限。
模型也应当被当作一个会失败的依赖来运行。需要为 LLM 网关设置超时、限流、审计日志和降级路径;当模型服务不可用时,原有的告警、仪表盘、Runbook 和人工协作流程必须仍然可用。
建议的采用顺序
不要从“自动修复生产事故”开始。一个低风险、可验证的推进顺序通常是:
- 先让模型生成只读的日志聚类和事故时间线,并由值班人员校验准确性。
- 再引入证据明确的假设与验证建议,要求模型标注置信度和未知信息。
- 把经人工确认的动作映射到现有 Runbook,例如生成回滚检查清单,而非直接执行回滚。
- 只有在动作可逆、影响范围有限、审计完整且有人工升级机制时,才考虑受控自动化。
LLM 在事故响应中的价值,来自它能把分散信号快速变成可检查的工作材料。保持证据链、限制权限、训练人类判断力,才能让这项能力真正缩短恢复时间,而不是为下一次事故制造更难解释的风险。