公司动态

告警风暴里的 Agent:为什么你的自动运维最后全变成了人工救火?

📅 2026/7/21 17:42:28
告警风暴里的 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_code502): # 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), index6)] context_window.extend(window) # 3. 构造结构化 Prompt prompt 你是一个资深 SRE。以下是 Nginx 访问日志中状态码为 {error_code} 的异常片段。 请分析这些请求的时间分布、上游响应时间以及可能的共同特征。 日志片段: {context} 请以 JSON 格式返回 - root_cause_hypothesis: 最可能的根因假设 - confidence_score: 0-1 之间的置信度 - recommended_action: 建议的人工排查步骤 .format(error_codeerror_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: fExecute {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大模型里的哪类内容。