微信扫码
添加专属顾问
我们已经了解了基于知识图谱的RAG应用原理,在之前的文章中也演示了如何使用LangChain或者LlamaIndex这样的开发框架构建简单的GraphRAG原型应用。但在实际应用中要将GraphRAG应用投入生产还会面临大量的优化工作,所以一些更专业的GraphRAG工具应运而生,微软公司最近开源的GraphRAG就获得了广泛关注。
很多朋友可能在微软的论文中已经了解到GraphRAG的基本思想。尽管如此,我们仍将尝试结合实际案例来深入GraphRAG的内部原理,并演示如何将其与Neo4j图数据库集成,以带来更大的灵活性与更丰富的应用场景。
我们将分为两篇文章介绍,分别侧重在GraphRAG的索引阶段(Index)以及查询阶段(Query)。本篇内容包括:
GraphRAG原理
GraphRAG索引构建与源码分析
GraphRAG索引集成到Neo4j
GraphRAG原理
Microsoft GraphRAG最开始来源微软公司自己的论文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》,在论文中清晰的表达了其针对的传统RAG的痛点:无法回答类似于“这些数据集表达了什么主题“这样的需要高层语义理解的总结性查询问题,也称为QFS(Query-Focused Summarization)型任务。
在论文中提出解决办法是:
从多个原始知识文档构建知识图谱(这一部分与之前介绍的Graph RAG并无太大区别);然后利用社区检测算法(比如leiden算法)来把知识图谱划分成多个社区/聚簇,并利用LLM生成这些社区的自然语言摘要。而在回答QFS类型的问题时,先在社区执行查询获得中间答案,最后汇总生成全局性的答案。
可以把社区理解成围绕某个主题的一组紧密相关的实体与关系信息,比如”复仇者联盟与神盾局的复杂关系“这个社区,可能会关联到众多的超级英雄、组织、事件等实体及其关系。
这个过程用下图表示:
图片来自微软论文
这个过程的独特之处在于:它把原始的自然语言文本转化与压缩为图谱,然后又把图谱总结回自然语言。即从自然语言文本-->结构化的知识图谱-->自然语言摘要。由于转化的知识图谱已经组合了来自多个原始文档的实体与关系信息,因此最后基于社区的自然语言摘要也就包含了跨多个数据源与文档的浓缩信息。因此可以更好的用来回答QFS问题。
Microsoft GraphRAG对这个过程的实现可以参考论文中的描述:
图片来自微软论文
这里的处理过程中在查询阶段(QueryTime)相对简单,复杂的是索引阶段(Indexing Time),其处理过程我们用尽量简洁的方式描述如下:
1. 文本块拆分:将原始文档拆分成多个文本块,这个过程与经典RAG的处理过程一样。
2. 实体与关系提取:对文本块借助LLM分析,提取实体与关系,这个过程与普通的Graph RAG也类似。
3. 生成实体与关系摘要:为提取的实体与关系生成简单的描述性信息。这是区别普通Graph RAG的一个步骤。在后面Demo中将看到,这样的信息其实是作为一个属性存放在实体/关系的Graph节点中。比如“神盾局”这样一个实体,其中的description属性就是在这一步生成(后面会介绍如何导入到Neo4j查看):
这种摘要的好处是:可以借助嵌入embedding向量更有效与准确的对这些实体与关系进行检索,这也是上图中description_embedding属性的意义。
带来的负面影响是由于需要为大量的实体与关系生成描述信息,将会产生很多的LLM调用,这可能带来过长的耗时与昂贵的大模型API开销!我们建议在测试时优先使用GPT-4o-mini模型。
4. 检测与识别社区:借助社区检测算法,在Graph中识别出多个社区。
5. 生成社区摘要:借助LLM生成每个社区的摘要信息,用来了解数据集的全局主题结构和语义。这也是Microsoft GraphRAG的核心价值所在,也是回答QFS问题的关键。这里也可以先看一个后面Demo中的一个社区及属性:
GraphRAG索引构建与源码分析
现在我们用一个文档来构建基于MS GraphRAG的demo应用,当然这里重点关注索引阶段。我们准备一个自然语言描述漫威漫画世界的文本文件用于测试,内容类似下图(全文约2万汉字):
构建GraphRAG的索引过程很简单(详细可参考官方文档):
1. 准备。使用pip安装graphrag库,建议在虚拟环境下进行。
2. 初始化。这里使用msgraphrag作为应用目录:
python -m graphrag.index --init --root ./msgraphrag
初始化以后会在指定的根目录下生成基本的文件与目录结构,重要的包括:
input目录:存放输入原始文档(txt或者csv),这里把测试的txt文件放置到该目录下
.env与settings.yaml配置文件:你可以在.env或者settings.yaml中修改全部配置项目,默认情况下可以只修改LLM相关的配置,注意目前只支持OpenAI或者Azure OpenAI的模型:
prompts目录:这里存放了自动生成的LLM提示模板文件,一共有四个,分别会在流程的不同处理阶段使用:
entity_extraction:用于从自然语言文本抽取实体与关系。
summarize_descriptions:用于生成实体与关系的描述性文本。
community_report:用于生成社区的摘要等报告信息。
claim_extraction:这是一个可选动作,用来生成一些实体的辅助声明(由GRAPHRAG_CLAIM_EXTRACTION_ENABLED参数控制)。这里忽略。
尽管可以使用这里初始化的默认提示模板,但强烈建议通过GraphRAG提供的命令来创建自适应提示模板:GraphRAG会提取输入数据的信息,并借助大模型来分析与生成更具有针对性的提示模板。现在运行下面的命令来创建自适应的提示模板(更多参数请参考官方文档):
python -m graphrag.prompt_tune --language Chinese
执行成功后我们来观察两个prompts目录下新的提示模板文件内容(为了方便理解,这里翻译成中文):
先看用于实体/关系摘要生成的summarize_descriptions提示。可以看到,新的提示已经结合了输入文件的内容进行了“个性化”定制:
再观察用于生成社区摘要的community_report提示(这里仅展示一部分)。可以看到在生成社区摘要时,会输出一份完整的“报告”,包含有标题、解释、发现等,这些信息都有助于更准确的解答QFS问题。
3. 创建索引。在准备好配置与提示模板后,就可以创建索引:
python -m graphrag.index --root ./msgraphrag
此后就将进入一系列的工作流程,当看到如下的输出后,表示索引阶段的工作已经完成。
这里从最后输出的信息可以了解到其基本的处理过程:从拆分输入文本开始,到提取实体与关系、生成摘要信息、构建内存中的Graph结构、从Graph识别社区、创建社区报告、创建Graph中的文本块节点和文档节点等。当然,除了上面介绍的几个核心步骤外,还会涉及到大量的中间处理细节,比如embedding生成、持久化到存储、不同的算法策略等。如果有兴趣了解详细的实现,需要研究GraphRAG的源代码。这里是一些发现与指南:
Microsoft GraphRAG内部借助了DataShaper来实现了灵活的工作流与处理动作的“装配”。DataShaper是微软公司开源的一个用于定义与执行数据处理工作流的库。通过定义一个数据处理的工作流,你可以对输入的数据(比如Pandas的DataFrame)定义一系列数据操作的动作(DataShaper中称作Verb)、参数与步骤,执行这个工作流即可完成数据处理过程。在DataShaper中提供了很多开箱即用的Verb,你也可以自定义Verb。多个子工作流也可以组合定义成一个更大的工作流。
一种简单的阅读方式:你可以在index/workflows/v1目录下找到基本的工作流的定义,比如上面的create_base_extracted_entities;再根据工作流中的步骤(steps)找到对应的verb,然后在index/verbs中找到对应的verb实现,就可以大致了解这个工作流的内部原理。
学习代码目录中examples目录下的例子,可以使用GraphRAG的索引引擎来构建自己的数据处理管道;这非常有助于理解DataShaper与GraphRAG的内部原理。
Microsoft GraphRAG在索引构建的过程中目前并不支持使用图数据库。其中间数据主要使用Pandas DataFrame这种结构化类型进行交换;Graph的构建与分析主要借助Networkx这个图计算库;Graph数据的交换使用Graphml(一种xml表示的graph);在社区识别时则借助了Graspologic库实现的leiden算法。
GraphRAG索引集成到Neo4j
在完成索引后,默认情况下,GraphRAG会把构建整个知识图谱所需要的数据持久化到output目录下,并以parquet格式文件的方式存放(parquet是一种专为高效数据存储与分析设计的列式的压缩存储文件格式,想象成是DataFrame的一种持久化格式就行)。这些文件会在查询阶段被用来加载到内存及向量数据库,并用于检索:
由于parquet是一种底层文件格式,我们无法用来直观的了解与观察上面构建的知识图谱索引的细节,有什么办法可以做更直观的可视化、分析与检索呢?
由于parquet文件可以很简单的通过pandas库读取成DataFrame表,所以在了解其结构后,就可以通过Cypher语句导入成Neo4j图数据库中的节点与关系。在Github上已经有大神完成这样的工作(地址见文章最后):
这里使用其提供的笔记本文件在本地运行,即可成功地把上面构建的知识图谱数据全部导入到Neo4j数据库。现在我们可以通过Neo4j管理台看到完整的可视化知识图谱(部分):
在这个Demo的图谱中,看到的节点包括了上面提取的实体(entity,又分成不同类型),也包含了社区(community)、文本块(chunk)、原始文档(document);而关系则包含了RELATED(实体之间)、PART_OF(chunk与document之间)、HAS_ENTITY(chunk与entity之间)、IN_COMMUNITY(entity与community之间)。一共产生了690个节点与1793条关系:
借助Neo4j的Cypher语言可以了解想知道的任何图谱信息,或者点击后快速查看某个节点详情。这里看一个社区的信息,比如“蜘蛛侠与反派角色的关系”这个社区的图谱:
这个社区的报告信息(节点属性):
为了更好的研究GraphRAG生成的数据,还可以使用Cypher结合可视化库来对知识图谱进行深入分析,比如通过不同节点的关系数量(Node Degree)来了解节点的重要性:
这里最高的节点度接近30,来看看是哪个节点:
MATCH (n:__Entity__)
RETURN n.name AS name, count{(n)-[:RELATED]-()} AS degree
ORDER BY degree DESC LIMIT 10执行结果如下(钢铁侠永远的神?):
除了数据分析以外,你还可以在此基础上进行增强,比如联合导入其他已有的知识图谱数据;当然最主要的是,你可以在自己的Neo4j图数据库上定义自己的RAG应用检索与生成器,而不再依赖于GraphRAG项目自带的Query功能,从而带来极大的灵活性。
我们将在下一篇中分析Microsoft GraphRAG中Query功能的实现,并探讨如何基于导入的Neo4j库自定义实现RAG检索器。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-06-30
本体论语义建设新思路,另类RAG来解决检索问题
2026-06-30
别把RAG当架构:Ontology(本体)才是Agent的业务世界
2026-06-29
PixelRAG:伯克利团队颠覆传统 RAG,用截图代替文本检索! 28 天狂揽 3000+ Star!
2026-04-06
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
2026-05-11
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。