ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AIOps大模型落地实践:云原生底座与智能运维的完整拆解

AIOps大模型落地实践:云原生底座与智能运维的完整拆解

这两年我接触过不少运维团队,聊完之后发现一个很有意思的现象:提起AIOps大模型,大家都很兴奋,但说到“到底让大模型替我们干哪一件事”,很多人又沉默了。我最近主导了一个“Linux云计算 + AIOps大模型”的一体化落地项目,从云原生基础设施搭建到智能告警、根因分析、ChatOps自然语言查询,整套流程从选型到上线走下来用了大概两个月。今天把整套“云原生底座+智能大脑”的工程实践完整拆开来讲,适合正在做运维平台改造、想用开源大模型替代重复排障操作、以及准备给团队引入智能运维工具的人参考。先说一句过来人的忠告:别急着调模型,先把底层的指标、日志、链路数据弄扎实,后面所有“智能”才有根。

1. 一体化方案的思路拆解:为什么“底座”和“大脑”必须一起做

1.1 传统云运维的三大顽疾

做运维的人应该都懂这几件事。第一是告警风暴。一台机器抖动,监控系统能把关联的所有业务告警全部拉出来,页面瞬间刷出几十上百条,实际上背后可能只有两三个根因。值班同学凌晨三点看完一堆告警,还是不知道先处理哪个。第二是排障靠猜。告警只说“服务503”,但具体是后端过载、数据库连接池耗尽、还是前一天晚上上线带了脏配置,需要人登录服务器一台一台排查,一个老手可能半小时定位,新手干到天亮也未必有结论。第三是知识沉淀难。每次排障的经验都留在个人脑子里,要么写在内部聊天群,要么压根没写。人走经验走,下一个人遇到同类问题重新踩坑。

这三件事恰好是AIOps大模型最擅长介入的:告警太多需要压缩归纳,排障过程需要快速判断方向,历史经验需要变成可检索的知识。但要注意,大模型不能凭空产生数据。它再聪明,如果底层连“哪个Pod挂了”“日志里报了什么错”“最近一次变更是什么时候”这些信息都没采集到,就只能胡说。所以一体化工程必须先把云原生基础设施的可观测性底座打好,把数据喂给大模型,这件事才有意义。

1.2 大模型能做什么,不能做什么

我见过不少人把大模型当成什么都懂的“神仙”,上去就问“为什么我的系统挂了”。大模型确实能回答,但如果没给它上下文,它回答得越流畅越是灾难,因为你没法分辨哪些是真正有用的,哪些是基于通用知识的“合理猜测”。在运维场景里,大模型更适合做的是根据系统提供的实时数据做归纳推理。

具体来说,能做的事情包括:把一堆散乱的告警归类成几个根因方向;结合日志片段和监控数据,输出“最可能的故障原因+建议验证命令”;把运维人员的自然语言提问翻译成可执行的监控查询语句;根据排障过程自动生成结构化报告。办不到的事情也很多:它无法替你去修复配置,无法保证百分百准确,更无法在数据缺失时无中生有。所以我把整个方案的定位定成“辅助决策+效率提升”,而不是“无人值守”。

1.3 技术栈整体选型与理由

这套一体化工程的技术栈,我的核心选型原则是:社区成熟、国产友好、硬件门槛低。基础设施层用Kubernetes承载业务,Prometheus采集指标,Loki收集日志,OpenTelemetry做链路追踪。智能层用Qwen和DeepSeek系列开源大模型,部署工具用Ollama和Dify,向量检索用Milvus,数据落库用PostgreSQL。有人问为什么不用商业大模型API,原因很简单:运维数据涉及业务内部信息,很多企业不允许出内网。私有化部署开源模型是目前合规和安全上最稳妥的选择。

模型选型上我做了一个对比测试,把Qwen2.5-7B、DeepSeek-R1-Distill-Qwen-7B、Llama3.1-8B三个模型在同样的运维提示词上跑了一遍。结论是:中文运维术语的理解上Qwen系列明显占优,推理链条展示上DeepSeek的蒸馏模型更好,Llama3.1则更合适作为日志分类这种结构化任务的底座。详细对比我会放到后面的章节展开。

2. 云原生基础设施搭建:把可观测性数据底座打牢

2.1 基础设施组件部署清单与配置

