
——当AIOps遇见大语言模型,我们如何重构云计算运维范式
在Kubernetes、Service Mesh、Serverless共同编织的云原生时代,运维工程师正面临前所未有的复杂性。一个Pod重启可能触发50+条告警,一条网络抖动可能衍生出跨集群、跨AZ的连锁异常。传统基于规则(Rule-based)和简单机器学习(如孤立森林、ARIMA)的AIOps方案,在面对动态阈值、未知故障模式时,往往沦为“事后诸葛亮”——告警收敛了,根因依然需要人工在分布式链路追踪、日志、指标的三维数据迷宫中艰难探索。
我们的团队在过去两年中,逐步构建了一套基于大语言模型(LLM)的云原生故障根因定位与自愈系统,内部代号Hermes。本文将系统阐述Hermes的架构设计、关键算法、工程化落地中的“坑”与解法,以及在生产环境中的真实效果。希望能为正在探索AIOps深水区的同行提供一份可参考的实践笔记。
Hermes采用“数据湖 + 特征工程 + 多模态LLM推理 + 自动化执行”四层架构,所有组件均运行在Kubernetes集群中,自身具备高可用与弹性伸缩能力。
┌─────────────────────────────────────────────────────────────┐
│ 上层:自动化执行层 │
│ (K8s Operator / Argo Workflow / 自愈策略引擎) │
└───────────────────────────┬─────────────────────────────────┘
│ 推理结果(根因+修复建议)
┌───────────────────────────▼─────────────────────────────────┐
│ 核心层:LLM推理与RAG引擎 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 告警摘要生成 │ │ 因果图谱推理 │ │ 运维知识库RAG │ │
│ │ (LLM) │ │ (Graph+LLM) │ │ (向量+文档检索) │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│ 结构化上下文
┌───────────────────────────▼─────────────────────────────────┐
│ 特征工程与多模态数据融合层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌───────────────┐ │
│ │时序指标 │ │日志模板 │ │链路Span│ │ 配置变更事件 │ │
│ │(Prom) │ │(Fluentd)│ │(Jaeger)│ │ (ArgoCD/Git) │ │
│ └─────────┘ └─────────┘ └─────────┘ └───────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│ 采集
┌───────────────────────────▼─────────────────────────────────┐
│ 数据湖(ClickHouse + S3) │
└─────────────────────────────────────────────────────────────┘与传统AIOps方案的核心差异在于:我们不再试图用单一模型拟合所有故障模式,而是将LLM作为“推理大脑”,结合图神经网络进行因果发现,最终输出人类可读的根因解释与可执行的修复命令。
LLM虽强,但若喂入原始告警流和PB级日志,必然产生幻觉与超长token开销。我们设计了三级压缩策略:
采用基于变分自编码器(VAE)的异常检测,输入为过去24小时的指标序列(CPU、内存、延迟、错误率等),输出异常评分及突变点。为减少误报,我们引入季节性分解 + 动态基线,而非固定阈值。
# 简化的异常检测伪代码
class DynamicThresholdDetector:
def __init__(self, window_size=288): # 5min粒度,24h
self.vae = load_vae_model()
self.seasonal_period = 288 # 日周期
def detect(self, series):
# 1. STL分解去除趋势和季节
residual = stl_decompose(series, period=self.seasonal_period).residual
# 2. VAE重构误差
recon_error = self.vae.reconstruct(residual).mse
# 3. 自适应阈值(基于近期残差分布)
threshold = np.percentile(residual[-72:], 95) + 2*np.std(residual[-72:])
anomalies = recon_error > threshold
return anomalies, recon_error异常事件会打上严重程度(P0-P3)和影响范围(单Pod/多Pod/集群级别),供后续告警收敛使用。
原始日志噪音极大。我们在Drain算法基础上,增加语义相似度聚类(使用sentence-BERT),将相似模板合并,同时保留关键变量(如error code、IP、pod name)。最终每条故障时间窗口内的日志被压缩为模板序列 + 变量字典,大小缩减至原始1/50。
分布式追踪数据(Jaeger)中,我们只提取耗时超过基线3倍标准差或含error tag的Span,并构建出局部调用拓扑,剪枝掉正常分支。这一步骤极大减少了后续图推理的节点数量。
通过监听ArgoCD的Application同步事件、GitOps仓库commit历史、以及云平台API操作审计,构建变更时间轴。我们发现超过60%的故障与近期变更(镜像更新、配置修改、扩缩容)直接相关,这一先验信息会作为LLM推理的显式特征。
告警之间常存在“鸡生蛋”关系。我们构建了一个轻量级因果发现模块,基于PC算法(Peter-Clark) 结合条件独立性检验,在分钟级时间窗口内生成告警-指标-变更之间的有向无环图(DAG)。
但纯统计因果发现容易因数据稀疏产生伪边。我们的改进方案是:
该因果图会作为LLM的结构化输入之一,帮助模型聚焦于“可能的原因链”,而非漫无目的地扫描所有数据。
我们选择Qwen2.5-72B-Instruct(内部私有化部署,vLLM serving)作为基础推理模型,同时为低延迟场景(如实时告警分级)使用Qwen2.5-7B蒸馏版本。72B模型推理延迟约3-5秒(A100 80G*4),完全满足分钟级故障分析SLA。
我们设计了一套 “分层提示模板” ,将上述预处理数据组织为:
[系统指令]:你是云原生运维专家,请根据提供的证据链,推断根因并给出修复步骤。
[固定知识]:Kubernetes、Istio、MySQL等组件的常见故障模式(内置)。
[当前上下文]:
- 告警摘要:{经过LLM二次摘要的告警列表,去重合并}
- 异常指标图:{时间序列异常点描述,如“cpu 在10:23飙升到95%”}
- 因果候选图:{节点列表及置信度}
- 近期变更:{镜像tag、配置diff}
- 典型日志片段:{仅包含ERROR/FATAL,且经过模板去重}
[输出格式]:JSON { "root_cause": "...", "evidence": [...], "repair_commands": [...], "confidence": 0.92 }关键在于长度控制——我们使用滑动窗口只取故障时间点前后15分钟的数据,并使用LLM自身进行“摘要压缩”(如让7B模型先对日志做一次精简),最终输入72B的token数控制在8k以内。
内部积累的历史故障案例(约3000+条,每条含根因、修复、验证结果)被向量化为嵌入(使用BGE-large),存入Milvus。在每次推理时,我们根据当前告警特征向量召回Top-5相似历史案例,作为“参考示例”拼接到Prompt中。这一做法显著提高了少样本(few-shot)推理准确率,尤其是对已知故障模式的快速匹配。
我们要求LLM先输出推理步骤(CoT),再给出最终结论。同时增加自我一致性机制:对同一上下文进行3次采样(temperature=0.3),如果结论一致则采纳,否则触发二次验证——调用外部工具(如kubectl describe、promql查询)获取补充证据,再次推理。
Hermes的最终输出需要转化为实际运维动作,但绝不能全自动执行(风险极高)。我们的设计是:
我们为每个修复指令附加了 “前置检查” 和 “后置验证” 的PromQL表达式,LLM在生成指令时也会一并生成这些检查语句。
# 修复指令示例(YAML)
repair_actions:
- action: "restart_deployment"
target: "payment-service"
namespace: "prod"
pre_check: "sum(rate(http_requests_total{status=~'5..'}[1m])) < 10"
post_check: "histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) < 0.5"
rollback_if_fail: true我们采用人工标注的方式,对2025年Q1-Q2共450个真实故障进行盲测对比:
方法 | 根因定位准确率(Top1) | 平均定位时间 | 修复建议可用率 |
|---|---|---|---|
传统规则引擎 | 42% | 即时 | 35% (规则外无效) |
机器学习(随机森林+关联规则) | 61% | 3min | 48% |
Hermes(LLM+RAG+因果图) | 83% | 2.5min | 76% |
其中定位失败的案例主要集中在新型应用层逻辑错误(如死锁、数据不一致)——这类问题上下文不在运维数据中,需代码级调试,属于当前方案的边界。
当前Hermes还处于“人机协同”阶段,我们计划在下一版本中引入:
kubectl exec或tcpdump等诊断命令(在沙箱中),获取额外信息——这已经进入“运维Agent”范畴。Hermes项目让我们深刻体会到:LLM不是魔法,它无法凭空知晓未知故障,但它在融合多源异构数据、进行常识推理、生成可解释结论方面的能力,远超市面上任何单点AI模型。云原生的复杂性不会降低,但通过精心设计的架构——将统计学习、因果推断与大语言模型有机结合——我们完全有能力将运维从“消防员”转变为“架构师”。
思否的读者大多是一线开发者与运维工程师,我相信你们在自己的场景中也遇到类似的痛点。欢迎在评论区留言交流,也期待与更多同行共建开源的AIOps工具链。我们的因果图谱模块和RAG检索部分已计划在Q3开源(项目名CausalOps),敬请关注。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。