【RAG】Youtu-GraphRAG
腾讯优图最新rag文章,代码地址github。
Youtu-GraphRAG 在保持最高准确率的同时,将图谱构建的 Token 消耗最高降低了 90.71%,并在多个复杂推理基准测试上实现了最高 16.62% 的准确率提升,显著推动了性能与成本的帕累托前沿。
图谱构造与知识树构建
一、智能体抽取:模式驱动的结构化知识冷启动
核心机制:用图模式 S = 〈Se, Sr, Sattr〉
作为“知识过滤器”,引导LLM仅抽取符合业务语义的结构化三元组,避免噪声。
详细过程与示例
-
定义种子模式(Seed Schema)
在《水浒传》领域,预定义模式如下:Se = {人物, 地点, 组织}
(如“史进”、“少华山”、“梁山泊”)Sr = {拜师, 离开, 结拜, 盘踞}
(如“史进拜师王进”)Sattr = {职业, 身份, 所在地}
(如“史进, 职业, 庄主”)
-
模式约束抽取
LLM智能体读取原文:“史进在少华山落草为寇,与朱武、陈达、杨春结义。”
仅允许输出符合模式的三元组:(史进, 盘踞, 少华山)
(史进, 结拜, 朱武)
(史进, 身份, 强盗)
LLM不会输出“落草为寇”这个非模式关系,也不会抽取“结义”这个非模式词汇。 -
动态模式扩展
当遇到新句子:“鲁智深在五台山出家为僧。”
智能体发现“出家”不在Sr
中,但语义重要,于是提出扩展:
∆Sr = {出家}
,置信度µ=0.85 > 阈值0.8
→ 模式自动更新。
后续即可抽取:(鲁智深, 出家, 五台山)
-
输出结果
最终生成严格对齐模式的图谱:实体集 E: {史进, 鲁智深, 少华山, 五台山...} 关系集 R: {拜师, 离开, 结拜, 盘踞, 出家...} 属性集 A: {(史进, 职业, 庄主), (鲁智深, 身份, 和尚)...}
工程化提示:
- 初期只需定义5-10个核心实体/关系类型,系统会自动扩展。
- 用正则或Prompt强制LLM输出
(头, 关系, 尾)
格式,确保结构化。 - 设置
µ=0.8
作为扩展阈值,平衡召回与噪声。
二、双感知社区检测:结构+语义融合的智能聚类
核心机制:不仅看“谁和谁相连”,更看“他们是否在说同一件事”,通过 ϕ(ei, Cm) = Sr + λ·Ss
打分,实现高质量社区划分。
详细过程与示例
-
实体嵌入生成
对实体“史进”,聚合其所有一跳三元组的嵌入:
[史进_emb || 拜师_关系_emb || 王进_emb]
[史进_emb || 盘踞_关系_emb || 少华山_emb]
→ 取平均得到史进
的最终表征向量。 -
初始聚类(结构先行)
用K-Means将所有实体聚成粗粒度社区。例如:
社区C1 = {史进, 朱武, 陈达, 杨春, 少华山}
(水浒传-少华山派系)
社区C2 = {鲁智深, 五台山, 智真长老}
(水浒传-五台山派系) -
双感知打分(语义校准)
计算“鲁智深”对社区C1
的亲和力:- 结构感知
Sr
:鲁智深的关系{出家, 离开}
与C1的关系{盘踞, 结拜}
重叠度低 →Sr=0.1
- 语义感知
Ss
:鲁智深的嵌入与C1中心嵌入的余弦相似度 →Ss=0.3
- 总分
ϕ = 0.1 + 0.5*0.3 = 0.25
(设λ=0.5)
计算“史进”对
社区C1
的亲和力:Sr
:关系高度重合 →Sr=0.8
Ss
:语义高度相似 →Ss=0.7
ϕ = 0.8 + 0.5*0.7 = 1.15
- 结构感知
-
社区合并与中心选定
- 选定每个社区的“中心实体”:
C1
中ϕ
最高的是“史进”,C2
中是“鲁智深”。 - 合并相似社区:若
C1
与C3={林冲, 东京}
的中心实体ϕ
差值<ϵ
,则合并为“水浒传-北方好汉”大社区。
- 选定每个社区的“中心实体”:
-
社区摘要生成
用LLM为C1
生成描述:“以史进为首的少华山四头领,活动于陕西华阴,以劫富济贫为业。”
工程化提示:
- 用Sentence-BERT或text-embedding-3-small生成初始嵌入。
λ
设为0.5平衡结构与语义,ϵ
设为0.2控制合并粒度。- 社区描述Prompt:“用一句话总结[实体列表]的共同特征和关系。”
三、知识树构建:四层索引支持多粒度推理
核心机制:将双感知社区检测的结果,转化为支持“宏观过滤+微观检索”的树形结构。
详细过程与示例
基于上述社区 C1={史进,朱武,陈达,杨春,少华山}
,构建四层知识树:
-
L4 社区层 (宏观摘要)
节点:[社区ID: C1]
内容:LLM生成的摘要 — “少华山派系,首领史进,成员朱武等,盘踞少华山。”
用途:回答“水浒传有哪些主要山头?”时,直接返回L4节点。 -
L3 关键词层 (核心实体)
节点:[关键词: 史进]
,[关键词: 少华山]
(ϕ
得分最高的实体)
内容:实体名 + 简短描述 — “史进:少华山大寨主,原为史家庄少庄主。”
用途:作为多跳推理的“跳板”,如从“史进”跳到“拜师王进”。 -
L2 三元组层 (原子事实)
节点:(史进, 盘踞, 少华山)
,(史进, 结拜, 朱武)
内容:原始抽取的三元组。
用途:精确回答事实型问题,如“史进和谁结拜?” -
L1 属性层 (细节补充)
节点:(史进, has_attr, {职业: 庄主, 身份: 强盗})
内容:实体的属性键值对。
用途:补充实体画像,如“史进的职业是什么?”
中文推理示例
用户问题:
“从史进拜师到离开少华山,经历了哪些身份转变?”
知识树检索路径:
- L4过滤:定位到“少华山派系”社区。
- L3跳转:聚焦核心实体“史进”。
- L2/L1检索:提取相关三元组与属性:
(史进, 拜师, 王进) → 身份: 学徒
(史进, 盘踞, 少华山) → 身份: 强盗
(史进, has_attr, {原职业: 庄主})
- LLM生成答案:
“史进身份转变:庄主 → 王进徒弟 → 少华山强盗。”
工程化提示:
- 用字典树(Trie)或图数据库(如Neo4j)存储四层结构。
- 检索时优先查L4/L3,命中后再下沉到L2/L1,减少计算开销。
- 为每层设计专用检索器:L4用社区摘要Embedding,L2用三元组精确匹配。
总结:三模块协同工作流
您可立即落地的方案:
- Step 1:用LLM+模式约束抽取,构建干净三元组库。
- Step 2:跑双感知聚类(结构Jaccard + 语义Cosine),生成社区。
- Step 3:按L4→L1构建四层索引,支持“先宏观后微观”检索。
- Step 4:查询时,用同一模式
S
分解问题,匹配对应层级。
此架构在论文中实现 Token消耗降低90.71%,同时准确率提升 16.62%,是成本与性能的最优解。
推理与使用细节
一、模式引导的查询分解:让LLM“按图索骥”
核心思想:利用图模式 S = 〈Se, Sr, Sattr〉
作为“语法检查器”,强制LLM将复杂问题拆解为符合图谱结构的原子子查询,杜绝无效检索。
详细过程与中文示例
-
输入解析
用户查询:“探索者到达的那个城市,其总部所在的组织,规模必须比Vilaiyaadu Mankatha的唱片公司更大。请问探索者是何时到达该城市的?” -
模式对齐分解
LLM智能体读取模式S
:Se = {PERSON, ORGANIZATION, LOCATION}
Sr = {LOCATED_IN, HEADQUARTER_OF, COMPARED_TO}
Sattr = {NAME, REVENUE, TIME}
根据模式,将原查询分解为三个原子子查询:
q1: Vilaiyaadu Mankatha的唱片公司规模是多少? →
(Vilaiyaadu Mankatha, has_attr, {REVENUE: ?})
q2: 哪些组织的规模比它大?其总部在哪个城市? →(ORG_X, COMPARED_TO, Vilaiyaadu_Mankatha_Record_Label) ∧ (ORG_X, HEADQUARTER_OF, LOCATION_Y)
q3: 探索者何时到达该城市? →(PERSON_Z, NAME, "explorer") ∧ (PERSON_Z, VISITS, LOCATION_Y, TIME: ?)
-
模式约束作用
- 防止LLM错误分解,例如不会生成
(Vilaiyaadu Mankatha, LOCATED_IN, 唱片公司)
这种违反模式的查询(因为“唱片公司”不是LOCATION
类型)。 - 确保所有子查询都能在图谱中找到结构化路径。
- 防止LLM错误分解,例如不会生成
工程化提示:
- 在Prompt中显式传入图模式:
你只能使用以下实体类型{...}、关系类型{...}进行分解。
- 用正则表达式校验输出格式,确保每个子查询是
(头, 关系, 尾)
或(实体, has_attr, 属性)
。 - 设置最大子查询数
i=5
,防止过度分解。
二、迭代式推理与反思:让智能体“边走边想”
核心思想:将检索过程建模为一个“感知-推理-行动-反思”的闭环。智能体不仅执行检索,还会评估结果质量并动态调整策略。
详细过程与中文示例
-
智能体初始化
定义智能体A = 〈S, H, fLLM〉
:S
:图模式(用于约束推理)。H
:历史记忆(初始为空)。fLLM
:执行推理与反思的LLM。
-
第一轮:推理与检索
- 输入:子查询
q2: 哪些组织的规模比Vilaiyaadu Mankatha大?
- 推理:
A(1) = fLLM(q2, H0)
→ 规划行动:“执行三元组匹配,查找(ORG, COMPARED_TO, Vilaiyaadu_Mankatha)
”。 - 检索结果:返回
{ORG_A, ORG_B}
。 - 更新历史:
H1 = H0 + [检索到ORG_A, ORG_B]
- 输入:子查询
-
第二轮:反思与修正
- 输入:子查询
q3: 探索者何时到达该城市?
+ 历史H1
- 反思:
A(2) = fLLM(q3, H1)
→ 评估:“我需要先知道‘该城市’是哪个。H1中只有组织名,没有城市名。我需要先执行q2的第二部分。” - 修正行动:生成新子查询
q2.1: ORG_A的总部在哪个城市?
→ 执行社区过滤或三元组匹配。 - 检索结果:返回
LOCATION_P
。 - 更新历史:
H2 = H1 + [ORG_A总部在LOCATION_P]
- 输入:子查询
-
第三轮:最终推理
- 输入:
q3
+H2
- 推理:
A(3) = fLLM(q3, H2)
→ 规划:“查找(explorer, VISITS, LOCATION_P, TIME: ?)
”。 - 检索结果:返回
TIME=1851年
。 - 终止:所有子查询解决,生成最终答案。
- 输入:
工程化提示:
- 为“反思”设计专用Prompt:“请评估当前检索结果是否足以回答问题。如果不充分,请指出缺失的信息并生成新的检索指令。”
- 设置最大迭代轮数(如3轮),防止无限循环。
- 在历史
H
中记录检索到的实体ID和关系,便于后续精确匹配。
三、多路径并行检索:四种武器,各司其职
核心思想:Youtu-GraphRAG 不依赖单一的检索方法,而是根据原子子查询 qi
的语义和结构特征,并行启动四种不同的检索策略。这种“分而治之”的策略确保了无论是简单事实查找还是复杂多跳推理,都能找到最优的检索路径。
详细过程与原文示例
论文在第3.3节 “Multi-Route Retrieval” 中明确提出了四种并行检索路径,并在图4中给出了一个贯穿全文的核心示例来阐释其工作方式。
原文核心示例(中文转写)
用户原始复杂查询:
“探索者到达的那个城市,其总部所在的组织,规模必须比Vilaiyaadu Mankatha的唱片公司更大。请问探索者是何时到达该城市的?”
这个查询被“模式引导的查询分解器”分解为三个原子子查询后,系统会为每个子查询选择或并行执行最适合的检索策略:
-
子查询1: “Vilaiyaadu Mankatha的唱片公司规模是多少?”
- 适用策略:实体匹配 (Entity Matching)
- 公式:
argmax cos(e, qi)
- 说明: 这是一个典型的单跳、精确查找问题。系统会直接在图谱中查找实体“Vilaiyaadu Mankatha”,并匹配其
REVENUE
(收入/规模)属性。这是最直接、最高效的检索方式。
-
子查询2: “哪些组织的规模比它大?其总部在哪个城市?”
- 适用策略:三元组匹配 (Triple Matching)
- 公式:
argmax cos((eh, r, et), qi)
- 说明: 这个查询涉及关系推理(“规模更大”对应
COMPARED_TO
关系,“总部所在”对应HEADQUARTER_OF
关系)。系统会查找符合(ORG_X, COMPARED_TO, Vilaiyaadu_Mankatha_Record_Label)
和(ORG_X, HEADQUARTER_OF, LOCATION_Y)
模式的三元组。通过匹配整个三元组的语义嵌入,能更精准地捕捉关系。
-
子查询3: “探索者何时到达该城市?”
- 适用策略:DFS路径遍历 (DFS Path Traversal)
- 公式:
P(qi) = e0 →r1 e1 →r2 ... →rn en s.t. ∀ri ∈ R, n ≤ d
- 说明: 这是一个典型的多跳、多约束推理问题。它需要将前面检索到的结果(城市
LOCATION_Y
)作为起点,寻找满足(PERSON_Z, NAME, "explorer") ∧ (PERSON_Z, VISITS, LOCATION_Y, TIME: ?)
的路径。系统会在图谱上执行深度优先搜索(DFS),沿着关系边进行跳转,直到找到满足所有约束的完整路径。论文中设定最大深度d=5
以控制计算复杂度。
第四种策略:社区过滤 (Community Filtering)
- 公式:
argmax cos(eCm, qi)
- 适用场景: 虽然在上述例子中未直接体现,但论文明确指出,此策略用于处理“全局性、总结性”问题。
- 原文说明: “Community Filtering aims to address global queries, e.g., summarization and cross-domain problems through top-down filtering in the cluster.”
- 潜在应用示例: 如果用户查询是“总结所有与音乐产业相关的公司及其总部所在地”,系统会直接检索L4社区层(如“音乐产业”社区),然后向下遍历获取其包含的所有组织及其属性,避免了对海量底层三元组的逐一扫描。
总结:策略选择逻辑
检索策略 | 何时使用 | 原文示例中的体现 |
---|---|---|
实体匹配 | 精确查找单个节点或其属性。 | 查找“Vilaiyaadu Mankatha”的规模。 |
三元组匹配 | 推理实体间的关系,解决少跳问题。 | 查找“规模更大的公司”和“其总部”。 |
DFS路径遍历 | 解决需要多跳、多约束的复杂推理问题。 | 查找“探索者访问该城市的时间”。 |
社区过滤 | 回答需要全局摘要或跨大量实体的宏观问题。 | (示例中未直接使用,用于全局性问题) |
通过这种多路径并行检索机制,Youtu-GraphRAG 能够像一个经验丰富的侦探,针对不同类型的“线索”(子查询),灵活调用不同的“调查手段”(检索策略),从而在复杂的知识图谱中高效、精准地找到最终答案。