课程笔记:吴恩达 Building Agentic Knowledge Graph

知识图谱RAGGraphRAGAgentAndrew Ng

Building Agentic Knowledge Graph

Building Agentic Knowledge Graph

最近翻到一份材料,主题是"怎么用多 Agent 系统把企业的结构化数据和非结构化数据合并成一张图,再用来做检索增强"。这份材料配套的实操基于一家图数据库厂商的产品,演示比较完整,但本文想把背后的概念和架构思路整理出来——只保留与"图"这个抽象概念有关的部分,不展开产品名,也不复刻具体代码。

这篇能给你什么

 一套从关系表到图的认知升级路径
 一份 AI 时代"为什么 RAG 仍然不够用"的拆解
 一个把结构化业务、非结构化文本、抽取事实拼成同一张图的三层方案
 一份多 Agent 怎么分工、哪些工作交给 LLM、哪些工作交给确定性工具的设计框架

一、为什么关系表开始跟不上 AI

要谈"图"为什么会出现,先要回答一个老问题:关系表里"关系"是什么?

构造一个最朴素的例子:一张 Person 表、一张 Product 表、一张 Person-Product 关联表。想问"ABK 买过哪些产品",就要从 Person 找 ABK,连一次关联表,再连 Product,得到椅子、灯和桌子。一次 JOIN,能搞定。

接着问"还有谁买过 ABK 买过的产品",要从 ABK 连到产品,再经关联表反向连到其他人。两次 JOIN,也能搞定。

再问"应该向 ABK 推荐什么新产品"——这就是协同过滤了:先找 ABK 买过的产品,再找也买过这些产品的人,再找这些人还买过、但 ABK 没买过的产品,把差集推给他。三步要走多次 JOIN,问题越深、步数越多。

问题不是"算不出来"。问题是:关系表里"人购买产品"只是 Person-Product 关联表里的一行。它是查询时拼出来的实现细节,不是数据本身。 问题越深,需要的 JOIN 越多,查询语句越长,可读性越差,调试和改写的成本都跟着涨。

关键判断

:当一个系统的核心价值变成"沿关系做判断",把关系作为隐藏的关联表是不合适的。 

图的处理方式不一样——它把"人购买产品"这种关系直接升成结构里的一等数据:

<span leaf="">(ABK:Person)-[:PURCHASED]-&gt;(Chair:Product) (E:Person)-[:PURCHASED]-&gt;(Chair:Product) (E:Person)-[:PURCHASED]-&gt;(Couch:Product)</span>

“ABK 买过椅子"不再是某个查询要现拼的产物,它就是图里一条带类型的边。

查询语言也跟着换。Cypher(或任何等价的图查询语言)被设计成"如果 SQL 具有图模式匹配能力”:圆括号表示节点,方括号和箭头表示有方向、有类型的关系。一个推荐查询可以写成:

<span leaf="">MATCH (abk:Person {name: 'ABK'})-[:PURCHASED]-&gt;(common:Product) &nbsp; &nbsp; &nbsp; &lt;-[:PURCHASED]-(other:Person)-[:PURCHASED]-&gt;(candidate:Product) WHERE NOT (abk)-[:PURCHASED]-&gt;(candidate) RETURN candidate</span>

这段查询同时表达了三件事:

必须存在的路径:ABK 买过某产品,另一个人也买过它
继续存在的路径:另一个人还买过候选产品
必须不存在的路径:ABK 没买过该候选产品

一个观察

:Cypher 的结构化模式很接近自然语言,所以适合跟 LLM 结合——LLM 可以更自然地把用户问题翻译成节点和关系模式,而不是硬挤出 SQL。这也是后来 GraphRAG 路线能跑通的语言学基础。 

关系表里&quot;关系&quot;是 JOIN 时拼出来的实现细节,图里&quot;关系&quot;是一等数据