我建议组件全部以容器方式部署在Kubernetes集群里,版本关系必须先理清。我这里用的是Kubernetes 1.29集群,Prometheus部署的是2.50版本,Loki 3.0版本,Grafana 10.4版本。版本尽量锁新不锁旧,但也不要追最新,尤其是Loki,3.x的存储方式和2.x差别挺大,网上很多教程基于旧版本照着敲会出各种奇怪问题。

部署顺序上有个讲究:先装存储,再装监控,最后接日志。Prometheus我用的Helm方式装到monitoring命名空间,关闭了默认自带的告警规则,改用自定义规则。为什么关闭默认规则?因为自带的规则在容器环境下误报率很高,比如依赖的接口路径变了、二进制升级改名了,规则还按旧路径探测,天天报“target down”,实际上服务好端端的。Loki单独部署在logging命名空间,用对象存储做长期持久化,近7天的日志保留在本地磁盘,这是成本和查询性能的折中选择。

2.2 指标采集的三个关键设计

Prometheus采集指标,听起来简单,但设计不好后面在大模型分析阶段就会遭到反噬。第一点是采集频率,默认15秒拉一次在大多数场景够用,但如果要做故障复盘,数据粒度越细越容易定位到秒级问题。我最后把核心业务指标调成10秒,辅助指标保持30秒,避免频繁采集对业务容器造成额外开销。第二点是标签设计。标签要等于“检索索引”,设计得越合理,后续按条件聚合越方便。我的原则是:尽量统一使用job、instance、namespace、pod、app这五个基础标签,不要给每个指标的标签加动态值,否则指标基数爆炸,Prometheus内存分分钟被吃满。

第三点是长期存储。默认的本地存储只能留几个月数据,对大模型做根因分析需要的“历史基线”来说远远不够。我引入了Thanos做对象存储归档,把历史数据压缩到对象存储,查询时自动合并。这里要提醒的是,Thanos的sidecar上传方式和Prometheus的远程写是两种不同思路,别混用。我一个项目里刚开始改了prometheus.yml加远程写,又开了sidecar,结果同一份数据被传了两份,查询结果翻倍,排查了一晚上才定位到问题。

2.3 日志数据标准化:喂给大模型之前的“食材处理”

