微信扫码
添加专属顾问
全文长度:3753字
预计阅读时间:13分钟
通过使用Streamlit、LangChain、Neo4j和GPT-4来构建GraphRAG是一个复杂但富有潜力的过程。在此过程中,将结合实际的应用案例进行说明。这项技术的背景和其重要性将在文中详细讨论,以激发读者的兴趣并为后续讨论奠定基础。2024年,微软研究团队发布了一篇有关GraphRAG的论文,并在GitHub上进行了开源,这是我们今天讨论的核心。
非结构化数据到可查询图谱
将非结构化数据转换为可查询图谱涉及使用Streamlit、LangChain、Neo4j和GPT-4o构建GraphRAG的实际应用和开源实现。我们的示例应用程序包含四个核心组件:
使用Docker托管的本地Neo4j图形构建工具,可将非结构化文本提取并转化为知识图谱。
混合检索器,可从图谱中提取结构化和非结构化文本。
Streamlit用户界面,使用户能够与其图形化知识文档进行交互。
接下来,我们通过使用Neo4j、LangChain和Streamlit的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+中大型企业
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-06-29
腾讯WeKnora开源详解(三):检索引擎与生态集成
2026-06-29
腾讯开源WeKnora详解(二):知识库与对话核心能力
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周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。