当前位置: 首页 > news >正文

【RAG】Youtu-GraphRAG

腾讯优图最新rag文章,代码地址github。

Youtu-GraphRAG 在保持最高准确率的同时,将图谱构建的 Token 消耗最高降低了 90.71%,并在多个复杂推理基准测试上实现了最高 16.62% 的准确率提升,显著推动了性能与成本的帕累托前沿。

图谱构造与知识树构建

一、智能体抽取:模式驱动的结构化知识冷启动

核心机制:用图模式 S = 〈Se, Sr, Sattr〉 作为“知识过滤器”,引导LLM仅抽取符合业务语义的结构化三元组,避免噪声。

详细过程与示例

  1. 定义种子模式(Seed Schema)
    在《水浒传》领域,预定义模式如下:

    • Se = {人物, 地点, 组织} (如“史进”、“少华山”、“梁山泊”)
    • Sr = {拜师, 离开, 结拜, 盘踞} (如“史进拜师王进”)
    • Sattr = {职业, 身份, 所在地} (如“史进, 职业, 庄主”)
  2. 模式约束抽取
    LLM智能体读取原文:“史进在少华山落草为寇,与朱武、陈达、杨春结义。”
    仅允许输出符合模式的三元组

    (史进, 盘踞, 少华山)
    (史进, 结拜, 朱武)
    (史进, 身份, 强盗)
    LLM不会输出“落草为寇”这个非模式关系,也不会抽取“结义”这个非模式词汇。

  3. 动态模式扩展
    当遇到新句子:“鲁智深在五台山出家为僧。”
    智能体发现“出家”不在 Sr 中,但语义重要,于是提出扩展:
    ∆Sr = {出家},置信度 µ=0.85 > 阈值0.8模式自动更新
    后续即可抽取:(鲁智深, 出家, 五台山)

  4. 输出结果
    最终生成严格对齐模式的图谱:

    实体集 E: {史进, 鲁智深, 少华山, 五台山...}
    关系集 R: {拜师, 离开, 结拜, 盘踞, 出家...}
    属性集 A: {(史进, 职业, 庄主), (鲁智深, 身份, 和尚)...}
    

工程化提示

  • 初期只需定义5-10个核心实体/关系类型,系统会自动扩展。
  • 用正则或Prompt强制LLM输出 (头, 关系, 尾) 格式,确保结构化。
  • 设置 µ=0.8 作为扩展阈值,平衡召回与噪声。

二、双感知社区检测:结构+语义融合的智能聚类

核心机制:不仅看“谁和谁相连”,更看“他们是否在说同一件事”,通过 ϕ(ei, Cm) = Sr + λ·Ss 打分,实现高质量社区划分。

详细过程与示例

  1. 实体嵌入生成
    对实体“史进”,聚合其所有一跳三元组的嵌入:
    [史进_emb || 拜师_关系_emb || 王进_emb]
    [史进_emb || 盘踞_关系_emb || 少华山_emb]
    → 取平均得到 史进 的最终表征向量。

  2. 初始聚类(结构先行)
    用K-Means将所有实体聚成粗粒度社区。例如:
    社区C1 = {史进, 朱武, 陈达, 杨春, 少华山} (水浒传-少华山派系)
    社区C2 = {鲁智深, 五台山, 智真长老} (水浒传-五台山派系)

  3. 双感知打分(语义校准)
    计算“鲁智深”对 社区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
  4. 社区合并与中心选定

    • 选定每个社区的“中心实体”:C1ϕ 最高的是“史进”,C2 中是“鲁智深”。
    • 合并相似社区:若 C1C3={林冲, 东京} 的中心实体 ϕ 差值 ,则合并为“水浒传-北方好汉”大社区。
  5. 社区摘要生成
    用LLM为 C1 生成描述:

    “以史进为首的少华山四头领,活动于陕西华阴,以劫富济贫为业。”

工程化提示

  • 用Sentence-BERT或text-embedding-3-small生成初始嵌入。
  • λ 设为0.5平衡结构与语义,ϵ 设为0.2控制合并粒度。
  • 社区描述Prompt:“用一句话总结[实体列表]的共同特征和关系。”

