2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

微软的GraphRAG是最强RAG?

发布日期:2024-07-27 21:40:28 浏览次数: 3006
作者:AIForge

微信搜一搜,关注“AIForge”

全文长度:3753字

预计阅读时间:13分钟

通过使用StreamlitLangChainNeo4jGPT-4来构建GraphRAG是一个复杂但富有潜力的过程。在此过程中,将结合实际的应用案例进行说明。这项技术的背景和其重要性将在文中详细讨论,以激发读者的兴趣并为后续讨论奠定基础。2024年微软研究团队发布了一篇有关GraphRAG的论文,并在GitHub上进行了开源,这是我们今天讨论的核心

非结构化数据到可查询图谱

将非结构化数据转换为可查询图谱涉及使用StreamlitLangChainNeo4jGPT-4o构建GraphRAG的实际应用和开源实现。我们的示例应用程序包含四个核心组件:

  • 使用Docker托管的本地Neo4j图形构建工具,可将非结构化文本提取并转化为知识图谱。

  • 混合检索器,可从图谱中提取结构化和非结构化文本。

  • Streamlit用户界面,使用户能够与其图形化知识文档进行交互。

接下来,我们通过使用Neo4jLangChainStreamlit的GraphRAG示例来创建一个能与图表化知识文档进行对话的聊天机器人。GraphRAG是微软研究团队于2024年2月提出的最新成果,他们已基于这一研究发布了实现,值得深入了解。

GraphRAG为了解决LLMs在接收新知识时面临的挑战而设计。它可以帮助将新的或被遮蔽的信息纳入回答,从而减少幻觉的发生。连接模糊关系中的不同知识点是其面临的一个重大挑战。信息常常松散相关,上下文关系并非总是对接紧密。知识图谱在这方面表现出色,通过多跳查询实现复杂关系的表示和查询。

以下是基本的工作机制:

第一阶段是RAG数据存储,负责在用户提问时提供背景数据。与传统RAG一样,我们将文本切分为块,使其适应LLMs的上下文窗口。每个文本块转换为图形文档,逐步建立图形。

第二阶段是混合检索。此方案同时利用图查询和向量相似度搜索,我们从图形存储原始文档块,并用其构建向量索引。

检索器接受用户问题,提取实体后进行向量搜索和图查询。最终结果与原始问题一起发送给LLM,产生上下文感知的回答。

LangChain作为一个开源框架,简化了构建、部署和管理大型语言模型的过程,它提供了强大的基础设施及多样化的集成和函数库,方便快速开发LLM应用。Neo4j是一种高性能的图形数据库管理系统,使用Cypher查询语言进行高效运作,为复杂数据关系的应用提供理想解决方案。GPT-4o是OpenAI最新发布的模型,主要借助LangChain内置集成进行交互。Streamlit则是一款开源框架,帮助开发者创建和分享自定义网络应用,特别适用于机器学习和数据科学项目。

LLMGraphTransformer是LangChain中的实验性功能,可将文档转换为图形格式,允许用户指定节点和关系类型,应用约束和筛选,支持异步处理文档,并根据提供的模式生成结构化输出。

示例案例–Garmin手表推荐

Garmin Forerunner 255为例,由于其功能多样、价格不一,提供了良好的基础示例。

应用概述

我们的示例应用由四个主要组件组成:

  • 本地使用Docker托管的Neo4j图形构建工具。

  • 从非结构化文本中提取图谱的工具。

  • 一个混合检索器,可以从图谱中提取结构化和非结构化文本。

  • 一个Streamlit用户界面,允许用户与知识文档进行对话。

使用Docker配置Neo4j环境

首先,设置本地运行的Neo4j实例,使用Docker简化配置过程。

从非结构化数据构建图谱

我创建了三个文档提取器分别用于YouTube、维基百科和纯文本。在内容提取后,对文本进行分块并转换为图文档,保存在Neo4j实例中。我们使用LLMGraphTransformer,将纯文本块转换为图节点和边。此过程反复进行,直到所有来源文档的块都被处理完毕。我们在图谱中创建索引以支持高效搜索。

