AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


微软的GraphRAG是最强RAG?
发布日期:2024-07-27 21:40:28 浏览次数: 1882


全文长度: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

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询