三、知识树构建:四层索引支持多粒度推理

核心机制:将双感知社区检测的结果,转化为支持“宏观过滤+微观检索”的树形结构。

详细过程与示例

基于上述社区 C1={史进,朱武,陈达,杨春,少华山},构建四层知识树:

  1. L4 社区层 (宏观摘要)
    节点[社区ID: C1]
    内容:LLM生成的摘要 — “少华山派系,首领史进,成员朱武等,盘踞少华山。”
    用途:回答“水浒传有哪些主要山头?”时,直接返回L4节点。

  2. L3 关键词层 (核心实体)
    节点[关键词: 史进], [关键词: 少华山]ϕ 得分最高的实体)
    内容:实体名 + 简短描述 — “史进:少华山大寨主,原为史家庄少庄主。”
    用途:作为多跳推理的“跳板”,如从“史进”跳到“拜师王进”。

  3. L2 三元组层 (原子事实)
    节点(史进, 盘踞, 少华山), (史进, 结拜, 朱武)
    内容:原始抽取的三元组。
    用途:精确回答事实型问题,如“史进和谁结拜?”

  4. L1 属性层 (细节补充)
    节点(史进, has_attr, {职业: 庄主, 身份: 强盗})
    内容:实体的属性键值对。
    用途:补充实体画像,如“史进的职业是什么?”

中文推理示例

用户问题
“从史进拜师到离开少华山,经历了哪些身份转变?”

知识树检索路径

  1. L4过滤:定位到“少华山派系”社区。
  2. L3跳转:聚焦核心实体“史进”。
  3. L2/L1检索:提取相关三元组与属性:
    (史进, 拜师, 王进) → 身份: 学徒
    (史进, 盘踞, 少华山) → 身份: 强盗
    (史进, has_attr, {原职业: 庄主})
  4. LLM生成答案
    “史进身份转变:庄主 → 王进徒弟 → 少华山强盗。”

工程化提示

  • 用字典树(Trie)或图数据库(如Neo4j)存储四层结构。
  • 检索时优先查L4/L3,命中后再下沉到L2/L1,减少计算开销。
  • 为每层设计专用检索器:L4用社区摘要Embedding,L2用三元组精确匹配。

总结:三模块协同工作流

原始文档
智能体抽取
模式S约束的三元组
双感知社区检测
四层知识树K
多粒度检索
复杂推理答案

您可立即落地的方案

  1. Step 1:用LLM+模式约束抽取,构建干净三元组库。
  2. Step 2:跑双感知聚类(结构Jaccard + 语义Cosine),生成社区。
  3. Step 3:按L4→L1构建四层索引,支持“先宏观后微观”检索。
  4. Step 4:查询时,用同一模式 S 分解问题,匹配对应层级。

此架构在论文中实现 Token消耗降低90.71%,同时准确率提升 16.62%,是成本与性能的最优解。

推理与使用细节


一、模式引导的查询分解:让LLM“按图索骥”

核心思想:利用图模式 S = 〈Se, Sr, Sattr〉 作为“语法检查器”,强制LLM将复杂问题拆解为符合图谱结构的原子子查询,杜绝无效检索。

详细过程与中文示例

  1. 输入解析
    用户查询:“探索者到达的那个城市,其总部所在的组织,规模必须比Vilaiyaadu Mankatha的唱片公司更大。请问探索者是何时到达该城市的?”

  2. 模式对齐分解
    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: ?)

  3. 模式约束作用

    • 防止LLM错误分解,例如不会生成 (Vilaiyaadu Mankatha, LOCATED_IN, 唱片公司) 这种违反模式的查询(因为“唱片公司”不是 LOCATION 类型)。
    • 确保所有子查询都能在图谱中找到结构化路径。

工程化提示

  • 在Prompt中显式传入图模式:你只能使用以下实体类型{...}、关系类型{...}进行分解。
  • 用正则表达式校验输出格式,确保每个子查询是 (头, 关系, 尾)(实体, has_attr, 属性)
  • 设置最大子查询数 i=5,防止过度分解。

二、迭代式推理与反思:让智能体“边走边想”

