AI运维中的数据飞轮:从对话日志到知识资产
2026/9/14 20:01:19 网站建设 项目流程

1. 从第七天的下班路上说起:我终于弄懂了“数据飞轮”不是概念,是循环

今天是我转AI运维方向整一周的日子。白天处理了一个K8s pod内存持续上涨的工单,AI助手把排查思路拆成四步递给我:先看limit和request有没有设置,再拉内存增长曲线判断是突刺还是缓坡,接着抓heap dump看对象占用,最后用pprof定位到某个缓存组件没有上限。这套思路帮我少走了至少二十分钟弯路,而且它给出的每一步都不是泛泛而谈,是结合我们集群里真实监控数据生成的。

晚上我坐在工位上回看这一天的AI对话记录,突然意识到一个过去完全没想过的问题:这些对话如果处理完就丢,那AI和普通搜索引擎有什么区别?就算它今天回答得再好,明天遇到类似问题,依然要从零开始推理一遍。传统运维里我们处理完一个故障,经验要么在个人脑子里,要么躺在wiki里吃灰,下一次告警来了还是从头折腾。而AI运维最大的不同在于——每一句对话,都可以变成下一次回答的养料。

这就是我今天想认真写一写的东西:数据飞轮。很多人把这个词当成一个漂亮的管理口号,但落到AI运维这个场景里,它其实是非常具体的工程问题。什么叫飞轮?就是你问AI一个问题,AI给你一个带上下文的回答;你告诉它这个回答有没有用、有没有解决工单;系统把这场对话记录下来,清洗好,筛掉差的,留下好的;然后这些好的对话进入知识库,让AI下次回答得更贴合你环境的实际情况;回答得越准,你就越愿意用,对话就越多,知识库就越丰富,AI就越懂你这套系统。一圈转完,每一次使用都在让系统变聪明,这就是飞轮。

写这篇文章,是想给和我一样正在从传统运维往AI方向转型的同行一个参考:数据飞轮到底怎么从口号变成代码,每天产生的对话记录里哪些是资产、哪些是垃圾,以及真正动手的时候会遇到哪些教材里不会写的坑。如果你已经在用类ChatGPT的工具做排障,或者你们公司正在做AI Ops平台,这篇文章的思路可以直接拿去落地。

2. 拆开来看:AI运维场景里数据飞轮的四段循环

先别急着看代码。我花了差不多一个下午,把飞轮拆成了四个阶段,然后才发现每一段都有独立的工程动作,不能混着做。

2.1 第一段:对话产生,日志必须全量落地

飞轮的起点几乎毫无技术含量,就是记录。但“记录”这两个字,做起来比想象中难。难在不是记录成功案例,而是记录所有对话。用户问了什么、AI答了什么、答得快还是慢、用了哪个模型版本、检索到了哪些知识片段、用户有没有点赞、有没有复制命令、有没有在工单系统里标记解决,这些字段一个都不能少。

我见过不少团队的做法是只保存用户点了赞的对话,觉得没反馈的没用。这是很典型的新手思路。我的建议是原始日志全量保留,哪怕一天几十万条也不怕,便宜的对象存储或者ES冷节点都能扛得住。因为你现在觉得没用的数据,等知识库跑起来之后再回头看,可能是冷启动阶段最珍贵的种子数据。

当时我在线上AI排障工具里加的埋点,核心字段长这样:

{ "session_id": "a3f9c7e1-...", "user_id": "ops_9527", "timestamp": "2025-06-18T15:23:41+08:00", "query": "pod内存持续上涨怎么排查", "response": "建议按以下步骤...", "model_version": "qwen-7b-20250612", "knowledge_sources": ["incident_20240508", "kb_network#1243"], "feedback": {"upvote": true, "comment": "按照第二步定位到缓存问题了"}, "incident_id": "INC20250618012", "latency_ms": 2340, "token_usage": {"prompt": 156, "completion": 420} }

这里有个容易被忽略的点:knowledge_sources字段非常重要。它记录了AI这次回答到底引用了哪些知识条目。后面做数据筛选的时候,只要发现某条知识源头被频繁引用且反馈好,就能反向定位出高价值知识,这个信息不提前埋点,后面补起来很麻烦。

2.2 第二段:从日志到数据资产,中间隔着一道清洗工序

原始对话日志不是资产,是矿石。必须经过烟囱式的三道工序才能真正入库:脱敏、清洗、分级。

脱敏针对的是IP、主机名、账号密码、工单号这类不能进知识库的东西。清洗针对的是空响应、纯错误码堆砌、没有任何上下文价值的废话。分级解决的是“哪些能进大模型微调集、哪些只能进检索库、哪些干脆扔掉”的问题。

关于分级这里直接上一个我实践后觉得好用的标准,后面还会细说:

级别判定条件去向
S级用户显式点赞 + 关联工单在P50时间内关闭微调候选池、评测集
A级用户有采纳行为(复制命令、点击展开详情)或工单最终解决RAG知识库
B级上下文完整、问答有效但无反馈统计特征、冷启动扩展
C级空转、纯情绪表达、隐私脱不干净归档或直接丢弃

为什么要分这么细?因为不同级别对应不同用途。S级数据用来微调,量不用大,几百条高质量的就有效果,但一条脏数据进去,模型可能会把错误习惯放大;A级数据用来做检索增强,量要多、覆盖面要广,但单条质量要求比S级低,因为检索只是召回,不是直接生成;B级是储备粮,等知识库膨胀以后再看能不能转正。

2.3 第三段:高质量条目进知识库,让AI真正懂你的环境

清洗筛选之后的A级条目,要干一件事:向量化后进检索库。我用的是OpenSearch,原因很务实——我们原先的可观测性数据就在ES里,运维部门对这套东西已经玩得很熟了,没必要为一个向量检索再引一套新组件。如果你们没这个历史包袱,Milvus、Qdrant也都是成熟选择。

向量化模型,中文场景实测下来bge-large-zh在运维文本上的召回效果比很多通用模型好,因为它对中文专有名词的理解更强。召回策略一定要做混合检索:BM25稀疏检索加向量稠密检索合并排序。原因是运维文本里有大量精确名词,比如K8s、WAL、tsdb、pprof,这些词在embedding之后经常被模糊化,靠BM25才能保住精确命中的底限,向量检索负责语义联想。我刚开始图省事只做了向量检索,导致一堆精确名词的检索命中率很难看,只能回头补混合检索。

入库的时候还有一件事不能省:给每条知识打上时间标签、来源标签、环境标签。有了这些标签,后面才可能实现“给这个集群的AI喂这个集群自己的数据”,也才能在知识过期的时候做批量归档。没有标签的知识库,三个月后就是一大堆失去上下文的文字垃圾。

2.4 第四段:知识反哺体验,体验催生更多数据

飞轮最后一段,就是AI带着更懂你的知识去回答问题,然后产生新的对话数据。

这里有个关键的工程选择:优先做RAG,而不是一上来就微调。运维场景环境差异极大,公共大模型根本不懂你的网络拓扑、你的机房分组、你用的中间件版本、你的告警阈值习惯。但是这些问题,通过RAG把正确知识喂给模型就能解决七八成。微调解决的是模型表达风格和结构化输出能力,不是解决“它不知道你环境长什么样”的问题。

打个比方:RAG是给一个经验丰富的工程师看你的系统架构图,微调是把他的思考习惯改了。对运维AI来说,大多数时候只需要给图就够了。等S级的数据积累到一定规模,再考虑微调也不迟。我见过一上来就微调的团队,最后模型确实变得很会写运维报告,但给出的排查建议依然跟具体环境对不上,因为知识根本没进去,只改了说话方式。

闭环之后的效果,我可以直说我的实测感受:同一个问题,第一周RAG检索引擎经常找不到正确的那篇知识;数据沉淀两周之后,它会直接引用我们某次真实故障的复盘记录来回答新问题。那种体验的提升,比任何指标都直观。

3. 第七天的工程落地:从对话日志到知识资产的三道工序

理论说完了,说点能直接照抄的东西。下面是我当天下午实际写落地代码时的核心工序,每道工序都配了能跑的思路。

3.1 工序一:对话在线拦截与结构化存储

我这边的情况是AI排障工具有一个网关层,所有请求都要过这一层,所以埋点直接放在网关中间件里。请求进来记录query、时间和session,响应回来记录response、token用量、模型版本、检索到的知识源、用户反馈入口。然后把整条记录投到Kafka。

为什么非要过一层Kafka?因为对话量起来之后,如果同步写ES或者对象存储,会给在线推理链路增加不必要的延迟和耦合。Kafka的作用就是削峰填谷,网关只负责往队列里扔消息,消费端想怎么处理都行,哪怕处理挂了也不影响在线问答。规模小的时候可以不这么重,但数据结构化这个习惯必须从第一天就建立。

3.2 工序二:清洗与脱敏,我用的规则和Python示例

脱敏这件事我踩过大坑,后面单独讲。这里先给一个能跑的清洗框架:

import re import json SENSITIVE_PATTERNS = { "ip": re.compile(r"\b(?:\d{1,3}\.){3}\d{1,3}\b"), "internal_host": re.compile(r"\b[a-z0-9-]+\.(?:prod|staging)\.internal\b", re.I), "incident_id": re.compile(r"\bINC\d{6,}\b"), "account": re.compile(r"\b(?:user|admin|root)_[a-z0-9]{4,}\b", re.I), } PLACEHOLDER_MAP = { "ip": "{IP}", "internal_host": "{HOST}", "incident_id": "{INCIDENT}", "account": "{ACCOUNT}" } def mask_text(text: str) -> str: for key, pattern in SENSITIVE_PATTERNS.items(): text = pattern.sub(PLACEHOLDER_MAP[key], text) return text def is_valid_entry(conversation: dict) -> bool: query = conversation.get("query", "").strip() response = conversation.get("response", "").strip() if not query or not response: return False if len(query) < 4 or len(response) < 10: return False return True

注意这个段代码里我特意留了一个原则:IP是无论如何都要脱敏的,但主机角色名不能随便脱。举个例子,nginx-prod-01里的nginxprod是有语义价值的,直接替换成{HOST}会把知识里最宝贵的环境语义一并抹掉。更好的做法是只抹掉后面的序号,保留角色部分。这个细节直接决定你知识库里的内容是能用的经验,还是一堆占位符组成的废话。

3.3 工序三:分级判定与向量化入库

清洗完的对话,要跑一遍分级判定。

S级我用的判定逻辑是:用户显式点了赞,或者反馈文本里出现“解决了”“可以了”“定位到了”这类关键词,同时关联工单在24小时内被关闭。这类条目会单独存一份,等攒够了量做微调用。

A级的判定逻辑是:用户有复制命令的行文,或者点击了对话里的“查看详情”按钮,或者工单系统里确实关联了这个会话且状态为已解决。这类条目进入知识库向量化和索引。

向量化入库的时候我加了一个非常有效的小动作:把知识条目的标题和标签一起拼进embedding的内容里。比如一条关于“K8s pod内存排查”的知识,我实际做向量化的时候,会把“K8s、pod、内存、排查、缓存泄漏”这些标签拼在正文前面再去embedding。这样检索的时候,精确匹配和语义匹配都能覆盖到,召回率比裸向量化提升明显。

4. 数据质量是飞轮的摩擦力:两起真实的数据污染事故

飞轮能不能转起来,很多时候不是卡在技术,而是卡在数据质量。我这一周踩过两个大坑,都是那种回想起来后背发凉的坑,写出来希望大家绕开。

4.1 事故一:脱敏过度,知识库变成满屏占位符

第一次清洗的时候,我用正则把所有主机名全部替换成了{HOST},所有IP替换成{IP},自认为做得干净又彻底。结果第二天RAG检索出来的知识,凡是涉及具体排障过程的,几乎都是“登录到{HOST}执行某命令发现{IP}请求量异常”这种鬼样子。AI拿这种知识做参考,给出的建议完全没法用,因为它自己都不知道该登录哪台机器、该看哪个IP。

根因是我把“环境相关”和“敏感信息”混为一谈了。IP、账号、工单号是敏感信息,必须脱;但主机角色、集群名、机房代号、中间件版本这些是场景信息,恰恰是知识库里最珍贵的东西。它们决定了AI给出的方案能不能贴合我们自己的环境。

之后我调整了脱敏策略,改成三级处理:可逆替换(把真实IP映射成内部代号,映射表存在KMS里,需要时能还原)、泛化保留(主机名保留角色部分,只抹掉序号和环境后缀)、直接删除(账号密码令牌这类彻底清除)。这个三级策略效果立竿见影,知识库内容终于从“正确的废话”变成了“可执行的参考”。

4.2 事故二:一次性排障对话被当成通用知识入库

有一天下班前,有同事在群里问了一个关于某个冷门时序数据库的兼容性问题。AI从知识库里捞出了一条半年前的对话,里面有人尝试过某种配置方式,当时看起来是解决了问题。但问题在于,这半年里那个组件升过两次版,那条知识的结论已经失效了。AI把旧版本的方案原封不动给了出来,差点让同事在生产环境执行一个已被官方废弃的配置。

这个事故的根子是入库时没打时间标签,也没标验证状态。我修复的办法是:所有知识条目必须带“来源时间”和“最近验证时间”,超过90天的知识自动降级,只能作为补充参考,不能作为主要依据。同时在系统提示词里加了一句硬约束:当检索到的知识置信度不高或时间过久时,必须明确说“这条信息依据的版本较老,建议核实”而不是直接给答案。

数据质量这件事,我的体会是它不像功能开发,做完了就有交付物,但它决定了飞轮转起来之后是越转越润还是越转越涩。你往里喂垃圾,AI只会越来越准确地回答垃圾。

5. 闭环跑了一周,我看到的四个关键信号

飞轮搭好之后,最关心的问题当然是:它转起来了吗?我给自己定了四个观察指标,按重要程度排序,分别说。

5.1 指标一:RAG命中率,知识库有没有被真正用到