图检索器

图检索器由多个步骤构建。首先是结构化数据检索,生成图查询来提取相关节点和关系。然后,非结构化部分利用源文档构建向量索引。最后,将两种检索方式合并,构建发送给LLM的综合查询。

实现互动接口

通过Streamlit快速构建原型,创建用户界面,这包含两个部分:

  • 侧边栏 - 管理图形的控件。

  • 主窗口 - 主要的聊天界面。

回顾来看,数据常常非线性相关,但包含重要信息。知识图谱和RAG结合能有效查询复杂关系,提供更丰富和见解深刻的回复。通过混合检索器,可以有效地处理用户查询相关的实体,提取相关节点和关系,生成的回答内容更全面。

以上就是整个过程的概述,展示了如何用GraphRAG实现从非结构化文本到可查询知识图谱的转换。

GraphRAG的技术细节

GraphRAG的工作原理涉及以下几点:

  • 构建一个融合向量相似度搜索与图查询的系统,以便综合检索结构化和非结构化数据。

  • 通过这种方法,利用从查询图和关系中获取的上下文信息增强基本RAG的效果。

这个过程主要分为两个阶段:

  • RAG数据存储:建立用于背景检索的数据存储。

    文档被分块处理,以适应LLMs的上下文窗口。

    每块文档再被转换成一个图文档。

  • 混合检索:结合图查询和向量相似度搜索,利用构建的图形存储文档块,并从这些块中创建向量索引进行检索。

在检索器方面:

  • 系统首先接受用户的问题,从中提取相关实体,并利用这些实体进行向量搜索和图查询构建。

  • 最终的检索结果与原始问题一起传递给LLM,LLM然后生成一个基于上下文的应答。

GraphRAG的优势在于:

  • 能利用知识图谱在多跳关系中的映射和查询能力,生成复杂且丰富的答案。

  • 提供更多相关数据点,如何理解和响应用户查询。

  • 减少生成幻觉,提高回答的质量。

使用的技术工具:

使用LangChain框架,可以简化构建、部署和管理大型语言模型的过程;Neo4j作为高性能图形数据库管理系统;以及GPT-4o作为OpenAI发布的最新语言模型;Streamlit框架则简化了构建美观定制网络应用程序的流程。

实际应用与实现步骤

实际应用与实现步骤

应用概述

我们正在使用的示例应用程序包括四个主要部分:

  • 在本地使用Docker托管的Neo4j。

  • 一种图形构建工具,能从非结构化文本中提取信息,并使用人工智能将其转换为知识图。

  • 一个混合检索器,可以从图中提取结构化和非结构化文本。

  • 一个Streamlit用户界面,允许用户与其图形化知识文档进行互动。

使用Docker配置Neo4j环境

首先,我们在本地运行一个Neo4j实例。为了简化操作,我们选择使用Docker。首先,需要下载APOC JAR并将其放入$PWD/plugins目录中。这可以放在任意位置,只需确保Docker命令能够识别JAR的位置。APOC是Neo4j的一个辅助库,提供许多有用功能,在此示例中必不可少。

确保已经安装Docker Desktop,然后执行以下命令:

docker run -p 7474:7474 -p 7687:7687 \ -v ${PWD}/data:/data -v ${PWD}/plugins:/plugins \ --name neo4j-v5-apoc \ -e NEO4J_apoc_export_file_enabled=true \ -e NEO4J_apoc_import_file_enabled=true \ -e NEO4J_apoc_import_file_use_neo4j_config=true \ -e NEO4J_PLUGINS='["apoc"]' \ -e NEO4J_dbms_security_procedures_unrestricted="apoc.*" \ neo4j:5.20.0

上述命令格式适用于Powershell环境,请根据您的系统/终端进行相应调整。

从非结构化数据构建图谱

为了演示如何合并多种类型的数据来源,我创建了三个文档提取器:一个用于YouTube,一个用于维基百科,还有一个用于纯文本

