微信扫码
与创始人交个朋友
我要投稿
GraphRAG(Graph Retrieval-Augmented Generation)是一种将知识图谱与检索增强生成相结合的方法。它在传统 RAG 的基础上,引入了图结构和社区检测等方法,以提高对复杂数据的理解和生成能力。GraphRAG 利用大型语言模型从非结构化文本中提取实体、关系和摘要,构建知识图谱,然后利用图结构进行高效的检索和问答。
GraphRAG 分为两个主要阶段:索引阶段(Indexing Phase) 和 查询阶段(Query Phase)。
步骤概览:
文档分块(Chunking):
将源文档分割成较小的子文档(如300个token),并设置一定的重叠部分(如100个token),确保在分块过程中尽可能保留上下文信息。
并行抽取:
实体抽取: 使用自然语言处理技术,从每个文本块中识别出关键实体,如人物、地点、组织、事件等。
关系抽取: 分析文本块,发现实体之间的关系,即这些实体是如何相互关联的。
构建知识图谱(Knowledge Graph):
将所有抽取的实体作为节点,关系作为边,构建一个全局的知识图谱。
这个图谱展示了文档中所有实体和它们之间的复杂关系。
社区检测(Community Detection):
使用图算法(如模块度优化)在知识图谱中识别出不同的社区。
每个社区代表一组紧密相关的实体和关系,反映了文档中的特定主题或情节。
层次化摘要生成(Hierarchical Summarization):
第一级摘要(细节级): 针对每个社区,生成包含详细信息的摘要。
第二级摘要(中等粒度): 将相关社区组合,生成更广泛主题的摘要。
第三级摘要(全局级): 生成整个文档的整体摘要,提供高层次的概览。
注: 使用 reduce-map 方式,从底层摘要逐步组合,生成上层摘要,确保摘要的连贯性和完整性。
在 GraphRAG 中,构建知识图谱后,会对图谱进行社区检测,产生层次化的社区结构。这些社区按照不同的层次进行划分,以便于在不同的抽象级别上对文档内容进行组织和概括。具体来说:
Root Level C0(根级别 C0):
对于一本小说,C0 级别的摘要会描述小说的主要情节、核心主题和整体框架。
对于技术文档,C0 级别会概述整个文档的目的、范围和关键要点。
含义:这是最高层次的社区级别,代表整个知识图谱或文档的全局视图。
作用:提供对整个文档的整体概括和摘要,突出全局主题和主要内容。
High Level C1(高级别 C1):
在小说中,C1 级别的社区可能对应于主要的故事线、重要角色的发展或关键事件。
在技术文档中,C1 级别可能对应于主要章节,如“安装指南”、“功能介绍”、“常见问题解答”等。
含义:这是次一级的社区级别,将知识图谱划分为若干主要社区,每个社区代表文档中的一个重要部分、主题或章节。
作用:提供对主要主题或部分的概要描述,比根级别更具体,但仍然保持一定的抽象层次。
示例:
Low Level C3(低级别 C3):
对于小说,C3 级别的社区可能对应于某一章或场景中的具体事件、对话或角色互动。
在技术文档中,C3 级别可能详细描述某个功能的具体操作步骤、参数说明或特定问题的解决方法。
注意:
含义:这是更细粒度的社区级别,社区规模更小,包含更具体的实体、细节和关系。
作用:提供详细的信息,捕捉文档中的具体内容、细节和微小差异。
社区层级编号(C0、C1、C2、C3 等):编号中的数字越小,表示社区的层级越高,内容越概括;数字越大,表示社区的层级越低,内容越具体。
层次化摘要:GraphRAG 利用这些社区层级,生成对应的摘要:
C0 摘要:整体概括,适合对全局信息的快速了解。
C1 摘要:主要主题的描述,适合理解文档的主要结构和关键部分。
C3 摘要:详细内容,适合获取具体信息和深入细节。
在查询时的应用:
全局搜索(Global Search):当用户的查询需要对整个文档的概况或主要主题有了解时,系统会利用 C0(根级别) 或 C1(高级别) 的社区和摘要来生成回答。
局部搜索(Local Search):当用户的查询涉及具体的细节、特定的章节或细微的信息时,系统会利用 C3(低级别) 等更细粒度的社区来检索和生成答案。
举例说明:
例1:用户询问“这本小说的主要情节是什么?”
系统处理:利用 C0 级别 的社区摘要,提供对小说主要情节和主题的概括描述。
例2:用户询问“主人公在第三章中遇到了哪些挑战?”
系统处理:定位到与第三章相关的 C3 级别 社区,提取其中的详细信息,回答主人公在该章节中经历的具体事件和挑战。
例3:用户询问“这款软件的核心功能有哪些?”
系统处理:利用 C1 级别 的社区,概括软件的主要功能模块和特色,提供清晰的功能概览。
总结:
层次化社区结构:通过将知识图谱划分为不同层次的社区,GraphRAG 能够在不同的抽象级别上组织和呈现信息,满足用户多样化的查询需求。
灵活性:根据用户需求,系统可以选择合适的社区级别来检索信息,既能够提供宏观的总体概括,也能够深入到微观的细节描述。
提高回答质量:这种层次化的方式帮助系统更好地理解文档结构,提供连贯、准确和相关性高的回答。
嵌入生成:
为文本片段、实体和关系生成嵌入向量,便于后续的向量检索。
生成 Parquet 文件:
将提取的实体、关系、摘要和社区结构等数据,以 Parquet 格式存储。
步骤概览:
接收用户查询:
获取用户的查询或问题,系统识别查询的意图和所需的细节程度。
选择社区级别:
根据查询的细粒度需求,选择合适的社区级别(细节级、中等粒度级或全局级)。
如果用户需要整体概览,选择全局级摘要;如果关注具体细节,选择细节级或中等粒度级社区。
社区级别检索:
在选定的社区级别上进行信息检索,而非传统 RAG 中的文本块级别。
在选定的社区级别中,找到与查询相关的社区及其摘要。
生成部分响应:
使用语言模型(如 GPT-4),针对每个相关社区的摘要,生成部分的回答内容。
合并回答:
将多个相关社区的部分回答综合,形成完整的最终答案。
合并所有部分回答,消除冗余,确保逻辑连贯,生成一个全面、准确的最终回答。
实体(Entity) 是在文本中具有独特意义的对象、概念或事物。它们是构建知识图谱的基本单位。常见的实体类型包括:
人物: 如历史人物、作者、角色等。例如:“爱因斯坦”、“哈利·波特”。
地点: 如国家、城市、地标等。例如:“中国”、“埃菲尔铁塔”。
组织: 如公司、机构、团队等。例如:“微软”、“联合国”。
事件: 如战争、会议、比赛等。例如:“二战”、“奥运会”。
其他专有名词: 如产品、作品、术语等。例如:“iPhone”、“量子力学”。
举例:
假设有一段文本:
“在2022年北京冬奥会上,中国选手谷爱凌获得了金牌,她的出色表现令世界瞩目。”
从这段话中可以抽取的实体有:
事件: 2022年北京冬奥会
国家: 中国
人物: 谷爱凌
成就: 金牌
反应: 世界瞩目
社区(Community) 是在知识图谱(由实体和它们之间的关系构成的图)中,具有紧密联系的一组实体。这些实体之间的连接(关系)比较密集,代表了在某个主题或情节下高度相关的内容。
在 GraphRAG 中,社区代表了文档中的一个主题、故事线或概念集合。
举例:
继续上述例子,扩展文本:
“在2022年北京冬奥会上,中国选手谷爱凌获得了金牌,她的出色表现令世界瞩目。同样出色的还有日本选手羽生结弦,他在花样滑冰比赛中展现了超凡的技巧。美国代表团则在冰球项目上表现不俗。”
从整个文本中,可以抽取更多的实体:
人物: 谷爱凌、羽生结弦
国家: 中国、日本、美国
事件: 2022年北京冬奥会、花样滑冰比赛、冰球比赛
成就: 金牌、超凡技巧、表现不俗
构建知识图谱并进行社区检测后,可能得到以下社区:
社区1:与谷爱凌相关
实体: 谷爱凌、中国、金牌、世界瞩目、2022年北京冬奥会
解释: 这个社区包含了谷爱凌在冬奥会上为中国赢得金牌的故事。
社区2:与羽生结弦相关
实体: 羽生结弦、日本、花样滑冰比赛、超凡技巧、2022年北京冬奥会
解释: 这个社区聚焦于羽生结弦在花样滑冰比赛中的表现。
社区3:美国代表团的表现
实体: 美国、冰球比赛、表现不俗、2022年北京冬奥会
解释: 这个社区描述了美国代表团在冰球项目上的情况。
知识图谱(Knowledge Graph): 由实体(节点)和它们之间的关系(边)构成的图结构,用于表示和存储知识。
关系: 实体之间的关联,如“获得”、“来自”、“参加”等。
社区检测(Community Detection): 一种图分析方法,用于在知识图谱中识别出紧密相关的实体群体(社区)。
提高上下文理解:
实体帮助识别文本中的关键元素。
社区将相关的实体组合在一起,反映了文档的主题结构。
改善信息检索和回答质量:
在回答用户问题时,系统可以定位到相关的社区,综合考虑社区内的所有实体和关系,提供更准确和全面的回答。
解决传统 RAG 的不足:
传统 RAG 可能因为文本分块导致上下文丢失。
利用社区,GraphRAG 能够保留和利用文本中的上下文和结构信息。
具体例子:
问题1:“谷爱凌在2022年北京冬奥会上的表现如何?”
GraphRAG 的处理:
定位相关社区: 社区1(与谷爱凌相关)。
使用社区摘要: 根据社区1的摘要,系统知道谷爱凌为中国赢得了金牌,表现出色。
生成回答: 提供关于谷爱凌在冬奥会上的出色表现的详细回答。
问题2:“有哪些在2022年北京冬奥会上表现突出的花样滑冰选手?”
GraphRAG 的处理:
定位相关社区: 社区2(与羽生结弦相关)。
使用社区摘要: 了解到羽生结弦在花样滑冰比赛中展现了超凡的技巧。
生成回答: 告知用户羽生结弦是表现突出的花样滑冰选手,并提供相关细节。
(1)局部搜索(Local Search)
定义:
局部搜索 是在查询阶段,针对特定的 低级别社区(如 C2、C3、C4)或一组相关的实体进行信息检索和回答生成。
与实体和社区的关系:
聚焦社区: 局部搜索利用社区检测得到的 特定低级别社区,只在这些社区内寻找答案。
深入细节: 通过关注社区内的实体和它们的关系,提供更 详细、具体 的回答。
适用场景:
当用户的问题涉及 具体的主题、人物或事件,需要深入 细节 时。
示例:
问题:“主角在第三章中经历了哪些重要事件?”
处理:
系统识别与“主角”和“第三章”相关的 C3 或 C4 级别的社区。
在该社区内的实体可能包括主角、第三章中的其他角色、发生的事件等。
回答:详细描述主角在第三章中的经历,聚焦于该社区内的信息。
(2)全局搜索(Global Search)
定义:
全局搜索 是在查询阶段,考虑整个知识图谱,综合所有社区的信息(尤其是 高级别社区,如 C0、C1)来生成回答。
与实体和社区的关系:
整体视角: 全局搜索遍历所有社区和实体,不局限于某个特定的部分。
综合信息: 整合各个 高级别社区 中的信息,提供关于整个文档的 宏观 回答。
适用场景:
当用户的问题需要 全局概括 或涉及 整体主题 时。
示例:
问题:“这本书的主要主题是什么?”
处理:
系统遍历知识图谱中的所有社区,特别是 C0、C1 级别的社区摘要。
分析所有实体和关系,识别贯穿全书的核心主题和概念。
回答:
提供关于书籍主要主题的总体概述,涵盖各个社区的信息。
(3)两者之间的关系
搜索范围的区别:
局部搜索:
范围:限定在特定的 低级别社区(C2、C3、C4 等) 内。
优势:提高搜索效率,回答更具 针对性和深度。
全局搜索:
范围:覆盖整个知识图谱,特别是 高级别社区(C0、C1)。
优势:提供 全面的视角,避免遗漏重要信息。
与实体和社区的关联:
局部搜索:
利用社区中紧密相关的实体和关系。
适合处理 细节性问题,依赖于社区内实体的关联性。
全局搜索:
综合所有社区和实体的信息。
适合回答 宏观性问题,依赖于整体知识图谱的结构。
信息处理方式:
局部搜索:
步骤:
根据查询定位相关的 低级别社区(如 C3)。
在社区内检索相关的实体和关系。
生成 详细的 回答。
全局搜索:
步骤:
遍历整个知识图谱,特别关注 高级别社区(C0、C1)。
综合分析所有社区的实体和关系。
提炼出 全局性 的回答。
(4)进一步的例子
假设: 我们有一部小说,经过 GraphRAG 处理,构建了知识图谱。知识图谱中有多个社区,每个社区代表不同的故事线或主题。
例子1:局部搜索
用户提问:“反派角色的阴谋是如何展开的?”
处理过程:
系统识别 与“反派角色”相关的 低级别社区(如 C3)。
社区中包含反派角色、他的手下、策划的事件等实体和关系。
回答:
详细描述反派角色的阴谋计划,如何执行,以及对其他角色的影响。
例子2:全局搜索
用户提问:“小说探讨了哪些人性主题?”
处理过程:
系统遍历 整个知识图谱,特别是 高级别社区(C0、C1),寻找与“人性”相关的实体和关系。
包括友情、背叛、成长、救赎等主题。
回答:
综合阐述小说中涉及的人性主题,如何通过不同的角色和情节表现出来。
GraphRAG 在多个方面改进了传统 RAG 的框架,主要区别如下:
传统 RAG:
将文档分块后,直接对每个块进行向量化(通过嵌入模型)。
使用向量检索技术,根据查询在向量空间中检索最相关的文本块。
由于缺乏对文本块之间关系的理解,可能导致上下文信息的丢失。
GraphRAG:
在分块的基础上,进一步抽取实体和关系,构建知识图谱。
以图结构来表现文档中的实体关系,保留了更丰富的上下文信息和结构信息。
传统 RAG:
针对查询,在向量空间中检索最相关的文本块(通常为 K 个)。
将检索到的文本块与查询一起输入到语言模型中,生成回答。
可能因为文本块的独立性,导致回答缺乏连贯性或遗漏重要信息。
GraphRAG:
通过社区检测,按照查询需求选择合适的社区级别,进行检索。
利用社区摘要,生成更具上下文连贯性的部分回答。
合并多个社区的回答,提供全面的答案,减少了上下文丢失的问题。
传统 RAG:
上下文可能在分块和检索过程中丢失,尤其是在处理长文本时。
回答可能缺乏全局视角,无法充分利用文档中的所有相关信息。
GraphRAG:
通过知识图谱和层次化摘要,保留了文本的全局结构和上下文。
回答更具关联性和全面性,能够更好地理解复杂的主题和概念。
传统 RAG:
计算相对高效,主要涉及向量化和向量检索的计算。
适用于大规模文档集合的检索和回答生成。
GraphRAG:
由于涉及实体抽取、关系抽取、图谱构建和社区检测,计算量更大。
使用高级的语言模型(如 GPT-4)进行摘要和回答生成,成本更高。
在处理大型文档或文档集合时,资源消耗和费用都会增加。
LazyGraphRAG 是微软最新推出的基于图的检索增强生成方法,相较于传统的 GraphRAG,大幅降低了数据索引的成本,提高了查询效率和答案质量。
LazyGraphRAG 被称为“懒惰”,是因为它推迟了对大型语言模型(LLM)的使用。在索引阶段,LazyGraphRAG 仅使用轻量级的自然语言处理(NLP)技术来处理文本,将 LLM 的调用延迟到实际查询时。这种“懒惰”的策略避免了前期高昂的索引成本,实现了高效的资源利用。
概念和共现关系提取:
使用 NLP 技术(如名词短语提取)从文本中提取概念。
分析这些概念在文本中的共现关系,构建关联关系。
构建概念图:
利用提取的概念和关系,构建概念图。
社区检测:
使用图算法(如层次聚类)提取概念图的层次化社区结构。
索引数据存储:
将构建的概念图和社区结构数据存储。
注: 索引阶段不使用 LLM,仅依赖轻量级的 NLP 技术,大幅降低了索引成本。
查询细化:
使用 LLM 将原始查询分解为子查询,并生成扩展的查询。
匹配查询:
使用文本嵌入和概念-社区关系,优先选择与查询最相关的文本片段和社区。
采用一种结合最佳优先搜索(Best-First Search)和广度优先搜索(Breadth-First Search)的策略。
答案生成:
使用 LLM 从相关的文本片段中提取与子查询相关的内容。
对提取的内容进行排序和过滤,确保答案的质量和相关性。
生成最终答案:
综合子查询的结果,生成完整的回答。
方面 | 传统 GraphRAG | LazyGraphRAG |
---|---|---|
索引阶段 | - 使用 LLM 提取并描述实体和关系 - 为每个实体和关系生成摘要 - 利用 LLM 总结社区内容 - 生成嵌入向量 - 生成 Parquet 文件 | - 使用 NLP 技术提取概念和共现关系 - 构建概念图 - 提取社区结构 - 索引阶段不使用 LLM |
查询阶段 | - 直接使用社区摘要回答查询 - 缺乏对查询的细化和对相关信息的聚焦 | - 使用 LLM 细化查询并生成子查询 - 根据相关性选择文本片段和社区 - 使用 LLM 提取和生成答案 - 更加聚焦于相关内容,回答更精确 |
LLM 的使用 | - 在索引阶段和查询阶段都大量使用 | - 在索引阶段不使用 LLM - 仅在查询阶段调用 LLM - LLM 的使用更加高效 |
成本与效率 | - 索引成本高,耗时长 - 查询性能受限于索引质量 | - 索引成本仅为传统 GraphRAG 的 0.1% - 查询效率高,答案质量好 |
数据存储 | - 索引数据生成 Parquet 文件,适合大规模数据的存储和处理 | - 索引数据存储为轻量级格式(如 JSON、CSV),更适合快速开发和小规模数据 |
适用场景 | - 适用于对计算资源和时间不敏感的场景 - 需要提前构建完整的知识图谱,并存储为 Parquet 文件,方便后续导入数据库进行复杂分析 | - 适用于需要快速索引和响应的场景 - 适合一 次性查询、探索性分析和流式数据处理 |
LazyGraphRAG 在查询阶段采用了一种结合 最佳优先搜索 和 广度优先搜索 的策略:
最佳优先搜索(Best-First Search):
根据与查询的相关性,优先选择最匹配的文本片段和社区。
广度优先搜索(Breadth-First Search):
在相关性测试预算内,广泛探索可能的相关社区,避免遗漏关键信息。
迭代加深(Iterative Deepening):
根据需要逐步深入社区层次,平衡搜索深度和广度。
LazyGraphRAG 引入了“相关性测试预算”参数,控制在查询过程中可以进行的相关性测试次数。通过调整该参数,可以在成本和答案质量之间找到最佳平衡。
根据微软的测试,LazyGraphRAG 展现了出色的性能。主要结论包括:
索引成本: LazyGraphRAG 的索引成本仅为传统 GraphRAG 的 0.1%,与向量 RAG 相当。
查询性能: 在本地查询中,LazyGraphRAG 在相似成本下性能超过所有竞争方法,包括传统的向量 RAG 和 GraphRAG 的其他搜索机制。
全局查询: LazyGraphRAG 能以更低的成本(查询成本降低 700 多倍)提供与传统 GraphRAG 相当的答案质量。
在传统的 GraphRAG 中,索引阶段通过调用 LLM,对文本进行深入的处理,生成大量的中间数据。这些数据包括:
实体数据: 实体的名称、描述、属性等。
关系数据: 实体之间的关系及其描述。
社区结构: 实体和关系的社区划分信息。
摘要数据: 对实体、关系和社区的摘要信息。
嵌入向量: 表示实体、关系或文本片段的高维向量表示。
这些数据被存储为 Parquet 文件,方便后续的存储、查询和分析。
导入到图数据库: Parquet 文件可以被导入到 Neo4j 等图数据库,构建知识图谱,利用图数据库的查询和分析能力,对数据进行深入的挖掘。
与数据处理工具集成: Parquet 文件格式广泛应用于大数据处理工具,如 Hadoop、Spark 等,方便进行大规模数据的批处理和分析。
跨平台数据共享: 由于 Parquet 文件的高兼容性,可以在不同的平台和工具之间方便地共享和传输数据。
步骤概述:
运行 GraphRAG 的图提取管道: 生成一系列 Parquet 文件,包括实体、关系、社区结构等信息。
准备导入环境: 可以使用 Neo4j 的 Aura 免费云服务,或在本地设置 Neo4j 环境。
导入 Parquet 文件: 利用 Neo4j 提供的导入工具或编写脚本,将 Parquet 文件中的数据导入到 Neo4j 中,构建知识图谱。
数据验证和可视化: 使用 Neo4j Browser 等工具,验证数据的正确性,并可视化部分导入的图。
导入的意义:
高效的图查询和分析: Neo4j 提供了强大的图查询语言(Cypher),可以高效地查询实体和关系,进行复杂的图分析。
数据可视化: 通过直观的图形界面,更好地理解数据的结构和关系。
进一步开发应用: 基于导入的知识图谱,可以开发更高级的应用,例如智能问答、推荐系统等。
数据规模与性能: 由于 Parquet 文件可以存储大规模的数据,引入到 Neo4j 等数据库时,需要注意数据库的性能调优和资源配置。
数据清洗与融合: 在导入数据之前,可能需要进行数据清洗、实体消歧等操作,确保数据的准确性和一致性。
与其他工具集成: 导入到图数据库后,可以结合其他工具(如 LangChain、LlamaIndex 等)实现更复杂的检索和生成任务。
GraphRAG 的优势: 通过利用 LLM 和知识图谱,GraphRAG 能够在构建全面的索引和回答复杂问题方面表现出色。生成的 Parquet 文件为后续的数据处理和分析提供了良好的基础。
LazyGraphRAG 的创新: 通过在索引阶段避免使用 LLM,仅在查询阶段调用,LazyGraphRAG 实现了极低的索引成本和高效的查询性能,适用于更多的应用场景。
结合两者优势: 探索将 GraphRAG 的详细索引与 LazyGraphRAG 的高效查询相结合,在保证成本的前提下进一步提高性能。
优化索引策略: 在 LazyGraphRAG 中,引入部分轻量级的索引优化方法,可能在不显著增加成本的情况下提升索引质量。
应用推广: 基于 LazyGraphRAG 的优势,将其应用于实时数据处理、个性化推荐等领域。
总而言之, 随着大型语言模型和知识图谱技术的不断发展,GraphRAG 和 LazyGraphRAG 代表了将非结构化文本数据进行结构化处理并应用于高效检索和生成的重要趋势。它们在不同的应用场景下各有优势,通过理解并合理应用这两种方法,可以在实际项目中取得更好的效果。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-04
如何为RAG应用选择最佳Embedding模型
2024-12-04
Neo4j×Milvus:手把手教你搭建GraphRAG Agent
2024-12-04
别再用PostgreSQL了,Milvus才是多语言RAG的最佳搭档
2024-12-03
RAG系统中的困境:上下文不是想加就能加的
2024-12-03
FastRAG:高效半结构化数据处理新范式,轻松提升检索生成效率
2024-12-03
Gitee AI+Dify 双剑合璧,打造另类 RAG 知识库
2024-12-03
详细的Agentic RAG的前世今生
2024-12-02
微软最新研究:RAG(Retrieval-Augmented Generation)的四个级别深度解析
2024-07-18
2024-05-05
2024-05-19
2024-06-20
2024-07-09
2024-07-09
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-12-01
2024-11-27
2024-11-25
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27