使用 GraphRAG 与 LangChain 集成 Neo4j 知识图谱及向量数据库
本文将展示如何使用 LLaMa 3.1(一个本地运行的模型)来执行 GraphRAG 操作。GraphRAG 是一种通过考虑实体和文档之间的关系来执行检索增强生成的方式,关键概念是节点和关系。
知识图谱与向量数据库集成
知识图谱与向量数据库集成是 GraphRAG 架构之一:这种方法利用知识图谱和向量数据库来收集相关信息。知识图谱的构建方式可以捕获向量块之间的关系,包括文档层次结构。知识图谱在从向量搜索中检索到的块附近提供结构化实体信息,从而通过有价值的附加上下文丰富提示。这个丰富的提示被输入到 LLM 中进行处理,然后 LLM 生成响应。最后,生成的答案返回给用户。此架构适用于客户支持、语义搜索和个性化推荐等用例。
节点代表从数据块中提取的实体或概念,例如人、组织、事件或地点。知识图谱中,每个节点都包含属性和特性,这些属性为实体提供了更多上下文信息。
然后我们定义节点之间的连接关系,这些连接可以包括各种类型的关联,例如层次结构(如父子关系)、时间顺序(如前后关系)或因果关系。关系还具有描述连接性质和强度的属性。当你有很多文档时,你会得到一个很好的图来描述所有文档之间的关系。
让我们看一个非常简单的例子,在我们的数据集中,节点可以代表像苹果公司和蒂姆·库克这样的实体,而关系则可以描述蒂姆·库克是苹果公司的 CEO。
这种方法非常强大,但一个巨大的缺点是它计算成本很高,因为你必须从每个文档中提取实体,并使用 LLM 计算关系图。这就是为什么使用像 LLaMa 3.1 这样本地运行的模型来采用这种方法非常棒。
环境配置与依赖安装
在本文中,我们将结合使用 LangChain、LLaMa 和 Ollama,以及 Neo4j 作为图数据库。我们将创建一个关于一个拥有多家餐厅的大型意大利家庭的信息图,所以这里有很多关系需要建模。
拉取模型
先利用 Ollama 拉取 llama3.1 8b 模型。
配置运行 Neo4j 数据库
在进入代码之前,我们将设置 Neo4j。我为你创建了一个 Docker Compose 文件。所以我们将使用 neo4j 文件夹,里面有一个 jar 文件,这是我们创建图所需的插件。
要创建我们的数据库,只需运行 docker compose up:
这将设置所有内容,并且可以直接使用。可能需要几秒钟,之后你会看到数据库正在运行。
安装依赖
然后我们可以进入 Jupyter Notebook,首先安装所需的包:
我们需要安装 LangChain、OpenAI 的 LangChain、Ollama、LangChain Experimental,因为图解决方案目前在 LangChain 实验包中。
我们还需要安装 Neo4j,以及用于在 Jupyter Notebook 中显示图的 py2neo 和 ipywidgets。
%pip install --upgrade --quiet langchain langchain-community langchain-openai langchain-ollama langchain-experimental neo4j tiktoken yfiles_jupyter_graphs python-dotenv
导入类与初始化
安装完这些包后,我们可以导入所需的类。我们将从 LangChain 中导入多个类,例如 RunnablePassthrough、ChatPromptTemplate、OutputParser 等。
我们还导入 Neo4j 的图类,这在 LangChain Community 包的 Graphs 模块中。我们还导入 ChatOpenAI 作为 Ollama 的后备模型。
在 LangChain Experimental 包中,我们有一个 Graph Transformer 模块,我们将从那里导入 LLMGraphTransformer,它利用复杂的提示将数据转换为可以存储在图数据库中的形式。
我们还将导入 Neo4j 的图数据库,不仅作为图数据库使用,还可以作为普通的向量数据库使用。
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 BaseModel, Field
langchain_core.output_parsers StrOutputParser
os
langchain_community.graphs Neo4jGraph
langchain.text_splitter RecursiveCharacterTextSplitter
langchain_openai ChatOpenAI
langchain_community.chat_models ChatOllama
langchain_experimental.graph_transformers LLMGraphTransformer
neo4j GraphDatabase
yfiles_jupyter_graphs GraphWidget
langchain_community.vectorstores Neo4jVector
langchain_openai OpenAIEmbeddings
langchain_community.document_loaders TextLoader
langchain_community.vectorstores.neo4j_vector remove_lucene_chars
dotenv load_dotenv
load_dotenv()


