GraphRAG(图检索增强生成)是一种结合图数据结构和检索增强生成(RAG)的技术,RAG是一种常用在大型语言模型(LLMs)中的方法。这种结合旨在通过引入结构化知识表示(如图)来增强检索过程,从而提升模型性能。
GraphRAG背后的关键概念有:
- 检索增强的生成(RAG)
- RAG 结合了 检索 和 生成。语言模型从外部知识库中检索相关文档或信息,然后利用检索到的信息生成回复。
- 这使得模型能够利用最新的、特定的信息,这对于需要外部知识的任务(如问答)来说至关重要。
2. 基于图的知识表示
- 一个图形由节点(表示实体、概念或数据点)和边(表示节点间的关系)组成。
- 图非常适合表示结构化知识,因为它们可以捕捉实体间的复杂关系。
- 在GraphRAG中,这些图形作为增强检索的工具,利用数据点间的关系来检索更相关的上下文信息。
-
更好的上下文理解能力:
图表让模型不仅能理解孤立的事实,还能理解这些事实间的关系。特别是在需要复杂推理的任务中尤其有用,因为在这些任务中,理解这些概念间的依赖关系或联系至关重要。
知识整合:
以下是知识整合的内容:
- 传统的检索方法,比如密集向量检索,依赖于文本嵌入之间的相似性,可能会忽略数据点间固有的结构关联。通过GraphRAG,将结构化知识(例如来自知识图谱的知识)整合进来,这样模型就可以生成更连贯和上下文准确的回答。
3. 更适合处理复杂查询。
- 当查询需要在大量相互关联的数据之间导航时,基于图的检索比传统方法更有效,这种方法。GraphRAG 可以帮助模型沿着多个相关路径检索信息,提供更全面的回复。
4. 更好的泛化能力
- 通过利用图的结构特性,GraphRAG 可以帮助模型在涉及关系或上下文信息的任务中更好地适应,比如推荐系统、基于知识的问答系统,或者需要深度理解和上下文感知响应的对话代理。GraphRAG 是一个专有名词,表示某种特定的图模型。
5. 实时和动态的知识应用
- 由于基于RAG的模型可以实时检索外部信息,GraphRAG可以通过使用最新信息动态调整其回答。这在医学、金融和法律等专业领域特别有用,因为在这些领域,新数据不断更新。
- 问答(QA):它可以提高复杂问答任务的效率,其中答案不依赖于单个事实,而是依赖于理解各种数据点之间的关系。
- 推荐系统:通过使用用户行为图或项目关系图,可以使推荐更加准确和符合上下文。
- 科学研究:研究人员可以更有效地在相互关联的研究、引用和概念之间导航。
- 法律应用:对于法律助手等系统,GraphRAG 对于理解法律判例、案件和法规之间的关系非常有用。
总之,GraphRAG(一种通过引入基于图的知识来增强传统的检索增强生成模型的技术)在需要理解和处理关系数据及结构化数据的任务中更加有效。
我们将利用langchain技术,并使用其中的nvidia端点。
!pip install langchain langchain_community langchain_nvidia_ai_endpoints
import os
import time
from langchain.chains import GraphQAChain
from langchain_community.graphs.networkx_graph import NetworkxEntityGraph
import pandas as pd
from langchain_nvidia_ai_endpoints 导入 ChatNVIDIA # 从 langchain_nvidia_ai_endpoints 导入 ChatNVIDIA
client = ChatNVIDIA( # 初始化客户端
model="meta/llama-3.1-405b-instruct", # 模型名称
api_key="your_api_key", # API密钥
temperature=0.2, # 温度参数
top_p=0.7, # 上界概率
max_tokens=1024, # 最大token数
)
Meta的LLaMA 3.1 405B是一个拥有4050亿个参数的强大大型语言模型,旨在推动自然语言理解和生成的边界。它侧重于提高效率、准确性和上下文理解能力,使它在问答、内容生成和推理等复杂任务中表现出色。LLaMA 3.1 在早期模型的基础上进一步发展,为各种自然语言处理应用表现出最先进性能。
我们将利用输入数据来进行医疗问答系统。该文件详细描述了各种医学状况之间的关系,以下是关键字段的介绍。
- 来源条件:列出主要条件(例如,“心脑血管疾病史”)。
- 相关条件:列出相关联的条件(例如,“高血压”,“二型糖尿病”)。
- 描述:提供来源条件与相关条件之间联系的详细信息(例如,“高血压是心脑血管疾病史中的一个重要组成部分”)。
每一行,定义了源状态和目标状态之间的关系,并包含描述、权重和排名等信息的元数据。
df = pd.read_parquet('/content/create_final_relationships.parquet') # 从给定路径读取Parquet文件并将其赋值给df
df.head() # 显示DataFrame的前几行
我们将使用 NetworkxEntityGraph()
类来创建图。
- 添加节点:第一个循环遍历数据框(
df
)中的每一行,并将source
和target
值作为节点添加到图中。 - 添加边:第二个循环根据
source
和target
在节点之间添加边(source
和target
),同时添加一个称为relation
的边属性,用于存储节点间关系的描述信息。
graph = NetworkxEntityGraph()
# 开始添加节点吧
for id, row in df.iterrows():
graph.add_node(row['source'])
graph.add_node(row['target'])
# 现在来添加边
for id, row in df.iterrows():
graph._graph.add_edge(row['source'],
row['target'],
relation=row['描述']
)
chain = GraphQAChain.from_llm(
llm=client, # 从LLM创建GraphQAChain对象
graph=graph,
verbose=True # 启用详细日志输出
)
我们将打算使用GraphQAChain
类创建一个链式结构,利用语言模型(LLM)来理解并解释图中的信息,从而构建一个基于图的问答(QA)链式结构。
- 链的创建:
GraphQAChain.from_llm
初始化一个使用提供的llm
(语言模型客户端)和graph
(一个NetworkxEntityGraph
)的问题回答链。 - 问题:变量
question
包含问题(“2 型糖尿病在心血管疾病中起作用吗?”)。 - 运行链:
chain.run(question)
使用图和 LLM 处理问题,通过遍历图中的关系和实体提取答案。verbose=True
参数确保详细记录处理过程中的信息。
question = "2型糖尿病是否在心血管病中扮演角色?"
chain.run(question)
结尾
NVIDIA NIM 与 LangChain 集成得非常好,提供了强大的支持来应对大规模语言模型,并且能够构建高级的自然语言处理管道。以下是集成可以有多顺畅:
- LLM 模型访问:NVIDIA Nim 提供了经过优化、适合高性能需求的预训练模型。当与 LangChain 集成时,NIM 的模型可以用于多种任务,例如摘要生成、问答和文本生成,提供多功能性和扩展性。
- 效率与定制化:NIM 专为在 NVIDIA 硬件上进行高效推理而设计。LangChain 的基础设施支持轻松定制和组合不同的模块,如检索器、向量存储和转换器,这与 Nim 的能力相辅相成。
- 端到端工作流:LangChain 支持将 NIM 的高性能模型与外部数据源(例如文档搜索、图形嵌入)结合的端到端工作流。这种集成使用户能够构建快速且适应各种应用场景的流水线。
- 部署灵活性:NIM 的模型经过优化,既可以在云端部署,也可以在本地环境中部署,使得 LangChain 工作流可以在不同的生产环境中轻松扩展。
简单来说,NIM 和 LangChain 两者结合在一起提供了一个强大的组合,平滑集成支持高效的大型 AI 解决方案。
参考:
可以看看这些:
共同学习,写下你的评论
评论加载中...
作者其他优质文章