关系表里"关系"是 JOIN 时拼出来的实现细节,图里"关系"是一等数据

一句话总结:关系表把"关系"藏在 JOIN 里;图把"关系"作为一等数据,路径是结构本身。

二、RAG 为什么仍然不够用

关系表是上一代系统的事。AI 时代主流的检索方案是 RAG——文档分块、计算 embedding、存进向量库、按相似度召回,再交给 LLM 生成答案。

RAG 在很多问答场景里有效,但它的天花板也很明显:召回给 LLM 的是"相似文本",不是"结构化路径"。

举一个具体例子。用户问"这把椅子腿为什么总松"。

 理想回答:沿着 产品 → 部件 → 物料记录 → 供应商 追到根因。
 传统 RAG 给的:跟"椅子腿松动"语义最像的几段评论。

这几段评论能告诉 LLM"确实有这个问题",但告诉不了 LLM"这个问题跟哪个供应商的那批次椅腿有关"。

核心矛盾

:在准确性要求高、需要追溯根因的场景里,“相似"和"相关"经常不是一回事。 

GraphRAG 就是冲着这个问题来的。它在传统 RAG 之上加了三层能力:

1. 从 chunk 中抽取产品、订单、交付问题、产品缺陷等实体

2. 把 chunk 和这些实体用关系连接起来

3. 把文本里的实体继续连接到 CSV 等结构化数据中的业务实体

一个能同时存四样东西的图:原始文本 chunk、chunk 的向量表示、结构化的业务节点和关系、从文本里抽出的实体和事实。查询时既可以走向量相似度,也可以走结构化模式匹配,两种召回方式可以组合。

升级后的能力

:给 LLM 的上下文,从"相似文本片段"升级为 “相似文本 + 结构化路径”。在准确性要求高、需要追溯根因的场景里,这个差别很大。 

传统 RAG 只召回相似文本片段,GraphRAG 同时召回文本和结构化路径

传统 RAG 只召回相似文本片段,GraphRAG 同时召回文本和结构化路径

一句话总结:传统 RAG 召回"相似文本”,根因分析时缺一条能沿着走的路径;GraphRAG 把这条路径补回来。

三、AI 真正需要一张什么样的图:把结构和文本拼起来

理解了关系表的局限和 RAG 的不足,下一步就是回答那个真正难的问题:一张能用的图到底长什么样?

如果只能记一个观察,我会记这个——最终的图不是单一结构,而是三层相互连接的子层

| 层级

|

名字

|

承载内容

Domain 层

业务

|

已知结构(产品、部件、供应商)

| | Lexical 层 |

文本

|

原始文档、分块、嵌入

| | Subject 层 |

事实

|

主-谓-宾 抽取结果

|

三层是相互连接的——这才是跟"只用一种结构"的关键区别。

Domain 层(业务)

由 CSV 等结构化数据构建,表达企业已知、结构明确的业务事实。比如产品、部件、供应商之间的关系:

<span leaf="">(Product)-[:HAS_PART]-&gt;(Part)-[:SUPPLIED_BY]-&gt;(Supplier)</span>

它适合用确定的模式匹配查询。它代表的是"我们已知并能直接做模式匹配的结构化数据"

Lexical 层(文本)

由 Markdown 评论构建,保留原始文本和分块结构。它包含:

 Document 节点
 Chunk 节点
 文档和分块的从属关系
 分块之间可能的次序关系
 每个分块的 embedding

Lexical 层的目的不是把文本强行变成固定业务 Schema,而是保留文档、分块和语义检索的基础

Subject 层(事实)

是连接结构化和非结构化世界的。系统从 chunk 中抽取出实体和事实,以"主语-谓语-宾语"形式表达,比如:

<span leaf="">ABK --LOVES--&gt; Table User123 --REPORTS_DEFECT_IN--&gt; ChairLeg</span>

从评论抽出的 Table 或 ChairLeg 还可以链接到 Domain 层里真实的 Product 或 Part 节点。

