告警风暴里的 Agent:为什么你的自动运维最后全变成了人工救火?
聊《一个运维项目改成 AI 流程后,最难的部分完全变了》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。
去年我们团队做了一个大胆的决定:把原本靠 Cron Job 和 Ansible 维护的基础设施自动化,全部替换为基于 LLM 的 AIOps Agent。初衷很简单,运维太累了,半夜三点被告警叫醒,打开 Grafana 一看是 CPU 飙升,手动 SSH 上去看日志、重启服务,这种重复劳动应该交给 AI。
结果上线第一个月,我们迎来了真正的“灾难”。不是系统挂了,而是 Agent 疯了。
它为了“恢复服务”,把正在写入核心数据库的主节点给重启了;它在没有确认权限的情况下,试图清理生产环境的 /tmp 目录,差点删掉关键配置文件。最后不得不紧急下线,全员通宵手动回滚。那次经历让我意识到:从传统运维转到大模型应用,最大的鸿沟不是 Prompt 写得够不够好,而是对“不确定性”的控制力。 很多工程师还在纠结如何让 Agent 更聪明,却忽略了在生产环境中,Agent 首先必须是一个“守规矩”的工具,而不是一个“有创造力”的艺术家。
目录
- 运维能力的迁移:从确定性脚本到概率性推理
- 日志分析:让模型听懂“人话”之外的系统语言
- 告警归因:从“是什么”到“为什么”
- 自动处置 Agent:权限是生死线,审批是最后一道墙
- 安全与审批:留痕比智能更重要
- 总结:从 Demo 到 Production 的最后一公里
运维能力的迁移:从确定性脚本到概率性推理

传统运维的核心是确定性。脚本执行 A,必然得到 B。如果出错,报错信息是固定的,处理逻辑也是固定的。
但 LLM 的本质是概率性的。你问它“为什么服务慢”,它可能分析出是网络延迟、数据库锁、还是代码 Bug。这种灵活性是巨大的优势,但也带来了巨大的风险。
我在复盘那个失败的 Agent 时,发现了一个根本性的认知偏差:我们把 Agent 当成了“执行者”,但它实际上应该是一个“分析者+建议者”,或者至少是一个“带有人工确认环节的执行者”。
在传统运维中,我们习惯写死规则(Rule-based),比如“CPU > 90% 持续 5 分钟则告警”。而在 AIOps 中,我们需要构建的是意图识别和工具调用的链条。这不仅仅是换个技术栈,而是思维模式的转变。你需要思考的不是“怎么实现这个功能”,而是“在什么边界内,它可以安全地尝试这个功能”。
日志分析:让模型听懂“人话”之外的系统语言

早期的 Agent 在处理日志时,直接把几千行的堆栈跟踪扔给模型,效果极差。LLM 虽然擅长理解自然语言,但对特定的格式(如 JSON 日志、复杂的 Java Stack Trace)并没有天然的敏感度,除非经过微调或良好的 Prompt 工程。
我们的改进方案是引入中间层过滤。在日志到达 Agent 之前,先通过一个简单的正则或轻量级模型提取关键错误码和时间戳,只将“异常片段”而非“全量日志”发送给 LLM。
例如,与其让 Agent 分析整个 Nginx access.log,不如让它分析最近 5 分钟内状态码为 502 的请求关联的用户行为序列。
# 错误做法:直接传递全量日志
def analyze_log_raw(log_content):
prompt = f"请分析以下日志并找出原因:\n{log_content}"
return llm.generate(prompt)
# 正确做法:预处理 + 上下文增强
def analyze_log_smart(log_entries, error_code="502"):
# 1. 过滤出相关错误
relevant_errors = [e for e in log_entries if e['status'] == error_code]
# 2. 提取关键上下文(前后各5条日志)
context_window = []
for err in relevant_errors:
index = log_entries.index(err)
window = log_entries[max(0, index-5):min(len(log_entries), index+6)]
context_window.extend(window)
# 3. 构造结构化 Prompt
prompt = """
你是一个资深 SRE。以下是 Nginx 访问日志中状态码为 {error_code} 的异常片段。
请分析这些请求的时间分布、上游响应时间以及可能的共同特征。
日志片段:
{context}
请以 JSON 格式返回:
- root_cause_hypothesis: 最可能的根因假设
- confidence_score: 0-1 之间的置信度
- recommended_action: 建议的人工排查步骤
""".format(error_code=error_code, context="\n".join(context_window))
return llm.generate_structured(prompt)
这段代码的关键在于上下文裁剪。LLM 的注意力机制是有限的,过多的噪音会导致模型“幻觉”,编造出不存在的错误模式。