日志采集我用的是Promtail直接对接Loki。Promtail的安装配置不复杂,但有一个坑:采集对象的选择。容器日志在宿主机上路径是/var/log/containers/*.log,通过管道和Kubernetes API配合,可以自动拿到Pod名字和命名空间。落库时我会在日志行里统一加入app、namespace、pod、container字段,这样以后查询“某个Pod最近一小时的报错日志”就变成一条PromQL类似查询,几秒钟出结果。

标准化这一步很多人会忽略,我单独说一下。原始容器日志千奇百怪,有的应用写多行JSON,有的应用只写一行纯文本,有的时间戳格式还不一样。大模型对时间混乱的日志非常头疼,它会把它当成两条不同事件去推理,结果结论完全错。所以我做了一个清洗管道:先用正则把每条日志的时间戳统一成RFC3339格式,再按log_level字段把INFO、WARN、ERROR区分出来,最后把多余的空格压缩掉。这样喂给大模型的日志就是干净规整的数据,推理准确率能提升一大截。

2.4 链路追踪与日志关联

有一个故障场景让我印象特别深:用户反馈下单页白屏,但后端服务的错误率指标是正常的,只有链路追踪显示某个边缘服务响应时间瞬间涨了10倍。长时间以后,日志、指标、链路各自为政,每个系统都看不出来问题,但串起来才能定位。这就是为什么可观测性强调“三源合一”。我在链路数据上部署了OpenTelemetry Collector,统一接收业务上报的trace数据,然后把trace_id写入应用日志字段。这样查询日志时能反查链路,查询链路时能直接跳转对应日志,到了大模型层面,它就能把一次请求的完整路径串起来做根因判断。

3. 大模型接入与本地化部署:从通用助手到运维大脑

3.1 模型选型与硬件资源评估

先上一张我自己做测试的对比表,省得大家再踩一遍坑。

模型参数量显存要求(FP16)1000字回复耗时(A100实测)中文运维术语理解适合场景
Qwen2.5-7B7B约16GB2.1秒优通用问答、根因分析、自然语言查询翻译
DeepSeek-R1-Distill-Qwen-7B7B约16GB2.8秒良(推理链路长)需要展示推理过程的复杂排障
Llama3.1-8B8B约18GB2.5秒中(中文术语需额外训练)日志分类、告警去重等结构化任务
Qwen2.5-14B14B约32GB3.9秒优根因分析准确率要求高的场景

硬件上我的建议是:如果团队只做内部工具,一张NVIDIA RTX 4090 24GB就能跑7B模型,适合几百人的运维团队;如果要做高并发自动排障,至少准备一张A100 40GB或者两台3090做并行推理。CPU推理不是不能跑,但那个延迟你没法接受,一条实时告警发过去,模型要憋两分钟才出结论,等它回答完服务差不多也恢复了。

3.2 本地部署流程:Ollama的极简快速方案

私有化部署模型,我用的是Ollama,理由就一个字:稳。部署过程极简,下载安装包之后,拉取模型镜像就能跑。以大模型Qwen2.5-7B为例,命令是:

ollama pull qwen2.5:7b

拉下来之后启动服务的端口默认是11434。如果你习惯在Kubernetes里部署,推荐的方案是起一个Deployment跑ollama服务,挂载持久化卷存模型文件,再用Service暴露内部端口。我在生产环境这样做,主要是方便统一管理GPU资源,也方便多副本水平扩展。

启动之后做个简单的验证,确保模型真的在工作:

curl -X POST http://localhost:11434/api/generate \ -d '{"model": "qwen2.5:7b", "prompt": "Redis连接数暴涨,列出3个可能的排查方向", "stream": false}'

响应如果能正常返回一段结构化分析,就说明模型已经作为一个基础能力端口在运行了。这里建议设置OLLAMA_MAX_LOADED_MODELS限制为1,避免多个模型同时加载把显存挤爆。我踩过这个坑:同时加载了两个模型,结果第二个模型推理时全部走CPU,慢到怀疑人生。

3.3 把运维知识库装进RAG

大模型在专业领域经常胡编乱造,根本原因在于它的训练数据里没有你的私有运维知识。你的网络拓扑、你的配置规范、你之前排障沉淀的文档,它一概不知。解决这个问题最实用的方案就是RAG,也就是检索增强生成。

我的做法是把内部运维文档、历史故障报告、常见命令手册、排障SOP全部整理成Markdown文件,切块后做向量化。切块大小有讲究,太大检索出来上下文太长,容易超出模型输入窗口;太小信息不完整,检索出来碎片化。实测发现600到800字一块比较合适。向量存储用的Milvus,检索时取TopK等于5的文档片段拼进提示词。

RAG整套流程能在开源平台Dify上直接搭建,省掉自己写前后端的工作量。Dify里配置好大模型接口、向量库连接、知识库文件上传之后,整个AI应用就可以直接让团队成员通过网页聊天窗口使用了。实测下来,加入检索后的回答准确率提升明显,尤其适合“某个组件之前的配置是什么”“这个告警怎么处理”这类问题。

3.4 微调还是RAG?我的选择建议

这个问题我被问了很多次。我的判断标准很直接:如果你的任务是让模型“说出固定格式、固定流程”的东西,用微调;如果你的任务是让模型“根据新知识灵活回答”,用RAG。刚开始团队没有积累足够的数据,我建议先全部走RAG,因为它不需要额外训练成本,知识更新只要换文档就行。跑了两到三个月,把过去所有排障报告整理成“问题-现象-根因-解法”的结构化数据,再用LLaMA-Factory对Qwen2.5-7B做一次低秩微调,让模型知道我们团队的“说话习惯”和“处理套路”。这两者不冲突,RAG负责喂知识,微调负责规范输出,两者配合起来的效果远比单用任何一种好。

4. 核心实战:四个高频AIOps场景的工程化实现

4.1 场景一:告警风暴治理,从180条告警到3个根因

告警降噪是AIOps最立竿见影的场景。我这边实现了两层逻辑:第一层是规则过滤,用Prometheus告警规则里的keep_firing_for参数,避免短时抖动频繁触发;第二层是大模型归纳,把短时间窗口内触发的告警全部拉出来,让大模型按“是否同源”“依赖关系”“严重程度”三个维度进行聚类。

具体提示词我是这么设计的:

你现在是一个资深运维专家。以下是过去5分钟内系统产生的告警,请你: 1. 识别出这些告警可能属于哪几个根因; 2. 按“最可能根因关键字”分组输出,每组说明受影响的组件; 3. 对每组给出建议的优先排查顺序,用不超过200字概括。 告警列表如下: {告警原始列表}

这样做的效果很稳。上线之后,我们某天高峰期同时收到180条告警,系统先按规则过滤掉70条重复的,再让大模型归纳剩下的110条,最终输出只有3个根因方向。值班同学照着建议去查,10分钟定位了问题,放在以前可能要折腾40分钟以上。

4.2 场景二:智能根因分析,从告警到定位的一体化编排

根因分析不能只靠大模型拍脑袋,要有完整的“证据链”。我的编排流程是这样的:告警触发后,自动执行一个工作流,拉取当前Pod状态、最近一小时的日志异常片段、最近一次部署变更记录、以及网络连接数等基础指标。把这些数据拼装成一个完整的上下文,发给模型。

上下文里我最看重的是变更记录。让我长个记性的案例是:某次凌晨服务挂了,所有技术看日志都指向数据库连接池耗尽,但没人想到昨晚有人上线改了一个连接池配置参数。那一次排障花了两个多小时。后来我把“最近N小时内的配置变更、上线事件”全部纳入根因分析上下文,大模型一眼就能发现“配置变更与故障发生时间高度吻合”。这类跨系统关联能力,恰恰是纯靠人看日志最容易漏掉的地方。

整个工作流我用Dify编排,模型的输入是经过模板渲染的结构化数据,输出要求包含三个部分:最可能的根因、验证步骤、临时处置建议。发给模型之前,我会先过滤掉无用日志,比如长时间没有ERROR的INFO日志、用户主动操作产生的预期告警,防止上下文过长干扰判断。

4.3 场景三:自然语言查询基础设施状态

这个场景价值是“把看板交还给业务”。以前开发同学想看服务负载,得先学会看Grafana面板,找到对应的图表,再自己解释曲线是否异常。现在我把ChatOps接入了内部的IM工具,开发同学直接输入“最近1小时订单服务响应时间涨了多少”,后端自动把它翻译成一组查询,打出指标曲线、日志摘要、异常变化点,最终用自然语言返回结果。

底层实现上,我让大模型做了一层“自然语言转PromQL”。提醒词里写清楚哪些指标有哪些标签,让它生成查询语句。同时加了一个兜底机制:如果生成的PromQL执行报错,自动把错误信息回传模型,让它修正后再执行,最多重试两次。这个功能上线之后,使用率极高,因为大大降低了非运维角色的上手门槛。

4.4 场景四:智能工单与知识沉淀闭环

每次排障结束后,大量经验如果散落在IM聊天记录里就全浪费了。我在Dify里做了一个“复盘工单自动生成”工作流:输入故障时间、处理人、结论三个字段,系统自动从日志和监控里补齐时间线,再让大模型生成一份标准的故障复盘报告,包含故障现象、影响范围、处理过程、根因分析、改进建议。这份报告确认后自动写入向量知识库,成为后续RAG的检索语料。

跑了一个月之后效果出来了:同类型问题再次发生时,系统在告警激增的同一时刻,会优先返回“该问题曾于xx月xx日发生过,当时的处理方案是xxx,相关人员xxx”。这种事前提示帮我们省下的时间,不比告警压缩省下的少。知识库越用越厚的正向循环,才是AIOps长期有价值的关键。

5. 常见问题与排查技巧实录

5.1 大模型的“幻觉”导致错误结论

用大模型做运维最怕的不是它说“不知道”,而是它一本正经地编一个看似合理的根因。我遇到过最离谱的一次,它把业务访问量突然增长导致的CPU高负载,直接判断成“DDOS攻击”,还建议封禁IP。根本原因是模型没有拿到“当时业务活动大促”这个上下文。

应对幻觉,我的经验是三管齐下。第一,严格限制上下文来源,模型只能基于我喂进去的系统数据做分析,不允许使用训练数据里的常见套路复盘;第二,在提示词里明确要求“如果数据不足以得出结论,请直接说明,不要猜测”;第三,对高危险操作(比如封禁IP、回滚代码)实行“人审机制”,模型只出建议,不自动执行。这个机制必须提前定好,别等误操作了才去补。

5.2 告警数据不齐或时间不同步导致分析错乱

有阵子根因分析准确率掉得厉害,一度甚至不如人工判断。排查一圈发现,多个监控节点部署在一台NTP失联的主机上,系统时间快了大概两分钟。结果就是模型做时序推理时,看到“日志报错时间比告警触发时间晚了2分钟”,直接得出“这两件事没有因果关联”的错误结论。

这个坑提醒我一件事:所有参与分析的机器必须强制开启时间同步,并在告警分析之前先校验数据时间戳的最大偏移量。如果偏移超过30秒,宁可让大模型拒绝回答,也不能拿错乱的时间序列去推理。我在工作流里加了时间戳校验步骤,超过阈值就直接报警给运维同学去查时钟。

5.3 GPU资源不足,模型推理太慢怎么办

小团队一开始没有独立GPU服务器,只能用一台带核显的工作站做测试,7B模型跑一次根因分析要三分钟,根本没法用。

后来我做了两个优化。第一个是模型量化,把FP16的模型转成INT4格式,显存占用从16GB降到6GB左右,推理速度也能提升一倍。具体做法是在Ollama里直接选择带q4_K_M标签的量化版本。第二个是异步化设计,不要求用户在线等模型返回,告警触发后模型在后台异步分析,分析完成后再推送结论到IM。这两招下来,一张消费级显卡就能扛住小团队的日常分析需求。如果你的数据量比这还大,那就直接上A30或L40S,不要自己拼多卡,运维成本远高于购买一张大显存卡。

5.4 常见问题速查表

问题可能原因处理办法
大模型回答明显错误上下文数据不足或时间错乱补充监控日志上下文,校验时间戳,要求模型标注置信度
告警压缩准确率低聚类窗口太小或告警类别太杂把时间窗口拉长到10分钟,增加“根因候选”校验提示
RAG检索不到相关内容文档切块太碎或向量库未更新调整切块大小为600-800字,重建索引,标准化目录命名
GPU显存不足模型加载过多用量化版本,限制最多同时加载1个模型
响应延迟过高模型并发被打满使用异步推理队列,升级显存,减少上下文长度
PromQL生成执行失败指标命名不匹配在提示词里注入指标字典,增加自动重试修正机制
Loki查询超时日志量过大且无索引策略按应用字段做分片,配置保留周期,避免跨周期大查询

这里有个比较通用的排查技巧:遇到任何大模型分析结果不对,先别急着怀疑模型笨,检查数据管道是不是出了问题。很多时候不是模型不行,而是你喂给它的数据和真实世界不一致。我会先用几条简单问题让它回答已知结论,验证它的输入是否正确,再处理复杂问题。

5.5 一个关于Linux基础能力的重要提醒

最后必须强调一点:AIOps大模型是“锦上添花”,Linux基本功才是“雪中送炭”。做这套智能运维平台时,我团队里上手最快的人,恰恰是那些对Linux命令、容器排障、常用内核参数烂熟于心的人。比如排查GPU问题时,nvidia-smi配合ps aux看进程占用就比查日志高效得多;处理网络故障,ss -tnp和tcpdump直接决定排障速度;改配置排查时,journalctl -u服务名能瞬间看到服务启动的报错。

模型的建议输出后,最终落地的判断和操作还是要靠人来执行。建议所有想搞AIOps的运维同学,先把Linux基础能力打扎实——懂命令、懂文件系统、懂进程管理、懂网络原理。这块底子越深,用起大模型来越有底气,模型给出的建议,你能判断哪些该采纳、哪些是胡说。

这套系统上线后,我们团队处理常规告警的平均时间缩短了大概40%,但我想说的并不是“机器有多聪明”,而是“流程变正常了”。以前需要靠老师傅翻聊天记录回忆的经验,现在变成了随时可检索的知识库;以前告警页面刷出上百条让人无从下手,现在变成了几个清晰的根因方向。如果你也想在团队内部做一套类似的东西,我的建议是从最痛的一个场景切入,要么是告警压缩,要么是自然语言查询,先让团队看到效果,再逐步补全其他能力。基础设施数据质量和知识积累,永远是这套体系里最重要的两件事。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进