我先核对 Netflix 侧关于知识图谱、本体驱动可观测性的公开材料,以及 “数十亿事件” 规模下的图存储和 Agent 查询实现细节。
核心材料已经找到,来自 Netflix 官方的 Observability Ontology 分享。我再补一下原始博客里的分层管道、QuipuDB 存储细节和 AutoRCA 的边界。
Netflix 这套系统真正做的事,是先把 “事件背后有哪些实体、它们怎么关联” 变成一份机器能查的事实表,而不是把每秒 3800 万条日志全部塞进图数据库。原始事件仍然留在 MELT 采集层,图里存的是应用、事故、发布、告警、变更、讨论这些实体,以及它们之间的 ownedBy、deployedIn、affects、precededBy 关系。规模数字只是背景:每天 20 亿次以上请求、每秒 3800 万条实时日志、2024 年 11 月那场拳赛约 6500 万并发流;真正拖慢排障的是四个小时里大部分时间花在 “把 application、service、cluster 对上号”,而不是算不动。
复现它并不需要先买一个巨大的图集群。按公开材料还原,关键决定只有六个:先定身份再建图、拒绝泛化的 Service 类型、用类型系统约束 LLM、把富化管道顺序化、把相关性当成带证据的假设、让 Agent 只提议不拍板。下面按这六条拆开讲,并给出一个中小团队能落地的版本。
先把规模算清楚:38M / 秒 不是图的写入量
按每秒 3800 万条折算,一天约 3.28 万亿条日志事件。这个量级全量入图,写入放大和查询成本都无法接受,而且绝大多数事件对 “根因” 没有边际价值。Netflix 的做法是先分四层,再把每层产出收敛成事实:
| MELT 层 | 回答什么问题 | 图上留下什么 |
|---|---|---|
| Metrics | 指标是否偏离基线 | 异常节点、时间窗、严重度 |
| Events | 发生了什么 | 发布、配置变更、扩缩容、实验 |
| Logs | 具体错在哪 | 错误模式、样本引用、首次出现时间 |
| Traces | 调用链哪一跳慢 | 端到端瓶颈、服务依赖边 |
这张表解释了一个常见误解:Agentic Knowledge Graph 不是 “事件的数据库”,而是 “事件语义的索引”。事件本身留在时序库和日志系统,图负责回答 “这次发布影响了哪些应用、哪些事故和它同一时间窗、谁在 Slack 里提到过类似现象”。
四小时里,三小时在 “对不上号”
一个首页渲染慢 1.5 秒的回归,嫌疑面可以横跨客户端版本、A/B 实验、基础设施限流、六跳下游的 GraphQL 服务。每个系统单独看都自洽,合起来就互相不认识:Atlas 里叫 application,Radar 里叫 service,另一个系统里叫 cluster,名字还差一个后缀、大小写不同,或者只有两个老员工记得改过名。
Netflix 用六个三元组把这类问题压成一次查询:
api-gateway rdf:type ops:Application .
api-gateway ops:ownedBy "Team Bedrock" .
api-gateway ops:deployedIn "us-east-1" .
INC-5377 rdf:type ops:Incident .
INC-5377 ops:affects api-gateway .
INC-5377 ops:severity "SEV 2" .
“Team Bedrock 在 us-east-1 的应用,最近被哪些事故影响?” 原来要查事故系统、发布系统、告警系统三处,现在是一条 SPARQL。省下来的不是计算时间,是人在三个界面之间来回确认实体身份的时间。
本体的两个硬决定
第一个决定是拒绝泛化的 Service 类型。官方给出的理由是:Service 在他们的工具链里有四种不同含义,混在一起就永远 join 不上。所有应用统一收敛为 ops:Application,创建实体前必须过一遍约 4.9 万条的软件目录;用户名、团队名、从网络拓扑里抓来的依赖名,一律不允许变成 application。依赖边还做了双向上限,否则一个热门服务的反向依赖能有几千条,直接把图查询拖垮。
第二个决定是把 “人的推理” 也建模。事故频道里被否掉的假设、最后生效的缓解措施、谁知道为什么,这些信息在频道静默后就蒸发了。Netflix 把一条 200 条消息、50 个人、15 个服务的事故频道,转成有序三元组。遥测记录系统做了什么,讨论记录人理解了什么,后者对下一次排障往往更值钱。
| 实体 | 关键属性 | 关系 |
|---|---|---|
| Application | 名称、负责团队、区域 | ownedBy、deployedIn、dependsOn |
| Incident | 严重度、状态、时间 | affects、causedBy、resolvedBy |
| Deployment | 版本、时间、变更单 | deployedTo、precededBy |
| Alert | 阈值、触发时间 | triggeredFor、correlatesWith |
| Discussion | 频道、参与者、结论 | discussedIn、proposedHypothesis |
五层熵减:让随机工具产出确定图
LLM 摘要、模糊匹配、概率因果链,单看每一个都不稳定。Netflix 的处理思路是把管道当成一架 “熵减梯子”:每一层都只允许输出被类型系统约束过的东西,单层随机,串起来却能得到确定的图。
官方公开材料详细展开了 Enricher 这一层,契约很窄:
class Enricher:
async def _enrich_async(self, ...):
raw = await self.fetch(...) 读噪声输入
result = self.analyze(raw) 处理,可能随机
graph.add((uri, RDF.type, OPS.X)) 只发有类型的三元组
graph.add((uri, OPS.pred, Literal(result.value)))
return EnrichmentResult(success=True, triples_added=count)
三个不变量贯穿所有 enricher:每个实体必须有 rdf:type;每个 URI 遵循同一套命名;每个 ops:Application 必须过软件目录。LLM 可以自由生成一段散文,但它不能发出违反类型系统的三元组。分类字段被枚举卡死,比如 category 只能是 incident、question、discussion、decision,sentiment 只能是 positive、neutral、negative、urgent。
顺序执行是另一个容易被抄错的地方。管道按 “加载图、写三元组、保存” 串行推进,牺牲了墙钟时间,换掉了整类竞态条件。对外部指标、日志、事件系统的调用是 best-effort,慢接口只让这一轮富化降级,不能阻塞整条 harvest。
相关引擎:13 类信号、10 分钟窗、0.6 阈值
相关引擎读十三类信号:日志错误、指标异常、慢 trace 与失败 trace、告警、事故、发布、配置变更、实验、自动扩缩容、提交、端到端瓶颈、错误模式。它不直接下结论,只找路径。
有些有序对是已知因果,带高先验权重:发布在日志错误之前、配置变更在指标异常之前、失败 trace 在事故之前。其余高相关组合被当作相关链,按时间接近程度和严重度打分,窗口十分钟,低于 0.6 置信度的链直接丢弃。一条 0.87 的链是 “强假设”,不是 “答案”;链和支撑它的图记录一起落库,消费方能看到这个分数是怎么来的。
这套设计的价值在于可反驳。工程师拿到的是 “发布 A 之后 90 秒,服务 B 的 P99 上升,和事故 C 同窗”,而不是一句 “可能是发布导致的”。前者能验证,后者只能猜。
存储与查询:QuipuDB 与 Turtle 的两个细节
图存在 QuipuDB,Netflix 自研的分布式 RDF quad store,底层是 Rust 的 redb 嵌入式 KV。选 RDF 而不是属性图,主要是为了 W3C 那套标准:RDF 做数据模型、OWL 做本体、SHACL 做校验、SPARQL 做查询,换存储时模型可迁移。
SHACL 的作用被很多人低估。它能把业务规则写成约束,比如 “服务可以在 AWS 上终止,但如果容量占比超过 10%,就不允许终止”。这类规则放进本体,Agent 在提议动作时会被直接挡回来,不需要靠提示词提醒它 “别乱删”。
每次 harvest 还会产出一份完整的 Turtle 序列化用于归档。官方说这个 “人类可读、可 diff” 的副产物,在调试时比他们预期的更有用。对复现者来说,这相当于给图加了一层可审计的快照,出问题能回放。
Agent 层:AutoRCA 把本体当接口
AutoRCA 是一组专家 Agent 围着一个问题转,分别看 trace、日志、发布、配置。它们不互相交换自由格式的结论,而是都读写同一套本体。做 trace 的团队把发现写成关于 ops:Application 的三元组,做日志的团队读同一个 ops:Application,两边不需要知道对方的存在。新加一个专家,学一次词汇表,就能读到前面六类专家写下的全部内容。
这条设计比 “多 Agent 互相聊天” 稳的地方在于:接口是 schema,不是自然语言。自然语言会漂移,schema 不会。
边界也很明确。告警照样在下午 3:30 触发,工程师照样要权衡证据,修复照样得由懂代码的人写。Agent 压缩的是 “找负责团队、还原发布、跨系统对齐、回忆上次类似事故” 这一到两个小时。官方承认排序假设有时会错,所以每条假设都必须带证据。
复现路线:从一个域、五个实体开始
| 阶段 | 做什么 | 产出 | 别做什么 |
|---|---|---|---|
| 1 | 选一个域,比如 “首页渲染” 或 “支付失败” | 域内实体清单 | 一上来铺 12 个命名空间 |
| 2 | 定权威目录 | 应用清单、团队清单 | 让 LLM 自由发明实体名 |
| 3 | 建最小本体 | 5—8 个类、10—15 个关系 | 建万能 Service 类型 |
| 4 | 先做确定性 enricher | ID、URL、时间戳、目录校验 | 先上 LLM 做分类 |
| 5 | 加受约束的 LLM 分类 | 枚举字段、置信度 | 让模型自由写三元组 |
| 6 | 接相关引擎 | 3—4 类信号、10 分钟窗 | 把相关当因果 |
| 7 | 接只读 Agent | SPARQL 工具 + 证据返回 | 给 Agent 写权限 |
| 8 | 本体当代码管 | 版本、评审、SHACL 测试 | 让本体散落在文档里 |
存储不必照抄 QuipuDB。支持 RDF/SPARQL 的 Oxigraph、Apache Jena TDB2、Blazegraph 都能起步;如果团队已经在用属性图,Neo4j 也能做,但要把本体和约束层单独补回来,否则会退化成 “一张有关系的表”。AWS 的语义层方案给了另一种思路:用虚拟知识图把关系库、数仓、数据湖联邦起来,Neptune 存物化三元组,DB Streams 触发推理,不必把数据全部搬进图。AWS
规模化取舍:四个必须提前定的选择
| 选择 | 偏保守 | 偏激进 | 建议 |
|---|---|---|---|
| 入图范围 | 只入窗口聚合后的事实 | 原始事件全量入图 | 先聚合,按查询需求补样本 |
| 富化顺序 | 串行,后写读先写 | 全并行 | 串行,慢接口 best-effort |
| 本体变更 | PR 评审 + SHACL 回归 | 线上直接改 | 当代码管 |
| Agent 权限 | 只读 + 提议 | 直接执行修复 | 人类审批,先跑影子模式 |
最容易踩的六个坑
- 把图当事件库。 写入放大先拖垮存储,再拖垮查询。图要存语义,不存流水。
- 先上 LLM 再定本体。 输出无法校验,最后得到一堆看起来像知识、实际不可查的文本。
- 保留泛 Service 类型。 四套语义混在一个类里,跨系统 join 永远对不上。
- 并行跑 enricher。 后写的读不到先写的,关系链断裂,还很难复现。
- 把 0.87 当结论。 置信度只是排序依据,证据链必须一起返回。
- 没有权威目录。 用户名、团队名、拓扑抓来的字符串都会变成 “应用”,图很快被污染。
Netflix 官方在文末给了八条原则,最值得抄的是三条:身份先于一切、本体当代码、用类型系统约束随机工具。其余五条 —— 概念与实例分离、开放标准、富化有序且 best-effort、把人的推理一起建模、人类保留审批权 —— 决定了这套系统能不能从 demo 长成基础设施。
这套架构也不是没有争议。Hacker News 上的讨论就指出,原文提出了 1.5 秒的延迟问题,却没有给出改造前后的量化对比;还有人对 “全局本体是否必要” 提出质疑,认为 Agent 直接调工具、按需拼 schema 也能达到类似效果。这些质疑成立,所以复现时更应该先做一个可测量的子域,用 “排障时长、跨系统查询次数、假设命中率” 三个指标验证,而不是先论证本体有多优雅。Themata.AI
【常见问题】
问题 1:为数十亿事件构建 Agentic Knowledge Graph,真的要把每条事件都存进图吗?
回答 1:不用。每秒 3800 万条是采集层量级,为数十亿事件构建 Agentic Knowledge Graph 存的是事件背后的实体和关系;原始事件留在 MELT 层,图里只保留窗口内的事实、证据和引用。
问题 2:Netflix 的本体驱动可观测性,为什么拒绝泛 Service 类型?
回答 2:因为 Service 在四套工具里含义不同,混在一起就无法跨系统对齐。Netflix 的本体驱动可观测性要求应用只解析为 ops:Application,并用约 4.9 万条软件目录校验,未通过校验的字符串不能成为应用。
问题 3:复现 Netflix 式本体驱动可观测性,最少要投多少人?
回答 3:先做一个域,2—3 人够用:一人管本体与 SHACL,一人管 enricher 与采集,一人管 SPARQL 查询和只读 Agent。复现 Netflix 式本体驱动可观测性的关键不是人数,而是先定权威目录,再谈图的规模。
问题 4:Agentic Knowledge Graph 里的 Agent 能自动修故障吗?
回答 4:Netflix 目前让 Agent 产出带证据的排序假设,人类仍是审批者。Agentic Knowledge Graph 压缩的是拼上下文的时间;自动修复还在演进,官方也只把自动缓解列为下一步,没有放开执行权。
【参考资料】
[2026-11-13](Netflix Turns Operational Data Into a Knowledge Graph for AI-Driven Observability)InfoQ
[2026-10-25](Netflix Builds Observability Ontology and RDF Knowledge Graph to Cut 4-Hour Troubleshooting)XTrends
[2026-10-19](Ontology-Driven Observability: Building an End-to-End Knowledge Graph at Netflix)Themata.AI
[2026-10-18](Netflix Observability Team Discusses Ontology-Driven Knowledge Graph for E2E Monitoring)BrevFeed
[2026-10-16](Ontology-Driven Observability: Building an End-to-End Knowledge Graph at Netflix Scale)Netflix Technology Blog
[2026-10-09](Ontology‐Driven Observability: Building the E2E Knowledge Graph at Netflix Scale)InfoQ
[2026-10-09](From Reactive Alerts to AI-Driven Ontology: Netflix's Knowledge-Graph Observability Stack)CloudNinjas
[2026-05-20](Event Streams vs Centralized Ontologies for Agentic AI)Scalytics
免责声明: 本文依据 Netflix Technology Blog 原文、InfoQ 报道与公开技术文档整理,架构描述与复现建议包含基于公开材料的工程推断,Netflix 未公布完整实现细节与改造前后的量化收益;不同团队的规模、技术栈和合规要求差异较大,落地前请以自有压测和灰度验证为准,本文不构成架构选型或采购建议。