告警归因:从“是什么”到“为什么”
告警泛滥是运维的痛点。Agent 的价值在这里体现得最明显:它能将分散的指标(CPU、内存、QPS、错误率)关联起来,进行多维度的归因分析。
但这需要 Agent 具备跨数据源查询的能力。我们不能只依赖日志,还要对接 Prometheus、ELK 甚至业务数据库。
在我的实践中,我发现单纯让 Agent “查看监控”是不够的。我们需要定义明确的归因图谱。例如,当“订单服务响应变慢”时,Agent 应该自动检查:
1. 该服务的依赖下游(DB、Redis)是否有延迟上升?
2. 同一时间段是否有新的代码发布?
3. 底层基础设施(K8s Node)是否有资源争用?
如果这三个维度都没有异常,那么问题可能在应用层代码或配置。这种结构化的思维链(Chain of Thought)比让模型自由发挥要可靠得多。
自动处置 Agent:权限是生死线,审批是最后一道墙
这是我最想强调的部分。之前的失败案例中,Agent 最大的问题是权限过大。
在生产环境中,任何自动化的写操作(Write Operation)都必须经过严格的权限隔离。我的原则是:Agent 只能读,或者只能执行预授权的、幂等的、可回滚的操作。
对于高风险操作(如重启服务、扩容、修改配置),Agent 不应该直接执行,而是生成一个“处置建议”,并通过 IM(钉钉/飞书/Slack)推送给值班人员,等待人工点击“确认执行”。
为了做到这一点,我们需要在 Agent 架构中嵌入一个策略引擎(Policy Engine),类似 OPA (Open Policy Agent)。
class SafetyGate:
def __init__(self):
# 定义允许自动执行的操作白名单
self.auto_allow_list = [
"restart_deployment_low_risk",
"clear_cache_redis",
"scale_up_horizontal"
]
def check_permission(self, action, resources, user_context):
"""
检查 Agent 是否有权限执行该动作
"""
# 1. 基础白名单检查
if action not in self.auto_allow_list:
return {"allowed": False, "reason": "Action requires manual approval"}
# 2. 资源环境检查(例如不能在生产库自动执行 drop table)
if resources.get('env') == 'production' and action.startswith('drop_'):
return {"allowed": False, "reason": "Destructive actions prohibited in production"}
# 3. 频率限制(防止 Agent 发疯)
if not self.rate_limiter.is_allowed(user_context['agent_id']):
return {"allowed": False, "reason": "Rate limit exceeded"}
return {"allowed": True, "action_plan": f"Execute {action} on {resources}"}
# 在实际 Agent 循环中调用
gate = SafetyGate()
result = gate.check_permission(action, resources, agent_metadata)
if result["allowed"]:
execute_action(result["action_plan"])
else:
send_alert_to_human(result["reason"], action, resources)
这个简单的网关逻辑,比我调试十遍 Prompt 都有效。它强制将决策权和执行权分离,这是 Agent 能够进入生产环境的前提。
安全与审批:留痕比智能更重要
很多团队忽视了可观测性中的“Agent 自身日志”。
当 Agent 做出一个错误决策时,如果没有完整的审计日志(Audit Log),你根本不知道它当时看到了什么、想了什么、为什么这么选。
我们需要记录:
1. 输入:Agent 收到的原始告警和上下文数据。
2. 推理过程:Agent 的内部思考步骤(如果有使用 CoT)。
3. 工具调用:它调用了哪些 API,参数是什么,返回值是什么。
4. 最终决策:执行了什么,或者建议了什么。
这些日志不仅要存入数据库,还要实时同步到监控大盘。一旦 Agent 的行为偏离预期(例如短时间内发起大量重启请求),监控系统应立即触发熔断,暂停 Agent 的所有自动执行权限,转为纯只读模式。
总结:从 Demo 到 Production 的最后一公里
运维转大模型,不是要去学怎么训练一个基座模型,而是要学会如何在一个充满不确定性的 AI 系统中,建立确定性的工程边界。
我见过太多 Demo 做得很好的 Agent,一到生产就崩盘。原因往往不是模型不够聪明,而是缺乏对权限、日志和异常兜底的敬畏之心。
如果你正准备入手 AIOps,请记住这三条血泪教训:
1. 不要相信模型的“诚实”:默认它会犯错,所以每次操作都要有确认环节或回滚机制。
2. 上下文越小越好:不要让模型面对海量的原始数据,先清洗、再聚合、最后喂给模型。
3. 审批流是必需品:在高危场景下,Human-in-the-loop 不是落后,而是最成熟的工程实践。
大模型不会取代运维工程师,但会用好 Agent 的运维工程师,一定会取代那些只会写脚本的运维。而这一切的前提,是你先学会怎么给这头“野兽”套上缰绳。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。





如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

更多推荐

所有评论(0)