Docs 菜单
Docs 主页
/ /

通过 MongoDB 和 LangChain 实现 GraphRAG

本教程演示了如何使用 MongoDB Atlas 和 LangChain 实现 GraphRAG。GraphRAG 是传统 RAG 的替代方法,它将您的数据构建为知识图谱,而不是向量嵌入。当与 LLM 结合使用时,这种方法能够实现关系感知检索和多跳推理。

使用本教程的可运行版本以作为 Python 笔记本

GraphRAG 是传统 RAG 的替代方法,它将数据构建为实体及其关系的知识图谱,而不是向量嵌入。基于向量的 RAG 查找在语义上与查询相似的文档,而 GraphRAG 查找与查询相连的实体,并遍历图中的关系以检索相关信息。

这种方法尤其适用于回答基于关系的问题,例如“公司 A 和公司 B 之间有什么联系?”或“谁是 X 先生/女士的经理?”。

MongoDBGraphStore 是 LangChain MongoDB 集成中的一个组件,它允许您通过将实体(节点)及其关系(边)存储在 MongoDB 集合中来实现 GraphRAG。该组件将每个实体存储为一个文档,其中包含引用您集合中其他文档的关系字段。它使用 $graphLookup 聚合阶段执行查询。

如要完成本教程,您必须具备以下条件:

  • 以下MongoDB 集群类型之一:

  • OpenAI API密钥。您必须拥有一个具有可用于API请求的积分的 OpenAI 帐户。要学习;了解有关注册 OpenAI 帐户的更多信息,请参阅 OpenAI API网站。

  • 运行VS CodeColab等交互式Python笔记本的环境。

为此教程设置环境。 通过保存扩展名为 .ipynb 的文件来创建交互式Python笔记本。 此 Notebook 允许您单独运行Python代码片段,并且您将使用它来运行本教程中的代码。

要设立笔记本环境,请执行以下操作:

1

运行以下命令:

pip install --quiet --upgrade pymongo langchain_community wikipedia langchain_openai langchain_mongodb
2

复制以下代码示例,将变量替换为您自己的值,然后运行代码:

<api-key>

您的 OpenAI API 密钥

<connection-string>

MongoDB集群的 SRV连接字符串

import os
os.environ["OPENAI_API_KEY"] = "<api-key>"
MONGODB_URI = "<connection-string>"
DB_NAME = "langchain_db" # MongoDB database to store the knowledge graph
COLLECTION = "wikipedia" # MongoDB collection to store the knowledge graph

注意

<connection-string> 替换为您的 Atlas 集群或本地部署的连接字符串。

连接字符串应使用以下格式:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

要学习;了解更多信息,请参阅通过驱动程序连接到集群。

连接字符串应使用以下格式:

mongodb://localhost:<port-number>/?directConnection=true

要学习;了解更多信息,请参阅连接字符串。

本节演示如何使用MongoDB作为 GraphRAG 的知识图表。在笔记本中粘贴并运行以下代码:

1

使用 LangChain 中的 init_chat_model 方法初始化 LLM:

from langchain_openai import OpenAI
from langchain.chat_models import init_chat_model
chat_model = init_chat_model("gpt-4o", model_provider="openai", temperature=0)
2

在本教程中,您将使用来自 Wikipedia 的公开可访问数据作为数据源。要加载示例数据,请运行以下代码片段。它执行以下步骤:

  • 检索维基百科的页面子集,按查询 Sherlock Holmes 过滤。

  • 使用文本拆分器将数据分割成较小的文档。

  • 指定数据块参数,这些参数决定每个文档中的字符数以及两个连续文档之间应重叠的字符数。

from langchain_community.document_loaders import WikipediaLoader
from langchain.text_splitter import TokenTextSplitter
wikipedia_pages = WikipediaLoader(query="Sherlock Holmes", load_max_docs=3).load()
text_splitter = TokenTextSplitter(chunk_size=1024, chunk_overlap=0)
wikipedia_docs = text_splitter.split_documents(wikipedia_pages)
3

使用 MongoDBGraphStore 类构建知识图表并将其加载到MongoDB 集群中:

from langchain_mongodb.graphrag.graph import MongoDBGraphStore
graph_store = MongoDBGraphStore.from_connection_string(
connection_string = MONGODB_URI,
database_name = DB_NAME,
collection_name = COLLECTION,
entity_extraction_model = chat_model
)
4

使用 add_documents 方法将文档添加到集合中。当您添加新文档时,此方法会查找现有实体并更新它们,如果不存在则创建新的实体。

此步骤可能需要几分钟。您可以忽略输出中出现的任何警告。

graph_store.add_documents(wikipedia_docs)

运行样本代码后,您可以通过导航至 Atlas 用户界面中的 documents.wikipedia 集合来查看数据的存储情况。

5

您可以使用 networkxpyvis 库来可视化图表结构。如需有关示例,请参阅笔记本。

调用知识图表回答问题。使用 chat_response 方法调用知识图表。它从MongoDB检索相关文档,然后使用您指定的聊天模型以自然语言生成回答。

具体来说,聊天模型从查询中提取实体, MongoDB遍历知识图表以使用 $graphLookup 阶段查找连接的实体,并将最近的实体及其关系与查询一起发送回聊天模型以生成响应。

query = "Who inspired Sherlock Holmes?"
answer = graph_store.chat_response(query)
print(answer.content)
Sherlock Holmes was inspired by Dr. Joseph Bell, a physician known for his keen observation and deductive reasoning, as acknowledged by Sir Arthur Conan Doyle, Holmes' creator.

观看此视频以查看本教程中使用的代码演示。

时长:2 分钟

后退

本地 RAG

在此页面上