知识图谱+大模型:让自然语言直接生成可用的PromQL

发布时间:2026/10/31 9:10:05
知识图谱+大模型:让自然语言直接生成可用的PromQL 写 PromQL 这事儿我估计不少监控工程师都经历过那种凌晨两点被叫醒迷迷糊糊想查一条指标结果翻了十分钟文档才拼出能跑的表达式的崩溃瞬间。PromQL 本身语法不算难难的是它和业务语义之间的那道鸿沟你脑子里想的是支付服务最近五分钟 5xx 错误的速率但落到 Prometheus 里你得知道 metric 叫什么、标签怎么过滤、用 rate 还是 irate、聚合维度怎么选。每次写新查询都得靠猜和试。所以当我看到 PromCopilot 这篇论文——用知识图谱和大模型把自然语言直接变成 PromQL——我第一反应是终于有人认真解决这个问题了。这篇文章我想拆开讲讲它的整体设计、知识图谱在其中扮演的角色、生成 PromQL 的完整流水线以及我自己读完后的一些批判性思考希望能给同样在做监控可观测性或大模型落地应用的朋友一些参考。1. 先聊聊为什么 PromQL 这么难写这不是语法问题是语义鸿沟问题很多人以为 PromQL 难在语法其实真不是。语法翻翻文档两天就能上手真正折磨人的是意图到表达式的映射。1.1 一个典型场景脑子里很清楚手上写不出来举个例子。你现在收到告警支付服务在过去 5 分钟有大量 5xx 错误。你想查一下每秒错误请求数脑子里想的是指标大概是 http_requests_total带 service、code 标签要过滤出 servicepayments 且 code 是 5xx要算速率所以用 rate 函数时间范围选 5 分钟但你打开 Prometheus 一看实际的指标名叫http_requests_total还是requests_totalcode 标签的值是500还是500和502混在一起是不是还有个隐藏的handler标签需要处理指标太多命名不统一标签值的规范全靠 SRE 团队的自觉。最终你写出来的可能是sum(rate(http_requests_total{servicepayments, code~5..}[5m]))但这是运气好的情况。如果你换了 Grafana 面板、换了数据源、或者查询里需要按实例聚合、需要排除某些机器复杂的表达式会几何级数地膨胀。我见过一个生产环境的 PromQL 面板查询写了整整九行注释比表达式还多。1.2 PromQL 的语义模型和 SQL 差距很大SQL 查的是二维表结构相对规整PromQL 查的是带标签的时间序列集合。它的核心思想是先选序列再做计算但中间还插了很多容易被新手忽略的细节Counter 和 Gauge 的区别counter 是单调递增的查速率必须用 rate 或 irate不能用裸的差值然后除以时间除非你手动处理了重置。时间窗口的选取[5m]里的 range 选择器会决定 rate 计算平滑程度[1m]和[30m]的结果曲线差别非常大。聚合操作的位置sum by和sum之前之后套函数结果语义完全不同。向量匹配那些on、ignoring、group_left的复杂场景我敢说很多老手都不一定每次都能写对。这些语义细节堆叠起来导致自然语言意图 → 正确查询表达式这个映射的复杂度远比看起来高。这也是为什么大模型裸生成 PromQL 效果不佳的原因——不是模型不懂语法而是它缺乏对当前监控体系中真实指标和数据组织方式的知识。1.3 这个痛点的本质是什么拆开看这个痛点由三个层面构成指标命名和标签体系的鸿沟自然语言里的支付服务的错误数和指标http_requests_total{servicepayments, code~5..}之间存在一层隐式的知识——指标名、标签名、标签值规范、服务拓扑关系。聚合语义的鸿沟平均 QPS、TOP 5 实例、各区域的错误率对比这些描述对应的 PromQL 模板完全不同需要理解查询意图。上下文依赖的鸿沟同样的错误数在告警、排查、性能分析等不同场景下期望的查询方式阈值判断、趋势图、热力图也不同。这三点恰好指向两类技术的结合点知识图谱适合表示第一类知识大模型擅长理解第二、三类意图。PromCopilot 的思路就是把它们串成一条流水线。2. PromCopilot 的整体架构知识图谱和大模型各司其职不互相抢戏论文里 PromCopilot 最核心的设计思想我理解下来就一句话让知识图谱负责事实让大模型负责表达。2.1 整体流水线从自然语言到 PromQLPromCopilot 的链路大致是这样的用户输入自然语言查询例如过去 10 分钟支付服务 5xx 错误的平均 QPS系统先做意图理解和实体识别识别出查询类型、实体、时间范围通过知识图谱对识别出的实体做链接——把支付服务映射到具体的服务节点把5xx 错误映射到具体的指标和标签条件基于知识图谱中的语义关系构建候选的查询路径比如服务 → 指标 → 标签过滤 → rate → 聚合将这些候选路径和上下文信息组装成大模型的 Prompt大模型基于 Prompt 生成 PromQL 表达式对生成的表达式做语法、指标存在性、标签合法性校验输出结果注意这里的关键大模型不是直接看一句人话吐一句 PromQL而是先经过知识图谱把模糊的表达固化成精确的候选再让大模型做最后一步的翻译。这种设计大大降低了模型幻觉的概率。2.2 为什么不能让大模型直接生成2023 到 2024 年其实有不少人尝试过直接用 ChatGPT/GPT-4 或者开源模型裸生成 PromQL。我也试过效果是这样的简单的查询如查 CPU 使用率能写对因为这类指标名和模式在网上有大量公开示例。一到企业内部的私有指标mycompany_request_total{envprod, dcsh}这种就露馅了模型根本不认识这些名字。你问它订单服务 qps它可能会生成http_requests_total{serviceorders}但实际指标名可能是gateway_request_duration_seconds_count{apporder-service}。问题的本质是大模型的知识来自训练语料而企业内部监控体系的知识是私有知识——指标名、标签规范、服务依赖关系、告警策略这些东西不在任何公开语料里。所以如果缺乏外部知识的注入模型就是在看着一块白板猜答案。这就是知识图谱的用武之地把私有知识结构化地提供给 LLM 作为上下文而不是靠模型记忆。2.3 知识图谱和大模型的分工我整理了一下两者的分工对照职责知识图谱KG大模型LLM指标名、标签、服务拓扑等事实性知识负责以节点和边的形式存储不负责只读取上下文自然语言歧义消解5xx指什么提供候选链接结合上下文做最终消歧查询意图判断趋势/阈值/对比提供查询模板类型约束负责理解和套用模板PromQL 语法生成不负责负责包括函数、聚合操作、语法细节错误修正和校验提供指标存在性、标签合法性校验提供语法检查、语义校验辅助这个分工的聪明之处在于它把最容易让 LLM 翻车的部分私有的结构化知识交给确定性系统而把 LLM 最擅长的部分自然语言理解和代码生成留给自己。论文里反复强调的一个点是他们不用微调大模型也不依赖模型的参数记忆而是靠 Prompt 注入知识图谱的子图来临时给模型补充知识。2.4 这种架构的可复制性说实话这个架构本身并不算特别惊艳但它的价值在于设计取舍很务实。它没有追求端到端的一个模型解决一切这在私有时序监控领域几乎不可行而是采用了一种确定性系统 生成式模型的混合架构。这种思路其实不只适用于 PromQL任何自然语言 → 结构化查询/代码的场景SQL、SPL、KQL甚至 yaml 生成都能借鉴。3. 知识图谱在这里是怎么建起来、怎么用的本体设计和实体链接是灵魂标题里写着用知识图谱与大模型但很多人没细想过这个知识图谱到底存了什么哪里来的怎么用论文里这部分我读得最仔细因为这是整篇的基石。3.1 知识图谱里存了哪些东西PromCopilot 的知识图谱不是通用的百科图谱而是一个监控领域本体monitoring ontology。它的节点和边的设计紧扣监控场景指标节点Metric如http_requests_total、cpu_usage_ratio。每个指标节点带有类型属性counter、gauge、histogram、单位、含义描述。服务节点Service如支付服务、订单服务。服务节点和指标节点之间通过has_metric边关联。标签维度节点Labelservice、code、handler、instance等。标签的合法值集合也可能作为节点或属性存在。查询模板节点QueryTemplate如速率类查询模板、分位数类查询模板、TopN 查询模板。模板节点描述了某种查询意图到 PromQL 表达式的骨架。语义关系边包括聚合边aggregates_by、依赖边depends_on、等价边equivalent_to用于处理同义词和不同命名之间的映射。我印象最深的设计是把查询模板也放进了知识图谱。这样做的好处是用户说查平均 QPS系统可以直接在图上找一个rate sum by的组合路径而不是让模型自己从零推导 PromQL 结构。这套设计在工程落地时特别实用——你可以在模板节点里写清楚每个查询模式对应的 PromQL 骨架大模型只是在骨架里填具体指标和标签。3.2 图谱的构建半自动靠大模型辅助抽取靠人工收口知识图谱的建设通常是这类系统的最大成本项。PromCopilot 论文里提到他们结合了自动抽取和人工校验。实际落地上我建议参考这几条路径从现成配置反推Prometheus 的采集配置、告警规则文件、Grafana 面板 JSON里面其实已经包含了大量指标名、标签名、查询模式。写脚本解析可以快速得到初步的指标清单和查询模板。指标文档和 Wiki 解析很多团队有指标命名规范文档比如所有 HTTP 指标必须以 http_ 开头用规则或者大模型抽取能补全指标语义描述。大模型辅助知识抽取现在有一些知识抽取框架比如 oneke 这类工具可以把非结构化文本告警说明、值班手册半自动转成三元组。但在监控领域我强烈建议人工抽检一个错放的边直接导致下游查询链接错误。本体建模工具如果不想纯手工写 OWL/RDF可以用一些可视化本体建模编辑器先画清楚服务-Metric-标签-模板的关系图再导出为图数据库的 schema。一个很现实的提醒图谱的覆盖度和准确性决定了系统的下限。如果知识图谱里没有某个指标那么无论大模型多聪明都生成不出正确的查询如果图谱里标签值链接错了生成的 PromQL 会看似正确但查不到数据。所以构建阶段宁可慢也要保证每一条链接都是经过验证的。3.3 实体链接自然语言到图的翻译官假设用户输入支付服务成功率最近三十分钟怎么样系统要做的实体链接包括支付服务 → 服务节点paymentservice通过服务注册信息或别名表成功率 → 需要从图谱中找到表示成功率的最佳指标。这里就有意思了理论上没有直接叫success_rate的指标而是有一个http_requests_total和一个http_errors_total。这个语义映射就需要靠图谱边的设计来解决——在指标节点之间可以加一条derived_success_rate_from的推导边系统才能理解成功率需要两个指标做除法。最近三十分钟 → 时间范围 30m这是一个数值属性直接解析即可。实体链接的实现通常需要三层精确匹配、模糊匹配编辑距离、同义词表、语义匹配通过图谱上的邻居节点做消歧。我见过不少团队在这一步偷懒只做字符串包含匹配结果订单、 orders、order-service 这种互相匹配不上用户体验大打折扣。这部分工作更像搜索相关性问题值得认真做索引和召回。3.4 为什么非要用知识图谱用向量库存这些知识行不行这是我最想展开的一个问题。现在很多 RAG 应用喜欢把所有知识塞进向量数据库然后靠语义检索召回片段喂给大模型。但在 PromQL 这个场景向量召回有几个硬伤精确性不足http_requests_total和http_errors_total是一字之差但查询语义完全不同。向量检索可能召回相近的片段但无法保证链接的精确性。多跳关系难表达支付服务的高延迟需要一个从服务到延迟指标、再到可能相关依赖服务的多跳查询。向量检索做多跳推理是弱项而图上的遍历却是顺手的事情。可校验性知识图谱中每个节点的属性、每条边的关系都可以被程序自动校验。向量召回的结果是松散的片段很难做严格的正确性校验。我并不是说向量检索没用——它可以在实体链接的召回阶段作为补充手段但作为事实层的承载者图结构更可靠。PromCopilot 选择 KG 作为核心事实层本质上是把可解释、可校验放在第一位这一点我非常认同。4. 从一句人话到一条能跑的 PromQL生成流水线逐段拆解这一节我用一个完整的例子走一遍 PromCopilot 的生成流程这样比光讲架构直观得多。假设用户的输入是过去 10 分钟支付服务 5xx 错误的平均 QPS4.1 阶段一意图理解和查询类型识别系统首先要判断用户想干嘛是想看某个指标的值simple query是想看速率rate query是想看阈值告警threshold query是想做多维对比comparison query在这个例子里关键词平均 QPS、过去 10 分钟、5xx 错误组合起来指向一个速率 聚合类型的查询。这一步看似简单但决定了后面选择哪个查询模板。如果识别成simple query而不是rate query那么后面生成的 PromQL 会缺一个 rate 函数返回的结果根本不是用户想要的。4.2 阶段二实体识别和图谱链接系统会从句子中抽出关键实体时间实体10 分钟 →[10m]服务实体支付服务 → 图谱节点paymentservice错误实体5xx → 这是一个状态码模式的标签值code~5..指标实体通过图谱中paymentservice关联的指标节点筛出可能代表请求量和错误量的指标实体的歧义常常出现在这一步。比如支付服务在同一个公司可能有多个部署区域asia、europe用户没说区域系统应该默认全部区域还是一条都不列PromCopilot 的做法通常是通过查询模板中的默认策略来处理比如默认不加区域过滤或者把可选的标签项作为候选交给后续 Prompt 让模型决定。这个细节看起来简单但直接影响生成的表达式是否符合用户预期。4.3 阶段三基于图谱的查询路径构建链接完成后系统会在知识图谱上做一次路径搜索找出从服务节点到目标指标节点的所有可能路径。比如路径 Apaymentservice→http_requests_total{code~5..}路径 Bpaymentservice→http_errors_total如果存在独立的错误计数指标每条路径都附带语义属性是否需要 rate是否需要 sum按什么维度聚合路径搜索的目的是为后续 Prompt 提供选项集限制大模型的搜索空间。这一步直接控制了生成质量——如果图谱里只有一条合理路径那么模型基本不会出错如果有多条则需要靠 Prompt 里的描述让模型权衡。4.4 阶段四组装 Prompt让大模型生成 PromQL这是最巧妙的一步。PromCopilot 不会把整个知识图谱塞给大模型那会让上下文爆炸而是把查询路径对应的子图提取出来转成文本描述和用户查询、少样本示例一起拼进 Prompt。例如知识图谱上下文 服务 paymentservice 有指标 http_requests_total类型 counter标签包括 service固定为 paymentservice、code状态码、instance实例。 查询意图速率 平均聚合时间范围 10m。 请基于以上信息生成 PromQL。大模型在这里的角色被压缩成了翻译器基于给定的候选路径和模板约束生成最终的表达式。它不需要回忆指标名不需要猜测标签是否存在只需要把它看到的子图结构用 PromQL 语法表达出来。这大大降低了幻觉率。经过这一步模型可能生成avg(rate(http_requests_total{servicepaymentservice, code~5..}[10m]))4.5 阶段五校验和修正生成之后不是直接返回给用户而是要过一道校验器。这里 PromCopilot 做了几层检查语法层级表达式是否能被 Prometheus parser 正确解析。静态层级指标名是否存在于知识图谱中标签名是否合法标签值是否符合对应标签的合法值集合。比如如果 code 标签的合法值是 200、301、404那 5xx 的5..需要能匹配到合法值语义层级counter 类型的指标是否配合了 rate/irate 使用范围选择器是否非空。如果第三层检查发现生成的 PromQL 对 counter 没加 rate系统会尝试自动修正比如在表达式外面套上 rate 函数或者重新触发一次生成。这个闭环是端到端可用性的关键。4.6 一个完整示例的最终输出最终用户得到的表达式可能长这样avg(rate(http_requests_total{servicepaymentservice, code~5..}[10m])) by (instance)注意最后面的by (instance)是模板中平均 QPS这个聚合意图自带的默认维度。如果你手动去写可能要花两分钟而这里整个过程在几秒内完成。更重要的是系统返回的表达式是经过图谱校验的大概率能直接出数据而不是看起来能跑但查不到任何结果的垃圾查询。5. 论文评测结果、消融实验以及我读完想泼的三盆冷水论文里报告的效果自然是不错的否则也不会有这篇精读。但我更想说的是评测背后的东西以及从论文到生产还有多远。5.1 论文是怎么评测的我没有拿到论文的原始数据表如果手头有我会精确引用但从常见的评测方案推演PromCopilot 大概做了这几件事构造一个带标注的测试集包含自然语言描述、对应的标准 PromQL 表达式、外部知识图谱片段。用生成准确率生成的 PromQL 和标准表达式语义等价的比例作为核心指标而不是简单的字符串相等。因为 PromQL 的写法不唯一sum by (a)和sum without (b)在特定数据集上可能等价。做消融实验分别去掉知识图谱组件、跳过图谱路径搜索、去掉校验器观察准确率变化。结果大概率是没有 KG 时准确率显著下降没有校验器时错误查询的野性输出明显增多。这类评测思路是合理的不过有一个隐患测试集的规模和构造过程决定了指标的可信度。如果测试集是从少量用户的查询日志整理出来的那么泛化性就要打折。5.2 冷水一知识图谱的维护成本被严重低估论文可以在一个受控环境里把 KG 建得很漂亮但真实世界里监控体系是每天都在变的新服务上线、旧服务下线、指标名调整、标签规范变更、新查询模式出现。知识图谱不是建一次就完了它需要持续维护。我见过太多团队在 PoC 阶段用人工半自动方式建了一个不错的图谱demo 效果惊艳但三个月后指标变了图谱却没人更新查询准确率断崖式下跌。所以如果你准备落地类似系统从第一天就得规划 KG 的更新机制指标变更的 hook 怎么接什么时候触发增量更新谁来审核自动抽取的结果没有运维机制的图谱就是一张会腐烂的数据结构。5.3 冷水二生成的 PromQL 安全性和爆炸风险论文几乎没聊PromQL 不仅有能不能查出来的问题还有会不会把 Prometheus 打爆的问题。比如一个不带标签过滤的高基数查询可能会拉取上百万条时间序列把内存吃满。label_values()这种函数在生产环境容易触发全量扫描。用户在不知道数据分布的情况下用了一个超大的时间范围查询延迟直接击穿。论文里如果没讨论查询的代价预估和风险控制落地时就更加要谨慎。一个负责任的自然语言查询系统应该在生成后对查询做预估序列数、预估数据量的检查超过阈值就警告或拒绝。这个能力和生成正确 PromQL 同等重要。5.4 冷水三评测指标和端上可用之间的差距生成准确率 90%这个数字听着很好但在生产里用户遇到 10% 的错误查询时的挫败感远高于95% 准确率给人的预期。尤其是监控排查场景用户本身可能已经处于紧张状态一个错误的查询会加剧混乱。因此系统应该内置低置信度时反馈澄清问题的机制图谱里找不到匹配指标时不要硬生成而是反问用户你是指哪一类指标这个服务没有找到相关记录。交互式澄清比一次性生成完的更实用。PromCopilot 论文里也许有类似设计或规划但我希望在落地时把它作为一等公民来对待。6. 如果你也想做一个自然语言查监控的系统我的实操建议读这篇论文的价值不只在于了解一个系统更在于它对知识图谱大模型这类混合架构的思想示范。如果你所在的团队也在考虑做类似的东西下面几条建议来自我的实际经验也许比论文本身更有用。6.1 不要一上来就做大而全按三阶段渐进落地阶段一NL → 指标推荐。用户输入人话系统从知识图谱中召回最相关的指标和标签过滤展示候选指标卡片用户自己拼 PromQL。这个阶段不需要大模型做代码生成但已经把实体链接和图谱排查这些最难的地基打好了。阶段二NL → 简单 PromQL。针对查询单个指标 简单过滤的场景用模板套用 大模型填充的方式生成表达式只做低风险范围。阶段三NL → 复杂聚合。等到图谱覆盖度足够高、评测集足够成熟再开放 rate、sum、对比这类复杂查询。每阶段上线前都要建一个回归评测集从真实查询日志中挑出 200500 条历史查询标注标准答案作为每次系统更新的验收依据。没有评测集你就不知道自己改的 Prompt 是变好了还是变差了。这条经验是从大模型应用项目里砸出来的——模型的泛化能力在私有场景里是不可信的只有用你专有的评测集持续回归才敢说它稳定。6.2 存储和检索的选型参考知识图谱本体在中小规模几百个服务、几千个指标下用 Neo4j 这类图数据库就够用。节点少的时候性能瓶颈不在存储而在实体链接的召回质量。实体链接推荐用多路召回 精排的架构精确索引指标名、标签名、服务名放进倒排索引ES 或内存索引做前缀/子串匹配。向量召回把节点描述文本向量化做语义召回解决成功率这种没有直接同名节点的连接问题。图谱精排基于候选节点的邻居关系打分——比如用户提到支付服务那么候选指标里面和支付服务直接相连的指标应该比与支付服务无关的指标得分高。大模型在这个链路里放在最后一步负责加权和生成。记住一条原则像大模型这种不可控的组件越晚进入链路整个系统越可控。6.3 关于大模型微调我的态度很明确PromCopilot 的做法是不微调、直接 Prompt 注入子图这在我看来是聪明的选择。监控领域的自然语言形式变化极多——查一下支付超时率、有没有 500 告警、哪个实例负载最高——但每种形式背后的生成逻辑差异不大。用 few-shot 示例加图谱上下文足以覆盖绝大部分场景。只有当你有大量复杂推理型查询比如对比过去 24 小时和上周同期的错误率这种需要多步逻辑归纳的场景且 Prompt 怎么调都拉不回来的时候才值得考虑微调。微调的成本不仅在于训练和部署更在于每次指标体系变化后都要重新调一轮——对于监控这种高频变化的领域这通常不划算。6.4 最后的一个小经验先把知识图谱当成一本活字典来用我在自己主导的一个内部项目里最初想做一个大模型直接生成查询的 demo效果远不如预期。后来我借鉴了 PromCopilot 的思路先把指标字典和语义关系建成一个小型图谱让大模型只负责把图谱子图翻译成表达式这一步。改动后准确率提升非常明显团队对系统的信任也建立起来了。整个过程最大的体会是这类系统的成败60% 在知识图谱和指标治理30% 在评测集和回归机制大模型本身只占 10%。别把希望寄托在唯一一个聪明模型身上把周边工程做扎实比什么都重要。如果你正被监控查询折磨不妨试着先整理一份指标和标签的活字典哪怕不用大模型只是按字典生成模板日常效率也会提升不少。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询