分享
基于知识图谱的LangChain应用实战
输入“/”快速插入内容
基于知识图谱的LangChain应用实战
飞书用户1961
飞书用户6574
2024年7月9日修改
作者:AI小智
原文:
https://mp.weixin.qq.com/s/2GecWhZ9EZ-qgmEb5g3TdA
❝
本文经翻译并二次整理自Enhancing RAG-based application accuracy by constructing and leveraging knowledge graphs一文。LangChain已经将图构建模块的首个版本集成到了其生态之中,今天本文将展示基于知识图谱的RAG应用实战 。
本系列合集,点击链接查看
图检索增强生成(Graph RAG)正逐渐流行起来,成为传统向量搜索方法的有力补充。这种方法利用图数据库的结构化特性,将数据以节点和关系的形式组织起来,从而增强检索信息的深度和上下文关联性。
示例知识图谱
图在表示和存储多样化且相互关联的信息方面具有天然优势,能够轻松捕捉不同数据类型间的复杂关系和属性。而向量数据库在处理这类结构化信息时则显得力不从心,它们更擅长通过高维向量处理非结构化数据。在 RAG 应用中,结合结构化的图数据和非结构化的文本向量搜索,可以让我们同时享受两者的优势,这也是本文将要探讨的内容。
知识图谱的确很有用,但如何构建一个呢?
构建知识图谱通常是利用图数据表示的强大功能中最困难的一步。它需要收集和整理数据,这需要对领域知识和图建模有深刻的理解。为了简化这一过程,我们开始尝试使用大型语言模型(LLM)。LLM 凭借其对语言和上下文的深刻理解,可以自动化知识图谱创建过程中的大部分工作。通过分析文本数据,这些模型能够识别实体,理解它们之间的关系,并提出如何在图结构中最佳表示这些实体。基于这些实验,我们已经将图构建模块的首个版本集成到了 LangChain 中,本文将展示其应用。
相关代码已在 GitHub 上发布。
Neo4j 环境搭建
为了跟随本文的示例,您需要搭建一个 Neo4j 实例。最简单的方法是在 Neo4j Aura 上启动一个免费实例,它提供了 Neo4j 数据库的云版本。当然,您也可以通过下载 Neo4j Desktop 应用程序来创建一个本地数据库实例。
代码块
Plain Text
os.environ[
"OPENAI_API_KEY"
] =
"sk-"
os.environ[
"NEO4J_URI"
] =
"bolt://localhost:7687"
os.environ[
"NEO4J_USERNAME"
] =
"neo4j"
os.environ[
"NEO4J_PASSWORD"
] =
"password"
graph = Neo4jGraph()
此外,您还需要一个 OpenAI 密钥,因为我们将在本文中使用他们的模型。
数据导入
在本次演示中,我们将使用伊丽莎白一世的维基百科页面。我们可以利用 LangChain 加载器 轻松地从维基百科获取并分割文档。
代码块
Plain Text
# 读取维基百科文章
raw_documents = WikipediaLoader(query=
"Elizabeth I"
).load()
# 定义分块策略
text_splitter = TokenTextSplitter(chunk_size=
512
, chunk_overlap=
24
)
documents = text_splitter.split_documents(raw_documents[:
3
])
现在是时候根据获取的文档来构建图谱了。为此,我们开发了一个
LLMGraphTransformer
模块,它极大地简化了在图数据库中构建和存储知识图谱的过程。
代码块
Plain Text
llm=ChatOpenAI(temperature=
0
, model_name=
"gpt-4-0125-preview"
)
llm_transformer = LLMGraphTransformer(llm=llm)
# 提取图数据
graph_documents = llm_transformer.convert_to_graph_documents(documents)
# 存储到 neo4j
graph.add_graph_documents(
graph_documents,
baseEntityLabel=True,
include_source=True
)
您可以指定知识图谱生成链使用哪种 LLM。目前,我们只支持 OpenAI 和 Mistral 的函数调用模型。不过,我们计划未来会扩展 LLM 的选择范围。在这个例子中,我们使用的是最新的 GPT-4。需要注意的是,生成的图谱质量很大程度上取决于您使用的模型。理论上,您应该选择能力最强的模型。LLM 图转换器返回的图文档可以通过
add_graph_documents
方法导入到 Neo4j。
baseEntityLabel
参数为每个节点添加了一个额外的
__Entity__
标签,以增强索引和查询性能。
include_source
参数则将节点与其原始文档关联起来,便于数据追溯和理解上下文。
您可以在 Neo4j 浏览器中查看生成的图谱。