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