三层贯通

三层贯通之后的完整路径是:

<span leaf="">Document -&gt; Chunk -&gt; 抽出的实体 -&gt; Product -&gt; Part -&gt; Supplier</span>

关键洞察

:一条"椅子腿松动"的评论,沿着这条路走——
从 Document 到 Chunk,从 Chunk 抽出 ChairLeg 这个实体,ChairLeg 链接到 Domain 层里的 Part 节点,Part 又通过 SUPPLIED_BY 关系链到具体的 Supplier。
一段文本就这样变成了一个可追溯的根因链路。

Domain / Lexical / Subject 三层图 + 从 Document 沿贯通路径追到 Supplier

Domain / Lexical / Subject 三层图 + 从 Document 沿贯通路径追到 Supplier

一句话总结:关系表只表达一类数据,传统 RAG 只召回一类相似性,图把这两类接成同一张可查询的结构,让查询同时跨层走。

四、这张图怎么造:Agent 做判断,工具做执行

知道了图长什么样,下一个问题是:怎么造?

这个问题的答案很反直觉——造图这件事不适合一次性自动化,适合让 Agent 提议、用工具执行。下面把"为什么"和"怎么分工"拆开讲。

Agent 是什么

从工程角度把 Agent 定义为"一种新的、较高级的控制流操作符"。其本质循环是:

<span leaf="">用户/环境输入 &nbsp; &nbsp; -&gt; 调用 LLM 做判断 &nbsp; &nbsp; -&gt; LLM 选择动作或工具 &nbsp; &nbsp; -&gt; 程序中的 dispatcher 执行动作 &nbsp; &nbsp; -&gt; 执行结果回到上下文 &nbsp; &nbsp; -&gt; LLM 再判断 &nbsp; &nbsp; -&gt; 直到产生最终响应</span>

关键边界

推理由 LLM 完成,真正产生外部效果的动作由代码执行。
这条边界决定了 Agent 系统的成本、可靠性和可调试性。模糊这条边界的系统,多半会出问题。 

优点:LLM 能做推理、工具能执行任何代码能做的事、主要靠自然语言指令定义行为
代价:远程 LLM 调用慢、行为不确定、生产规模下 token 成本会迅速累积

多 Agent 蓝图

要造一张图,单 Agent 撑不住完整流程。多 Agent 是必要的,因为造图涉及多个判断:

 哪些文件值得导入?
 业务该用什么节点和关系?
 文本里要抽哪些实体类型和事实类型?
 不同判断之间怎么对齐?

一份合理的蓝图是这样的:

顶层协调 Agent:介绍系统能力、引导用户走完整流程、判断当前处于哪个工作流、把具体任务委派给下面的工作流 Agent
结构化数据工作流:把 CSV 从"用户想做什么"推到"形成模型构建计划"
非结构化数据工作流:把 Markdown 从"用户想做什么"推到"形成知识抽取计划"
GraphRAG 工作流:在结构构建完成后帮用户基于模型回答问题

每条工作流内部再分三个 Agent:

| Agent

|

职责

User Intent Agent

澄清业务目标

| | File Suggestion Agent |

根据目标挑出真正相关的文件

| | Schema Proposal / Entity-Fact Proposal Agent |

提出结构方案

|

还有一个关键技巧是 critic pattern:不是只用一个 Agent 提方案,而是用一对 Agent——Proposal 提方案、Critic 挑问题,两者循环迭代。这能显著提高方案质量,因为单一 Agent 容易陷入"自我合理化"。

计划 vs 执行

所有这些 Agent 的输出都汇聚成两份计划:

结构构建计划(怎么把结构化数据转成节点、关系和属性)
知识抽取计划(怎么从文本里抽实体和事实)

然后由一个确定性工具接收这两份计划,遍历文件、分块、计算 embedding、执行查询、创建节点和关系。这个工具不调 LLM,按计划批量执行。

