微信扫码
与创始人交个朋友
全文长度: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+中大型企业
2024-09-07
基于RAG的智能知识问答探索企业知识边界
2024-09-07
长文本分块的新策略——后期分块(Late Chunking),让RAG应用"又准又高效"
2024-09-07
轻松上手GraphRAG源码,手把手教你怎样给GraphRAG增加流式输出
2024-09-07
为什么RAG应用很难落地?细说RAG系统开发关键痛点和解决方案
2024-09-07
最近爆火的GraphRAG是什么,真的能用于商业应用吗?
2024-09-07
大模型RAG实战|如何优化对网页信息的处理
2024-09-07
RAG文本切分LV3:轻松定制Markdown切分
2024-09-07
【深入浅出RAG】结合LlamaCloud优化Chunksize
2024-07-18
2024-07-08
2024-07-09
2024-06-20
2024-05-05
2024-06-13
2024-07-09
2024-07-14
2024-04-26
2024-07-07