ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AIOps实战:大模型如何将告警风暴压缩为根因假设

AIOps实战:大模型如何将告警风暴压缩为根因假设 在运维圈子里待久了你会发现一个很有意思的现象监控系统越建越多告警却越来越难处理。十年前我们比的是谁能在故障发生后五分钟内定位到问题机器现在比的是谁能在用户投诉之前就把问题掐灭在萌芽状态。这个转变背后是Linux云计算环境规模膨胀带来的必然结果——当你的集群从几十台变成几千台从单机房变成多可用区传统靠人肉盯盘、靠经验翻日志的路子就彻底走不通了。AIOps和大模型的介入本质上不是为了炫技而是被规模逼出来的生存手段。我在这篇文章里想聊的就是怎么把可观测性数据和大模型的分析能力串成一条真正能用的链路让根因分析从“大海捞针”变成“按图索骥”。1. 从“告警风暴”到“信号降噪”可观测性数据的真实困境1.1 为什么你的监控大盘越看越心虚很多团队在建设可观测性体系时第一反应是“全都要”——指标要全、日志要全、链路要全。结果就是Prometheus里存了几百万个时间序列ELK集群每天吞掉几个TB的日志Jaeger的调用链采样率调到100%之后存储成本直接爆炸。但真正出故障的时候值班同学打开Grafana面对几十个Dashboard和上百个Panel第一反应往往是懵的。这不是因为数据不够恰恰是因为数据太多信噪比太低。我经历过一次典型的线上事故某个核心服务的P99延迟突然从80ms飙到2s告警平台在五分钟内推送了三百多条告警涉及网关、缓存、数据库连接池、容器CPU throttling等十几个维度。值班同学花了二十分钟才确认是某个下游服务的慢查询拖垮了整个调用链。这二十分钟里大模型完全可以帮我们做一件事把三百条告警压缩成三条根因假设并按置信度排序。这里的关键认知是可观测性数据的价值不在于“采集了多少”而在于“在故障时刻能多快提取出有效信号”。指标、日志、链路这三类数据各有各的脾气——指标擅长发现“异常发生了”日志擅长回答“异常是什么”链路擅长定位“异常在哪里”。但传统监控工具是割裂地看待这三者的而大模型的价值恰恰在于它能同时消化这三类非结构化信息并建立跨模态的关联。1.2 指标、日志、链路三者的“性格差异”与融合难点先说说指标。Prometheus的指标数据是典型的时间序列特点是结构化程度高、查询速度快但维度爆炸问题严重。一个简单的HTTP请求指标如果带上method、path、status、instance、job等标签基数轻松破万。当你试图用传统阈值告警去覆盖所有维度时要么漏报要么误报。我见过最夸张的案例是某个团队给每个API路径都配了独立的延迟阈值结果维护成本高到没人愿意改最后所有阈值都形同虚设。日志的问题正好相反。日志是非结构化的文本流信息密度极高但检索效率极低。你用grep去捞一个错误堆栈可能要在几十GB的日志里翻半天。更麻烦的是不同服务的日志格式千奇百怪有的用JSON有的用纯文本有的把关键信息藏在异常堆栈的第五层。大模型在这里的切入点很明确把非结构化日志转成结构化事件再和指标、链路做关联。比如从日志里提取出“数据库连接超时”这个事件然后自动去查同一时间窗口内数据库连接池的指标曲线再顺着链路找到调用这个数据库的上游服务。链路数据的难点在于采样和上下文传递。全量采集不现实但采样率太低又会导致关键故障链路丢失。而且链路数据天然是分布式的一个请求可能跨越几十个服务每个服务都有自己的span。大模型要做根因分析就必须能把这些分散的span重新组装成完整的调用拓扑并识别出哪个span是“异常源头”而不是“异常受害者”。注意很多团队在融合这三类数据时习惯性地先做数据清洗和归一化结果把大量有价值的上下文信息洗掉了。我的建议是保留原始数据的“粗糙感”让大模型去消化这些噪声而不是用规则引擎提前过滤。1.3 一个真实的降噪场景把300条告警压成3条根因假设回到前面那个延迟飙升的案例。如果引入大模型做告警降噪整个处理流程可以拆成四步。第一步是告警聚类把同一时间窗口内、涉及同一服务或同一依赖的告警归为一组。第二步是拓扑关联根据服务依赖关系图判断哪些告警是上游、哪些是下游。第三步是时序对齐检查告警的触发时间顺序通常根因告警会早于症状告警。第四步是根因假设生成大模型根据聚类结果、拓扑位置和时序关系输出几个可能的根因方向并给出每个方向的置信度和验证建议。实测下来这套流程能把三百条告警压缩到三到五条根因假设值班同学的定位时间从二十分钟缩短到三到五分钟。但这里有个坑大模型的输出必须附带“证据链”也就是它为什么认为这个告警是根因。如果只是给一个结论运维同学是不敢信的。所以我们在设计提示词时强制要求模型输出“判断依据”和“待验证项”比如“怀疑是数据库连接池耗尽建议检查连接池活跃连接数和等待队列长度”。2. 大模型在AIOps中的角色定位它不是“万能分析师”2.1 大模型擅长什么、不擅长什么很多人对大模型在运维场景的期待是“输入一个告警输出一个修复方案”。这个期待本身就不现实。大模型的长处在于模式识别、语义理解和跨模态关联短处在于精确计算、实时状态查询和因果推断。换句话说它适合做“侦探”不适合做“法官”。具体来说大模型能做的事包括从日志文本中提取异常模式、把自然语言描述的故障现象转成可查询的指标表达式、根据历史故障报告推荐排查路径、把多个孤立告警串成一个故事线。它做不了的事包括精确计算P99延迟、实时查询当前CPU使用率、判断某个配置变更是否真的导致了故障。这些事必须交给传统的监控工具和规则引擎。所以正确的架构是大模型做编排和推理传统工具做执行和验证。大模型输出一个排查计划比如“先查A服务的错误日志再查B数据库的连接数指标最后对比C配置的变更记录”然后由自动化工具去执行这些查询把结果返回给大模型做进一步分析。这个循环可以迭代多轮直到根因收敛。2.2 提示词工程在运维场景的特殊性运维场景的提示词和通用对话场景完全不同。通用场景下你希望模型“自由发挥”运维场景下你希望模型“严格遵循证据”。我总结了几条在运维提示词设计中必须遵守的原则。第一条是强制引用数据源。提示词里必须明确告诉模型“你的所有结论必须基于以下提供的数据不得引入外部知识。”这条规则能大幅降低模型“幻觉”导致的误判。第二条是输出结构化。要求模型以JSON格式输出根因假设、置信度、证据链和验证步骤方便后续自动化处理。第三条是限制推理深度。运维故障排查讲究“快速收敛”不能让模型无限递归地分析下去。通常设置最多三轮迭代每轮必须给出“当前最可能的根因”和“下一步验证动作”。我试过用不同的提示词模板去处理同一批告警数据发现一个反直觉的结论提示词越“详细”模型表现越差。当你把几十条规则塞进系统提示词时模型反而会忽略关键信息。后来我改成“核心规则不超过五条其余通过示例来传达”效果明显提升。比如与其写“你要考虑时序关系、拓扑关系、告警级别”不如直接给一个“根因告警通常比症状告警早30秒到2分钟”的示例。2.3 大模型与传统规则引擎的协作边界规则引擎并没有过时只是角色变了。以前规则引擎是“主力”负责所有告警的触发和分类现在规则引擎是“守门员”负责过滤掉明显不需要大模型介入的告警。比如磁盘使用率超过90%这种确定性极高的告警直接走自动化清理流程就行没必要惊动大模型。而像“服务延迟升高但所有基础指标正常”这种模糊场景才需要大模型来做深度分析。我通常建议团队按“确定性”和“影响面”两个维度来划分处理策略。确定性高、影响面小的告警走规则引擎自动处理确定性低、影响面大的告警走大模型分析加人工确认确定性高、影响面大的告警走规则引擎触发预案加人工同步。这个分类不是静态的需要根据历史处理数据定期调整。告警类型确定性影响面处理策略磁盘使用率超阈值高小规则引擎自动清理服务P99延迟突增低大大模型分析人工确认数据库连接池耗尽高大规则引擎触发预案人工同步日志中出现新异常类型低中大模型提取模式人工归档3. 搭建智能根因分析链路的实操路径3.1 数据管道的设计从采集到向量化要让大模型做根因分析第一步是把可观测性数据喂给它。但大模型的上下文窗口有限不可能把几TB的日志全塞进去。所以需要一个“数据管道”来做预处理和筛选。这个管道的设计直接决定了整个系统的上限。我的做法是分三层。第一层是采集层用Prometheus采集指标、用Fluent Bit采集日志、用OpenTelemetry采集链路。这一层的关键是统一时间戳和标签体系确保三类数据能在同一时间轴上对齐。第二层是预处理层对日志做结构化解析提取出时间、服务名、错误码、异常类型等字段对指标做降采样和异常检测只保留异常时间窗口的数据对链路做拓扑重建生成服务依赖图。第三层是向量化层把结构化的日志事件、指标异常描述、链路拓扑关系转成文本描述再通过嵌入模型转成向量存入向量数据库。这里有个容易忽略的细节时间窗口的选择。窗口太短可能漏掉根因窗口太长噪声太多。我的经验值是“故障发生前5分钟到故障发生后2分钟”这个窗口通常能覆盖根因的潜伏期和爆发期。另外窗口不是固定不变的对于慢查询类故障窗口要拉长到15分钟对于网络抖动类故障窗口可以缩短到1分钟。3.2 检索增强生成在故障排查中的落地方式RAG检索增强生成在运维场景的落地核心是“用历史故障报告和运维知识库来增强大模型的判断能力”。具体来说当新故障发生时系统先把当前故障的特征服务名、错误类型、指标异常模式转成查询向量去向量数据库里检索相似的历史故障案例。然后把检索到的案例作为上下文和当前故障数据一起喂给大模型让模型参考历史处理经验来生成根因假设。这个过程中检索的准确性比生成的质量更重要。如果检索出来的历史案例和当前故障不相关大模型就会被带偏。我试过用纯向量检索发现对于运维场景效果一般因为运维故障的相似性往往体现在“拓扑位置”和“时序模式”上而不是文本语义上。后来改成“向量检索标签过滤”的混合策略先用服务名、错误码等硬标签做粗筛再用向量相似度做精排准确率提升了不少。还有一个坑是历史故障报告的质量参差不齐。很多团队的故障报告是事后补的信息不全甚至有些是“甩锅报告”。用这种数据去训练或检索只会让大模型学会推卸责任。所以我在落地时坚持一条原则只把经过复盘确认的故障报告纳入知识库并且要求报告里必须包含“根因”“修复动作”“验证方式”三个字段。3.3 从“根因假设”到“验证闭环”的自动化大模型给出根因假设之后如果不做验证那和算命没区别。验证闭环的设计是整个链路里技术含量最高的部分。我的做法是给每个根因假设配一个“验证脚本”这个脚本可以是PromQL查询、LogQL查询、或者一个简单的Shell命令。大模型在输出假设的同时也输出对应的验证脚本。然后由自动化引擎去执行这些脚本把结果返回给大模型做二次判断。举个例子大模型怀疑“数据库连接池耗尽导致服务延迟”它会输出一个验证脚本查询连接池活跃连接数和等待队列长度的PromQL。自动化引擎执行后返回“活跃连接数已达上限等待队列长度持续增长”大模型就能确认这个根因并进一步建议“扩容连接池或优化慢查询”。如果返回“连接池正常”大模型就需要重新生成假设。这个闭环的关键是验证脚本的可靠性。我见过太多因为PromQL写错导致验证结果误判的案例。所以我在设计时加了一层“脚本审核”——所有由大模型生成的验证脚本必须先在一个沙箱环境里跑一遍确认语法正确、返回结果格式符合预期才能进入正式验证流程。这听起来麻烦但比起误判导致的故障扩大这点开销完全值得。4. 落地过程中踩过的坑与应对策略4.1 大模型“幻觉”在运维场景的破坏力通用场景下大模型胡说八道顶多让人笑一笑运维场景下大模型胡说八道可能导致误操作甚至引发二次故障。我遇到过最危险的一次是模型建议“重启数据库主节点”来解决连接池问题幸好当时值班同学经验丰富没有直接执行。后来复盘发现模型之所以给出这个建议是因为它在训练数据里见过太多“重启解决一切”的案例但完全没有考虑当前数据库是主从架构重启主节点会导致主从切换和短暂不可用。应对幻觉的策略有三条。第一是限制模型的行动空间明确告诉它“你只能输出查询类操作不能输出变更类操作”。第二是强制证据引用要求模型在给出每个结论时必须引用具体的数据点或日志行。第三是人工确认门槛对于影响面大的操作建议必须经过人工确认才能执行。这三条策略叠加使用后幻觉导致的误判率大幅下降。4.2 数据延迟与模型推理延迟的叠加效应可观测性数据本身就有延迟——Prometheus的采集间隔通常是15秒到1分钟日志从产生到可检索通常有5到30秒的延迟链路数据的延迟更高。而大模型的推理也需要时间尤其是当上下文很长的时候一次推理可能要几秒到几十秒。这两个延迟叠加起来可能导致根因分析的结果“过时”。我做过一次实测从故障发生到根因假设输出整个链路耗时约90秒。其中数据采集延迟占30秒数据预处理占20秒向量检索占10秒大模型推理占30秒。对于大多数故障来说90秒是可以接受的但对于那种“秒级雪崩”的故障90秒可能已经造成大面积影响了。优化方向有两个。一是边缘计算在数据采集端就做初步的异常检测和告警聚类只把疑似根因的数据上传到中心做深度分析。二是模型轻量化对于常见的故障模式用一个小的分类模型做快速判断只有小模型无法确定时才调用大模型。我试过用蒸馏后的小模型处理“磁盘满”“内存泄漏”这类高频故障推理时间从30秒降到2秒效果基本持平。4.3 团队协作模式的调整从“值班”到“人机协同”技术落地从来不是最难的部分最难的是让团队接受新的工作模式。以前值班同学的工作是“看告警、查日志、定位问题”现在变成了“审核大模型的根因假设、执行验证脚本、确认修复方案”。这个转变对值班同学的能力要求其实更高了——你需要能判断大模型的假设是否合理需要能看懂验证脚本的逻辑需要能在模型给出错误建议时及时纠正。我在团队里推行了一套“人机协同”的值班规范。第一所有大模型输出的根因假设必须经过值班同学确认才能进入验证流程。第二验证脚本的执行结果必须由值班同学解读不能直接采信模型的二次判断。第三每次故障处理结束后值班同学需要给大模型的表现在评分低分案例会被纳入提示词优化的训练集。这套规范运行了三个月后团队对大模型的信任度明显提升但同时也保持了必要的警惕。提示不要试图用大模型完全替代值班同学至少在现阶段人机协同是唯一可行的模式。大模型负责“快速缩小范围”人负责“最终判断和决策”。5. 面向未来的技术演进与个人学习路径5.1 多模态大模型在运维场景的潜在应用现在的运维大模型主要处理文本数据但运维场景里还有大量非文本信息——Grafana的曲线图、火焰图的调用栈、网络拓扑的可视化。多模态大模型的出现让“直接看图诊断故障”成为可能。比如把Grafana的异常曲线截图喂给多模态模型让它判断是“周期性抖动”还是“突发尖刺”是“缓慢爬升”还是“断崖下跌”。不同类型的曲线形态对应不同的根因方向这个判断过程以前依赖人的经验现在可以交给模型。我试过用多模态模型分析火焰图效果出乎意料地好。模型能识别出“哪个调用栈分支最宽”“哪个函数的耗时占比最高”并给出“建议优先优化这个函数”的结论。虽然还不能完全替代人工分析但作为辅助工具已经很有价值了。不过多模态模型的推理成本比纯文本模型高不少目前还只适合在关键故障上使用。5.2 从“被动响应”到“主动预测”的演进方向现在的AIOps大模型主要做“故障发生后”的根因分析但更有价值的方向是“故障发生前”的预测。这需要模型能识别出故障的“前兆模式”——比如内存泄漏在爆发前通常表现为“可用内存缓慢下降但GC频率不变”磁盘满在爆发前通常表现为“写入延迟逐渐升高但吞吐量不变”。这些前兆模式很难用固定阈值捕捉但大模型可以通过学习历史故障数据来识别。我目前在做的一个实验是用历史故障发生前30分钟的可观测性数据训练一个预测模型让它输出“未来30分钟内发生故障的概率”。初步结果是对于“资源耗尽型”故障预测准确率能达到70%左右对于“突发流量型”故障准确率只有40%左右。虽然还不够完美但已经能帮团队提前做一些准备了比如提前扩容、提前清理磁盘。5.3 给运维工程师的学习建议哪些技能值得投入如果你是一名运维工程师想往AIOps和大模型方向转型我的建议是不要急着去学大模型微调。微调是算法工程师的活运维工程师的核心竞争力在于“对系统行为的深刻理解”和“对故障模式的敏锐直觉”。这些能力是大模型替代不了的也是你设计提示词、构建知识库、判断模型输出是否合理的基础。具体的学习路径我建议分三步走。第一步是夯实可观测性基础把Prometheus、OpenTelemetry、ELK这套东西玩熟理解指标、日志、链路三类数据的特性和局限。第二步是学习提示词工程和RAG这是运维工程师能直接上手大模型的最短路径不需要深厚的数学背景但需要对运维场景有深刻理解。第三步是了解大模型的推理机制和局限知道它为什么会产生幻觉、为什么上下文长度有限制、为什么推理有延迟这些认知能帮你在设计系统时做出正确的取舍。至于编程语言Python是必须的因为大多数大模型工具链都是Python生态。但不需要学到算法工程师的程度能写数据预处理脚本、能调API、能搭简单的RAG流程就够了。Shell和PromQL更是基本功这些才是你日常工作中最高频使用的工具。我在实际落地这套方案的过程中最大的体会是大模型不是来抢运维饭碗的它是来把运维从重复劳动中解放出来的。以前值班同学80%的时间花在“确认告警是不是误报”和“翻日志找错误”上现在这些活可以交给大模型值班同学可以把精力放在“优化系统架构”和“设计更可靠的预案”上。这个转变对个人来说意味着更大的成长空间对团队来说意味着更高的运维质量。如果你还在犹豫要不要拥抱这个变化我的建议是先从一个小场景开始试比如用大模型做告警降噪跑通了再逐步扩展。踩几个坑没关系关键是别站在原地不动。
返回列表