我把AI问答链路里“检索到知识片段且被最终回答引用”的占比作为命中率。搭建飞轮的第三天,这个数字从最初的42%左右涨到了61%,说明测试人员提问的时候,系统能更频繁地找回有价值的历史经验。命中率是飞轮是否启动的最基础信号,命不中,后面全是空转。

5.2 指标二:回答采纳率,用户真的用了AI的建议

比命中率更硬的指标是采纳率。我统计的方式简单粗暴:对话中出现复制命令、点击详情、反馈点赞、工单关联关闭中任一行为,就算一次采纳。一周下来,采纳率从18%爬到了39%。这个数字再往上走会越来越慢,因为高频可解决的问题被解决得差不多了,剩下的都是长尾难题。

5.3 指标三:首次响应时间,飞轮不该让系统变慢

加了检索环节之后,AI回答的延迟肯定比纯模型生成要高,这部分要有心理准备。我实测下来,混合检索平均增加300到500毫秒的耗时,但通过缓存热点知识、优化embedding并发,整体首次响应时间反而从原来的5秒出头降到了3秒左右。原因也很简单:知识命中之后,模型不用重新“想”那么久,输出更短更准,反而省了生成时间。

5.4 指标四:同一问题二次提问率,用户不再反复问同样的事

这个信号最让我惊喜。以前工单群里同一个问题隔三差五就有人问一遍,比如“测试环境的配置中心为什么连不上”“某某服务的日志为什么突然不打了”。知识库起来之后,AI能在第一时间给出带上下文的标准排查步骤,同一类问题的二次提问率降了将近四成。这个数字说明飞轮已经开始反哺用户体验了,用户越愿意用,对话数据就越多,飞轮转速越快。

下面这张表是小流量灰度环境下的示意数据,同行可以拿去当参考基准,但别直接当目标,因为平台基础、数据来源差异很大:

指标飞轮搭建前运行一周后
RAG命中率42%61%
回答采纳率18%39%
首次响应时间5.2s3.1s
同一故障二次提问率37%22%

6. 堆数据不等于转飞轮:入库量上来了,问题也来了

飞轮转起来之后,我又碰到一个非常现实的问题:知识库膨胀得太快,开始出现“检索串味”。具体来说就是,用户问一个A集群的问题,系统把B集群的某条经验也捞了出来当参考。虽然大模型经常能自己判断哪个更相关,但偶尔也会把不同环境的结论混在一起,给出一个两边都不完全适用的答案。

这是我的第二个教训:飞轮不是数据越多越好,而是越“对”越好。入库的时候如果只堆数据不加维度,知识库最终只会变成一盘散沙。我之后的优化手段是给每条知识打环境标签、集群标签、组件版本标签,检索的时候把用户当前的上下文作为硬过滤条件,先按标签圈定范围,再在范围内做语义匹配。这一步之后,检索串味的问题基本被压到了可接受范围。

还有一件事需要提醒:长期不维护的知识库会烂掉。飞轮转起来之后,必须建立知识生命周期机制——定期抽样检查老条目,被用户高频引用且反馈好的知识要置顶,长期没被命中的知识要降权或归档,已经被新方案替代的知识要点对点清除。这个维护工作不复杂,但必须有人负责,否则飞轮转着转着,库里的知识就跟系统现状脱节了。

7. 转型第7天的思考:运维工程师做AI,最大的门槛不是算法

如果让我总结这一周最大的认知变化,我会说:运维工程师转型做AI,真正的门槛不在算法,而在数据和场景之间的翻译能力。

算法模型有现成的开源方案,embedding有成熟工具,大模型推理有标准接口,这些东西只要肯花时间都能学会。唯独“把运维场景翻译成数据和需求”这件事,只能靠对业务和系统的理解。你懂故障链路,你知道哪些数据是关键信号,你更懂在什么情况下AI的建议会被一线运维信任、什么情况下会被当成噪音直接忽略——这些经验,恰恰是数据飞轮的地基。

现在回头看第七天白天那个pod内存的工单,AI给出了四步排查法,最后定位到缓存组件没有上限导致的对象堆积。如果放在飞轮搭建之前,这个回答虽然专业但也是泛泛之谈。而在那场对话被记录、被清洗、被分级入库之后,下一次有人遇到类似的内存问题,AI就会优先引用这次的排查思路和最终结论,给出的建议会更贴我们自己的环境。这就是“每一句对话都是资产”的含义。

下一步我的计划是做两件事:一是把S级对话攒够之后进行一次针对运维场景的轻量微调,让AI更习惯于输出结构化排查步骤;二是搭一个历史故障重放体系,每个月用过去真实故障数据回测当前版本的AI,看它是不是比上个月更聪明。这台飞轮刚转到第七天,转速还很慢,但方向我已经很确定了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询