随着 Neo4j 宣布与 LangChain 的集成,我们见证了大量基于知识图谱和大语言模型(LLM)的检索增强生成(RAG)应用场景的涌现。这一发展在最近几个月显著推动了知识图谱在 RAG 中的应用。相比传统的 RAG 系统,基于知识图谱的 RAG 系统在管理幻觉(hallucinations)方面表现更佳。此外,基于代理的系统的使用也在快速增长,以进一步增强 RAG 应用。为了更进一步,LangChain 生态系统中新增了 LangGraph 框架,为 LLM 应用添加了循环和持久化功能。
本文将详细介绍如何使用 LangChain 和 Neo4j 构建一个 GraphRAG 工作流,并通过实际代码示例进行分步讲解,最后提供完整的代码实现。
目录
- 项目简介
- 环境配置
- 安装必要的库
- 配置环境变量
- 代码结构与功能概述
- 分步讲解代码
- 导入库与加载环境变量
- 配置 OpenAI LLM
- 读取和分割文本
- 转换为图文档
- 连接 Neo4j 数据库
- 写入图数据库
- 查询与验证
- 完整代码
- 总结与展望
项目简介
在本项目中,我们将使用 LangChain 构建一个工作流,该工作流能够读取文本数据,使用大语言模型进行处理,并将结果存储在 Neo4j 图数据库中。这种方式不仅能够有效管理和查询知识,还能通过图数据库的强大关系分析能力,增强 RAG 应用的表现。
环境配置
安装必要的库
首先,确保您的开发环境中安装了以下必要的 Python 库:
pip install langchain_openai dotenv langchain_community python-dotenv
配置环境变量
为了确保敏感信息(如 API 密钥、数据库链接和密码)的安全,我们将使用环境变量来存储这些信息。您可以通过创建一个 .env
文件来管理这些变量。
- 创建
.env
文件
在项目的根目录下创建一个名为 .env
的文件,并添加以下内容:
OPENAI_API_KEY=your_openai_api_key
OPENAI_API_URL=http://your_api_url:port/v1
NEO4J_URI=bolt://your_neo4j_host:port
NEO4J_USERNAME=your_neo4j_username
NEO4J_PASSWORD=your_neo4j_password
注意: 请将 your_openai_api_key
、your_api_url
、your_neo4j_host
、your_neo4j_username
和 your_neo4j_password
替换为您的实际凭证信息。
- 加载环境变量
在代码中使用 python-dotenv
库加载 .env
文件中的环境变量:
from dotenv import load_dotenv
# 加载 .env 文件中的环境变量
load_dotenv()
代码结构与功能概述
整个工作流分为以下几个主要步骤:
- 导入库与加载环境变量:引入必要的 Python 库并加载环境变量。
- 配置 OpenAI LLM:设置大语言模型的相关参数。
- 读取和分割文本:从文件中读取文本内容,并使用
RecursiveCharacterTextSplitter
进行分块处理。 - 转换为图文档:将分割后的文档转换为适合存储在图数据库中的格式。
- 连接 Neo4j 数据库:配置并连接到 Neo4j 图数据库。
- 写入图数据库:将转换后的图文档写入 Neo4j 数据库中。
- 查询与验证:执行数据库查询以验证数据的正确写入。
分步讲解代码
下面我们将逐步解析每一部分代码,理解其功能与实现。
导入库与加载环境变量
from langchain_openai import OpenAI
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain_core.documents import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_experimental.graph_transformers import LLMGraphTransformer
# 对接国产模型需要修改use_function_call
# from llm_cn import LLMGraphTransformer
import os
from dotenv import load_dotenv
from langchain_community.graphs import Neo4jGraph
# 加载 .env 文件中的环境变量
load_dotenv()
说明:
- 导入了 LangChain