核心思想:将检索过程建模为一个“感知-推理-行动-反思”的闭环。智能体不仅执行检索,还会评估结果质量并动态调整策略。

详细过程与中文示例

  1. 智能体初始化
    定义智能体 A = 〈S, H, fLLM〉

    • S:图模式(用于约束推理)。
    • H:历史记忆(初始为空)。
    • fLLM:执行推理与反思的LLM。
  2. 第一轮:推理与检索

    • 输入:子查询 q2: 哪些组织的规模比Vilaiyaadu Mankatha大?
    • 推理A(1) = fLLM(q2, H0) → 规划行动:“执行三元组匹配,查找 (ORG, COMPARED_TO, Vilaiyaadu_Mankatha)”。
    • 检索结果:返回 {ORG_A, ORG_B}
    • 更新历史H1 = H0 + [检索到ORG_A, ORG_B]
  3. 第二轮:反思与修正

    • 输入:子查询 q3: 探索者何时到达该城市? + 历史 H1
    • 反思A(2) = fLLM(q3, H1) → 评估:“我需要先知道‘该城市’是哪个。H1中只有组织名,没有城市名。我需要先执行q2的第二部分。”
    • 修正行动:生成新子查询 q2.1: ORG_A的总部在哪个城市? → 执行社区过滤或三元组匹配。
    • 检索结果:返回 LOCATION_P
    • 更新历史H2 = H1 + [ORG_A总部在LOCATION_P]
  4. 第三轮:最终推理

    • 输入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. 子查询1: “Vilaiyaadu Mankatha的唱片公司规模是多少?”

    • 适用策略:实体匹配 (Entity Matching)
    • 公式: argmax cos(e, qi)
    • 说明: 这是一个典型的单跳、精确查找问题。系统会直接在图谱中查找实体“Vilaiyaadu Mankatha”,并匹配其 REVENUE(收入/规模)属性。这是最直接、最高效的检索方式。
  2. 子查询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. 子查询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 能够像一个经验丰富的侦探,针对不同类型的“线索”(子查询),灵活调用不同的“调查手段”(检索策略),从而在复杂的知识图谱中高效、精准地找到最终答案。

http://www.dtcms.com/a/390006.html

相关文章:

  • 惠普LaserJet Pro M203dn黑白激光打印机双面卡纸维修一例
  • 专题二 二叉树中的深度优先搜索
  • Git 多人协作(1)
  • 设计模式第三章(迭代器模式)
  • 网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)
  • 密钥下发服务中心:双重验证 + 实时监控的轻量级密钥管理解决方案
  • 硬件 - RK3588部分(4) - 原理图 - RK806
  • Sass开发【三】
  • 百度之星2025(第二场)
  • Ovis-U1:阿里巴巴推出的统一的多模态理解与生成模型
  • 深入剖析C++智能指针:unique_ptr与shared_ptr的资源管理哲学
  • 创建索引失败,表一直查询不了
  • 知识分享:网线和DB9正确接线方法
  • 【算法笔记】前缀树
  • 让ai完成原神调酒 试做
  • 第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(2、拼写单词)
  • 私有化部署UE像素流后,通过实时云渲染平台配置网络端口,实现云推流内网及公网访问
  • Day 05 Geant4多线程 Multithreading --------以B1为例
  • 【word解析】从 Word 提取数学公式并渲染到 Web 页面的完整指南
  • FreeRTOS 队列机制详解:阻塞、唤醒与任务同步
  • Unity学习之UI优化总结
  • 基于微信小程序蓝牙信标 (Beacon)的室内导航实例
  • 用Comate Zulu开发一款微信小程序
  • 触觉智能Purple Pi OH2开发板配置参数
  • 鸿蒙Next应用文件管理全攻略:从基础操作到高级实践
  • 云手机对《黑神话:悟空》的作用都有哪些?
  • Leetcode 994. 腐烂的橘子 多源 BFS
  • 微硕WSP4982双N沟MOSFET,赋能汽车智能座椅通风系统
  • BMP280 气压计驱动
  • 速通ACM省铜第八天 赋源码(1709)