基于知识图谱的 RAG 应用指南:从零到完整实践
本文介绍如何利用知识图谱增强检索增强生成(RAG)系统。通过对比传统数据库,阐述图数据库在处理复杂关系上的优势。教程涵盖使用 Neo4j、LangChain 和 Azure OpenAI 搭建知识图谱 RAG 应用的完整流程,包括环境配置、数据摄取、文本转图转换及 Cypher 查询实现。内容旨在帮助开发者解决朴素 RAG 缺乏深层上下文理解的问题,提供从理论到代码的实践参考。

本文介绍如何利用知识图谱增强检索增强生成(RAG)系统。通过对比传统数据库,阐述图数据库在处理复杂关系上的优势。教程涵盖使用 Neo4j、LangChain 和 Azure OpenAI 搭建知识图谱 RAG 应用的完整流程,包括环境配置、数据摄取、文本转图转换及 Cypher 查询实现。内容旨在帮助开发者解决朴素 RAG 缺乏深层上下文理解的问题,提供从理论到代码的实践参考。

知识图谱已成为管理与分析复杂数据关系的强大工具。与传统的关系型数据库通过行和列在表格中存储数据不同,图数据库使用节点、边和属性来表示和存储数据,提供了一种更直观和高效的方式来构建、查看和查询复杂系统。本文将指导你了解、实现和利用知识图谱数据库来增强检索增强生成(RAG)系统。
RAG(检索增强生成)是一种技术,它为大语言模型提供了外部知识或数据,这些数据是语言模型未曾训练过的。依赖于基于向量的检索的朴素 RAG 方法面临诸如缺乏深层次上下文理解和复杂推理能力等若干限制。为了解决这些问题,将知识图谱集成到 RAG 系统中。
传统的数据库,如关系数据库,将数据存储在结构化的表格中。尽管这种方法适用于许多应用程序,但在处理复杂关系时却显得不足。关系数据库需要复杂的连接和查询来导航关系,这使得它们效率较低且难以管理。
相比之下,知识图谱设计用于轻松处理复杂关系。它们能够实现:
图数据库在数据点之间关系至关重要的场景中表现卓越。以下是一些常见的应用场景:
在这个项目中,我们使用了 Neo4j 图数据库、LangChain 框架和 Azure Chat OpenAI 模型(GPT 3.5 turbo)。在跳转到代码之前,我们首先在 Neo4j 上创建图数据库实例。
.env 文件中。首先安装所需的 Python 库,并在代码中导入必要的模块。
from langchain_openai import AzureChatOpenAI
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_core.documents import Document
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.graphs import Neo4jGraph
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
llm_deployment_name = os.getenv("llm_deployment_name")
azure_endpoint = os.getenv("azure_endpoint")
db_uri = os.getenv("neo4j_uri")
db_user = os.getenv("neo4j_user")
db_password = os.getenv("neo4j_password")
来自 LangChain 的 AzureChatOpenAI 类允许我们与部署在 Azure 上的 OpenAI GPT 模型进行交互。接下来,我们使用 LangChain 社区图模块中的 Neo4jGraph 类设置 Neo4j 图数据库,以存储和检索数据。Neo4j 提供了 Cypher 查询语言,使得与图数据的交互和查询变得简单易行。
Cypher 查询语言(Cypher)是一种专门用于查询和操作如 Neo4j 这样的图数据库的强大而表达力的语言。它允许用户以直观且高效的方式描述图中的模式。例如,一个简单的 Cypher 查询,用于查找名为 Alice 的所有朋友:
MATCH (alice:Person {name: 'Alice'})-[FRIEND]->(friend)
RETURN friend
此查询匹配名为'Alice'的人员节点,并查找与 Alice 通过'FRIEND'关系连接的所有节点,将这些节点作为朋友返回。
llm = AzureChatOpenAI(
deployment_name=llm_deployment_name,
model_name="gpt-35-turbo-16k",
azure_endpoint=azure_endpoint
)
graph = Neo4jGraph(
url=db_uri,
username=db_user,
password=db_password
)
我们从包含某科技公司员工信息的样本文本开始。将使用 CharacterTextSplitter 将该文本分割成可管理的块,以便 LLM 更好地处理。
text = """
Emily is an employee at TechNova, a leading technology company based in Silicon Heights.
She has been working there for the past four years as a software developer.
James is also an employee at TechNova, where he works as a data analyst.
He joined the company three years ago after completing his undergraduate studies.
TechNova is a renowned technology company that specializes in developing innovative
software solutions and advanced artificial intelligence systems.
The company boasts a diverse team of talented professionals from various fields.
Both Emily and James are highly skilled experts who contribute significantly to
TechNova's achievements. They collaborate closely with their respective teams to create
cutting-edge products and services that cater to the dynamic needs of the company's clients.
"""
documents = [Document(page_content=text)]
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=20)
texts = text_splitter.split_documents(documents)
LLMGraphTransformer 类利用语言模型将文本转换为图文档,在语言模型的帮助下识别节点和关系。一旦我们有了图文档,就可以将其添加到 Neo4j 数据库中。
llm_transformer = LLMGraphTransformer(llm=llm)
graph_documents = llm_transformer.convert_to_graph_documents(texts)
print(f"Nodes:{graph_documents[0].nodes}")
print("-----------------------------------------------------------------")
print(f"Relationships:{graph_documents[0].relationships}")
graph.add_graph_documents(graph_documents)
print("Documents successfully added to Graph DataBase")
请注意,由于构建图时使用了大型语言模型(LLM),因此每次构建的结果可能不同。您也可以根据需要指定要提取的节点和关系的类型。这里是如何设置仅允许特定的节点和关系:
llm_transformer_filtered = LLMGraphTransformer(
llm=llm,
allowed_nodes=["Author", "Book", "Publisher"],
allowed_relationships=["WRITTEN_BY", "PUBLISHED_BY"]
)
graph_documents_filtered = llm_transformer_filtered.convert_to_graph_documents(documents)
要查询图数据库,我们使用来自 LangChain 的 GraphCypherQAChain。这条链允许我们使用自然语言查询从图中提取信息。GraphCypherQAChain 是一个工具,它可以根据用户的问题生成针对 Neo4j 图数据库的 Cypher 查询,从而轻松获取所需的信息。
chain = GraphCypherQAChain.from_llm(
llm,
graph=graph,
verbose=True
)
result = chain.invoke({"query": "Where does James work?"})
print(result)
.env 文件不被提交到版本控制系统中,避免泄露 API 密钥和数据库凭据。本文详细介绍了如何利用知识图谱增强 RAG 系统。通过对比传统数据库,阐述了图数据库在处理复杂关系上的优势。教程涵盖了使用 Neo4j、LangChain 和 Azure OpenAI 搭建知识图谱 RAG 应用的完整流程,包括环境配置、数据摄取、文本转图转换及 Cypher 查询实现。内容旨在帮助开发者解决朴素 RAG 缺乏深层上下文理解的问题,提供从理论到代码的实践参考。在实际应用中,开发者应根据具体业务场景调整图结构和查询策略,以达到最佳效果。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online