RAG 结合了大型语言模型和信息检索模型的力量,允许它们用从大量文本数据中提取的相关事实和细节来补充生成的响应。事实证明,这种方法在提高模型输出的实际准确性和总体质量方面是有效的。
图片
然而,随着 RAG 系统得到更广泛的采用,它们的局限性开始浮出水面,具体而言:
- 平面检索: RAG 将每个文档作为一个独立的信息。想象一下,阅读单独的书页,却不知道它们之间是如何连接的。这种方法错过了不同信息片段之间更深层次的关系。
- 语境缺陷: 如果不理解关系和语境,人工智能可能会提供不连贯的反应。这就像有一个图书管理员,他知道在哪里可以找到书,但是却不知道书中的故事之间的联系。
- 可伸缩性问题: 随着信息量的增长,寻找正确的文档变得越来越慢,也越来越复杂,就像试图在不断扩展的库中找到一本特定的书一样。
也就是说,对非结构化文本数据的依赖意味着这些模型很难捕捉到处理复杂查询所必需的更深层次的语义关系和上下文细微差别。此外,为每个查询检索和处理大量文本的计算成本构成了重大挑战。
1.什么是GraphRAG
GraphRAG 是检索增强生成领域的一个重要进展。GraphRAG 不使用非结构化的文本,而是利用知识图谱的力量ーー实体的结构化表示、属性以及它们之间的关系。通过以这种结构化的格式表达,GraphRAG 可以克服传统 RAG 方法的局限性。知识图谱可以更精确和全面地检索相关信息,使模型能够产生不仅事实准确而且与上下文相关并涵盖查询所需方面的答复。
1.1 GraphRAG中的结构化表达——知识图谱
让我们来理解 GraphRAG 如何存储信息,例如“2型糖尿病是一种拥有属性高血糖的慢性疾病,可能导致神经损伤、肾脏疾病和心血管疾病等并发症。”
以下是 GraphRAG 如何在知识图谱中表示这些信息:
复制
# 实体 二型糖尿病(病况) 高血糖水平(症状) 神经损伤(并发症) 肾脏疾病(并发症) 心血管疾病(并发症) # 关系 2型糖尿病-> 有症状-> 高血糖水平 2型糖尿病-> 可导致-> 神经损伤 2型糖尿病-> 可导致-> 肾脏疾病 2型糖尿病-> 可导致-> 心血管疾病
在这个知识图谱中,实体(节点)表示句子中提到的关键概念,如病况、症状和并发症。这些关系(边)捕捉了这些实体之间的联系,例如,2型糖尿病有高血糖水平的症状,并可能导致各种并发症。这种结构化的表示允许 GraphRAG 理解句子中的语义关系和上下文,而不是仅仅将其视为一个单词包。当用户问一个与2型糖尿病相关的问题时,比如“2型糖尿病的并发症是什么?”,
GraphRAG 可以快速遍历知识图,从“2型糖尿病”实体开始,遵循“可以导致”关系来检索相关并发症(神经损伤,肾脏疾病和心血管问题)。
1.2 GraphRAG 的主要特性
GraphRAG 已被证明可以显著提高生成文本的准确性和相关性,使其成为一个有价值的解决方案,用于准确、合理的实时答案。它还因其通过跟踪图中的关系链来处理复杂查询的能力而受到关注,提供了对回答问题所需信息的更为丰富的理解。
GraphRAG 的主要特性如下:
- 结构化知识表示: GraphRAG 使用知识图谱来表示信息、捕获实体、关系和层次结构。
- 上下文检索: 知识图谱使 GraphRAG 能够理解语义上下文和关系,允许更全面的检索。
- 高效处理: 在知识图谱中将数据预处理可以降低计算成本,并且与传统的 RAG 方法相比,可以更快地检索。
- 多方面查询处理: GraphRAG 可以通过综合来自知识图谱多个部分的相关信息来处理复杂的多方面查询。
- 可解释性: 与大模型的黑盒输出相比,GraphRAG 中的结构化知识表示提供了更高的透明度和可解释性。
GraphRAG 的这些关键特性展示了它相对于传统 RAG 模型的优势,以及它在各种应用中革新检索增强生成的潜力。
2.GraphRAG 的应用场景
GraphRAG的应用场景非常广泛。下面简要介绍 GraphRAG 的两个用例,以及它们是如何在每个用例中使用的。
2.1 医疗领域
GraphRAG 可以帮助医学专业人员从大量的医学文献中快速找到相关信息,以回答关于患者症状、治疗和结果的复杂问题。通过将医学知识表示为一个结构化的知识图谱,GraphRAG 使得多跳推理能够连接不同的信息并提供全面的答案。这可以导致更快和更准确的诊断,更知情的治疗决定,并改善患者的结果。
2.2 银行金融业
GraphRAG 可以通过在知识图谱中表示客户交易、账户信息和行为模式来帮助银行检测和防止欺诈。通过分析图谱中的关系和异常,GraphRAG 可以识别可疑活动,并向银行的欺诈检测系统发出警报。这可以导致更快、更准确的欺诈检测,减少财务损失,提高客户对银行安全措施的信任。
3.GraphRAG的工作原理
GraphRAG 首先从输入文档中提取实体和关系,生成知识图谱,然后通过图算法检测社区结构。接下来,使用 LLM 为每个社区生成自然语言摘要,保留分层结构。在用户查询时,系统先进行局部检索匹配高级主题,再进行全局检索获取详细信息,最后由 LLM 生成准确相关的响应。GraphRAG 的局部搜索针对特定上下文提供针对性信息,而全局搜索则利用预先计算的社区摘要,回答跨多个文档的综合查询。
图片
3.1 知识图谱构建
- 输入文档: GraphRAG 将一组文本文档作为输入,比如研究论文、新闻文章或产品描述。
- 实体和关系提取: LLM 用于从输入文档中自动提取实体(人、地点、概念)以及它们之间的关系。这是使用命名实体识别和关系提取等复杂的自然语言处理技术完成的。
- 知识图谱生成: 利用提取的实体和关系构造知识图谱数据结构。在知识图谱中,实体表示为节点,它们之间的关系表示为边。
- 分层社区检测: 采用图算法检测知识图谱中密集连接节点形成的社区。这些社区代表了跨越多个文档的主题或主题。社区按等级组织,高层次社区包含低层次的子社区。
3.2 知识图谱的信息摘要
- 社区摘要: 对于知识图谱中检测到的每个社区,使用 LLM 生成自然语言摘要。这些摘要描述了每个社区中的关键实体、关系和主题。
- 分层摘要: 社区的分层结构保留在摘要中。高级摘要描述宽泛的主题,而低级摘要提供更细粒度的细节。
3.3 检索增强生成
- 用户查询: 用户向系统提出一个问题或查询,例如“可再生能源的最新发展是什么?”
- 局部检索: 首先将查询与社区摘要进行匹配,以查找最相关的高级主题。这使得系统可以快速缩小搜索空间。
- 全局检索: 在相关的高级社区中,系统执行更详细的搜索,以查找回答查询所需的特定实体、关系和信息。这包括了遍历知识图谱和组合来自多个社区的信息。
- 响应生成: 使用检索到的信息,LLM 生成用户查询的最终答案。生成的响应基于来自知识图谱的结构化知识,确保其事实上的准确性和相关性。
其中,GraphRAG 中的局部搜索是指从特定实体或文本块的局部上下文中检索和使用信息。这涉及到使用知识图谱结构来查找直接连接到当前查询或上下文的相关实体、关系和文本单元。局部搜索允许系统检索有针对性的相关信息,以增强语言模型对特定的本地化查询的响应。
GraphRAG 中的全局搜索是指利用知识图的更广泛的层次结构对整个数据集进行推理。这涉及到使用检测到的“社区”或图中相关实体和文本单元的集群来生成完整数据集中关键主题和主题的摘要和概述。全局搜索使系统能够回答需要跨多个文档或实体聚合信息的查询,例如“文档中最重要的5个主题是什么?” 通过利用预先计算的社区摘要,全局搜索可以提供全面的响应,而无需为每个查询从头开始搜索整个数据集。
4.GraphRAG 的局限
构建全面而精确的知识图谱不是一个简单的过程,其质量和覆盖率严重依赖于输入数据源,随着知识图谱的增长,计算资源的需求也会增加,对实时应用构成挑战。
- 知识图谱构建复杂性: 构建一个全面而精确的知识图可能是一个复杂而耗时的过程,需要复杂的实体提取和关系建模技术。
- 依赖于底层数据: 知识图谱的质量和覆盖率严重依赖于输入数据源。如果底层数据不完整或有偏差,则会限制 GraphRAG 的有效性。
- 可伸缩性挑战: 随着知识图谱的大小和复杂性的增长,有效的检索和推理所需的计算资源可能成为一个挑战,特别是对于实时应用程序。
5.GraphRAG的实现示例
有很多种方法可以实现GraphRAG,例如, 采用微软开源的GraphRAG 解决方案。为了简化问题, 这里给出了两种参考实现的示例。
5.1 基于LLMGraphTransformer 的GraphRAG实现
首先需要 pip 安装一些必要的库:
复制
pip install --upgrade --quiet json-repair networkx langchain-core langchain-google-vertexai langchain-experimental langchain-community #versions used langchain==0.2.8 langchain-community==0.2.7 langchain-core==0.2.19 langchain-experimental==0.0.62 langchain-google-vertexai==1.0.3
当然,可以自己选择不同的大模型来替换 google 的 verexai。
然后,导入所需的函数,初始化 LLM 对象和引用文本。使用任何 SOTA LLM 获得最佳结果,因为创建知识图谱是一项复杂的任务。
复制
import os from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_google_vertexai import VertexAI import networkx as nx from langchain.chains import GraphQAChain from langchain_core.documents import Document from langchain_community.graphs.networkx_graph import NetworkxEntityGraph llm = VertexAI(max_output_tokens=4000,model_name='text-bison-32k') text = """ your content in details. """
接下来,我们需要将该文本作为 GraphDocument 加载,并创建 LLMTransformer 对象。
复制
documents = [Document(page_cnotallow=text)] llm_transformer = LLMGraphTransformer(llm=llm) graph_documents = llm_transformer.convert_to_graph_documents(documents)
创建知识图谱的时候,最好提供一个要提取的实体和关系列表,否则LLM可能会将所有内容标识为实体或关系。llm_transformer_filtered = LLMGraphTransformer(llm=llm,allowed_nodes=[“Person”, “Country”, “Organization”],allowed_relatinotallow=[“NATIONALITY”, “LOCATED_IN”, “WORKED_AT”, “SPOUSE”],)graph_documents_filtered = llm_transformer_filtered.convert_to_graph_documents(documents)
我们可以使用 Networkx Graph 工具包将上面标识的节点和边进行可视化,当然生产环境中一般会存入图数据库。
复制
graph = NetworkxEntityGraph() # 增加节点 for node in graph_documents_filtered[0].nodes: graph.add_node(node.id) # 增加边 for edge in graph_documents_filtered[0].relationships: graph._graph.add_edge( edge.source.id, edge.target.id, relatinotallow=edge.type, )
现在,我们可以创建一个 GraphQAChain,它将帮助我们与知识库进行交互。
复制
chain = GraphQAChain.from_llm( llm=llm, graph=graph, verbose=True )
最后,就可以使用Query 调用 chain 的对象了。question = “””my question xxxx”””chain.run(question)
5.2 基于GraphIndexCreator 的GraphRAG实现
在 LangChain 使用 GraphIndexCreator,它与上述方法非常相似。
复制
from langchain.indexes import GraphIndexCreator from langchain.chains import GraphQAChain index_creator = GraphIndexCreator(llm=llm) with open("/home/abel/sample.txt") as f: all_text = f.read() text = "\n".join(all_text.split("\n\n")) graph = index_creator.from_text(text) chain = GraphQAChain.from_llm(llm, graph=graph, verbose=True) chain.run("my question xxxx ?")
两种方法都很容易实现。这些示例使用非常小的数据集。如果您使用大型数据集,知识图谱的创建可能会导致大量token 成本。
5.3 知识图谱作为检索工具
特殊地,使用知识图谱作为 RAG 的检索部分有三种方法:
- 基于向量的检索: 向量化知识图谱并将其存储在向量数据库中。然后对提示词进行向量化,则可以在向量数据库中找到与提示符最相似的向量。由于这些向量对应于图中的实体,因此可以在给定自然语言提示词的情况下返回图中最“相关”的实体。注意,可以在没有知识图谱的情况下进行基于向量的检索。这实际上是 RAG 最初的实现方式,有时称为基本RAG。您将向量化 SQL 数据库或内容,并在查询时检索它。
- 提示词查询检索: 使用 LLM 编写 SPARQL 或 Cypher 查询,使用对知识图谱的查询,然后使用返回的结果来增强提示词。
- 混合方式(Vector + SPARQL) : 可以以各种有趣的方式组合以上这两种方法。
总之,有很多方法可以将矢量数据库和知识图谱结合起来用于搜索、相似性和 RAG。
6.小结
GraphRAG 代表了检索增强生成领域的一项重要进步。通过利用知识图谱的力量,GraphRAG克服了传统RAG模型的局限性,为复杂查询提供更准确、相关和全面的响应。
在GraphRAG中,结构化的知识表示使系统能够理解不同信息片段之间的语义上下文和关系,从而轻松处理复杂的多主题查询。此外,GraphRAG的高效处理能力使其成为实际应用程序中的实用解决方案,特别是在速度和准确性至关重要的场景中。
GraphRAG已在各个领域被证明是有效的,包括医疗保健和银行业,能够提供有价值的见解并支持决策过程。其不断学习和扩展知识的能力,使其成为一个多功能工具,能够适应新的信息和不断变化的领域。