def extract_youtube_transcript(self, url) -> List: return YoutubeLoader.from_youtube_url(url).load() def extract_wikipedia_content(self, search_query): raw_docs = WikipediaLoader(query=search_query).load() self.chunk_and_graph(raw_docs) def graph_text_content(self, path): text_docs = TextLoader(path).load() self.chunk_and_graph(text_docs)

在提取内容后,需要对文本进行分块。为了实现有效的RAG文档拆分,这里我使用了简单的TokenTextSplitter

def chunk_document_text(self, raw_docs): text_splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=24) docs = text_splitter.split_documents(raw_docs[:3])

接下来,将每个块转换为图文档并持久保存到Neo4j实例中。这时,我利用LLMGraphTransformer将纯文本块转换为图节点和边。

def graph_document_text(self, text_chunks): llm_transformer = LLMGraphTransformer(llm=self.llm) graph_docs = llm_transformer.convert_to_graph_documents(text_chunks) self.graph.add_graph_documents( baseEntityLabel=True, text_chunks=text_chunks, )

这个过程会重复进行,直到所有来源文档的所有块都被处理完毕。特别一提的是include_source=True,这样可以在图中显示来源文档,对于后面的非结构化语义搜索步骤十分有用。最终,在整个图中创建一个索引帮助进行高效的搜索。

图检索器

图检索器的构建包含多个步骤。以下是每个步骤的解释和代码示例。

首先,提取用户问题中的实体。由于图是通过节点和边来相互连接的,按实体搜索是一种常见策略。在例子里,用户的问题可能包含多个实体,可以这样提取出来。注意:返回的是一个可运行的链,以便稍后将此步骤与其他步骤链接。接着,构建结构化数据检索器,用于生成一个图查询,提取上面识别出的实体的相关节点和关系。这个过程将图查询与识别出的实体合并,从而得到一个数据语料库,用于回答用户的查询。

def extract_entities_from_question(self, question): # 提取问题中的实体 entities = self.entity_extractor.extract(question) return entities

然后,我将创建混合检索器的非结构化部分。记得图中包含的源文档吗?现在我们利用这一点,直接从图中创建一个向量索引。

def create_vector_index_from_graph(self): # 创建向量索引 vector_index = self.graph.create_vector_index(include_source=True) return vector_index

最后一步是将检索的两种方法合并,构建一个组合查询,将其发送给LLM。这个组合查询包含用户问题的上下文和混合检索器内容。

def combine_retrieval_methods(self, entities, vector_index): # 合并检索方法 combined_query = self.llm.create_combined_query(entities, vector_index) return combined_query

这便是构建混合GraphRAG实现的方法。

为了进一步提升功能,我们应该添加一个能够对话方式与图形交互的接口。由于Streamlit能够快速构建原型,所以我们继续使用它。用户界面分为两个部分:

  • 侧边栏:

    包含管理图形的控件,当前从代码中的预填充URL读取。

  • 主窗口:

    主要的聊天界面,用户可以在这里提出问题,与模型的知识及基于图形的知识相结合。

最后,我们需要回顾一下:数据通常不是线性相关的,常常包含超越单个跳跃的信息,这使得知识图谱显得非常重要。知识图谱能够提供信息相互关联更现实的表示,使得我们能够更轻松地查询复杂信息。手动构建这些图谱可能具有挑战性,不过随着LLMs的出现,我们可以有效地自动化这一过程。

GraphRAG的发展与优化

GraphRAG通过利用知识图谱丰富上下文信息,从而改进大型语言模型(LLM)的响应,并解决了传统 RAG 系统在处理复杂查询时的局限性。

未来的发展方向可能包括加强实体消歧优化图嵌入、以及支持多模态数据等。

GraphRAG 的主要应用领域涵盖医疗法律金融等,探讨其在这些领域中的潜在应用,并展示出相较于传统方法的明显优势。

通过整合多种优化方法,GraphRAG有望在未来进一步提升计算效率和知识传递的广度。

欢迎关注我们!为您带来更多精彩内容!

我们为您准备了配套的小程序,欢迎点击二维码体验国产版ChatGPT~


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