顶层协调 Agent 分发任务到三条工作流,最终由确定性工具按计划执行

顶层协调 Agent 分发任务到三条工作流,最终由确定性工具按计划执行

最重要的设计思想

Agent 做开放式理解、选择、提议和批评;确定性工具按已经批准的计划批量执行数据搬迁。
两类角色的边界划清楚,单个 Agent 的复杂度、整个系统的成本、可靠性和可调试性都好控制。
把这条边界反过来——让 Agent 直接搬数据——通常会同时撞上成本失控、结果不可复现、调试无从下手三面墙。 

实施时需要把控的几个细节

不管用什么 Agent 框架(Google ADK、LangGraph、Autogen 等),实施时都绕不开这几件事:

工具 docstring 要写得像接口文档:在 Agent 系统里,docstring 不是给开发者看的,是给 LLM 看的工具说明
外部查询必须用参数化:Cypher、SQL 都不能字符串拼接,必须用参数化查询,否则就是注入漏洞
必须看事件轨迹,不能只看最后答案:只读 final response 看不到是否委派给了正确 Agent、参数是否正确抽取、状态是谁写入的
会话状态不等于可信知识:状态字典解决"跨 Agent 跨轮次保留信息",但不解决来源、准确性、冲突——典型表现就是 LLM 从用户话语里猜错姓名并把猜测写进共享状态,下一个 Agent 再从状态里读出来用

七条带走的原则

 1. 业务目标先于图的 Schema。先想清楚要回答什么问题,再决定哪些节点和关系值得构建。
2. 结构化数据和非结构化数据不能用同一种导入方法
3. Subject 层是两类数据的语义桥梁——只做文本向量化不能自然追到业务主数据,只做业务模型又用不上评论里的自然语言事实。
4. Agent 做判断,工具做执行。LLM 负责开放式理解,代码负责确定性搬迁。
5. 多 Agent 的接口约定。description 决定其他 Agent 什么时候把工作交给它,instruction 决定它接手以后怎么完成工作,tool docstring 决定它如何理解和调用工具。
6. 必须看事件轨迹,不能只看最后答案
7. 记忆是共享状态,不等于可信知识。 

收尾

回头看这四个核心问题:

 关系表为什么跟不上 AI?——因为关系是 JOIN 拼出来的,不是数据本身
 RAG 为什么不够用?——因为召回"相似文本"不够支撑根因分析,需要"相似文本 + 结构化路径"
 AI 真正需要什么结构?——Domain / Lexical / Subject 三层图,三层贯通
 怎么造这张图?——Agent 做开放式判断,工具按批准的计划执行数据搬迁

这四个问题合在一起,构成了我对这份材料的核心理解。具体怎么从 CSV 走到最终的三层图谱、怎么调 embedding 模型、怎么对齐文本实体和业务实体、怎么评估 GraphRAG 召回质量——这些问题在原始材料里也只是方案层面,没有具体到能直接落地的细节。要真正造出生产可用的图,需要在这些架构骨架上继续往里填工程实现。

【延伸阅读】

相关阅读

RAG vs 微调 vs 本体:企业知识管理三条路,该走哪条?

数据治理做了十年,AI 时代要推翻重来,还是终于能用上了?

别把本体做成一次性项目:AI 时代需要 Loop 化运营

写了三个月本体文章之后,我写了一本书

ReAct:所有 AI Agent 的设计起点

近期新文

穿透式监管·华尔街篇:一个韭菜,怎么看穿 AI 顶级资本局

我 Vibe Coding 了我的第一个应用

卡帕西的Wiki到底在讲什么?

经典热文

工作流和 Logic,到底是不是同一个东西?

企业AI的规模化鸿沟:小规模跑通了,为什么一铺开就不对了

一个人就是一支团队:如何用 Claude Code 搭建你的 AI Agent 军团