以编程方式使用文档

本指南介绍 Graph RAG。如需了解所有 支持的功能和配置,请参阅 Graph RAG 项目页面.

概述

GraphRetriever 中的 langchain-graph-retriever 包提供了一个 LangChain 检索器 ,它将 **非结构化** 向量相似性搜索 与 **结构化** 元数据属性遍历相结合。这使得基于图谱的 检索能够针对 **现有的** 向量存储进行。

集成详情

检索器来源PyPI 包最新版本项目页面
GraphRetrievergithub.com/datastax/graph-raglangchain-graph-retriever!PyPI - 版本Graph RAG

优势

* **基于现有元数据进行链接:** 无需额外处理即可使用现有元数据字段。从 现有向量存储中获取更多信息!

* **按需更改链接:** 边可以动态指定,允许根据问题遍历不同的关系 。

* **可插拔的遍历策略:** 使用内置遍历策略(如 Eager 或 MMR),或定义自定义逻辑来选择 要探索的节点。

* **广泛的兼容性:** 适配器可用于多种向量存储,并可轻松添加更多 存储支持。

设置

安装

此检索器位于 langchain-graph-retriever package.

pip install -qU langchain-graph-retriever
uv add langchain-graph-retriever

实例化

以下示例将展示如何对一些示例 动物文档执行图遍历。

前提条件

<details> <summary>点击查看详情</summary> 1. 确保已安装 Python 3.10+

1. 安装提供示例数据的以下包。

        pip install -qU graph_rag_example_helpers
        

1. 下载测试文档:

        from graph_rag_example_helpers.datasets.animals import fetch_documents
        animals = fetch_documents()
        

1. </details>

填充向量存储

本节展示如何使用示例数据填充各种向量存储。

如需帮助选择以下向量存储之一,或为您的 向量存储添加支持,请参阅关于 适配器和支持的存储.

AstraDB

安装 langchain-graph-retriever 使用以下命令安装包 astra extra:

      pip install "langchain-graph-retriever[astra]"
      

然后创建一个向量存储并加载测试文档:

      from langchain_astradb import AstraDBVectorStore

      vector_store = AstraDBVectorStore.from_documents(
          documents=animals,
          embedding=embeddings,
          collection_name="animals",
          api_endpoint=ASTRA_DB_API_ENDPOINT,
          token=ASTRA_DB_APPLICATION_TOKEN,
      )
      

关于 ASTRA_DB_API_ENDPOINTASTRA_DB_APPLICATION_TOKEN 凭证, 请参阅 AstraDB 向量存储指南.

:::note 为了更快地进行初始测试,请考虑使用 **内存中** 向量存储。 :::

Chroma

安装 langchain-graph-retriever 包,使用 chroma extra:

      pip install "langchain-graph-retriever[chroma]"
      

然后创建一个向量存储并加载测试文档:

      from langchain_chroma.vectorstores import Chroma
      from langchain_graph_retriever.transformers import ShreddingTransformer

      vector_store = Chroma.from_documents(
          documents=list(ShreddingTransformer().transform_documents(animals)),
          embedding=embeddings,
          collection_name="animals",
      )
      

关于创建 Chroma 连接,请参阅 Chroma 向量存储指南.

:::note Chroma 不支持在嵌套元数据中搜索。因此 在这种情况下,有必要使用 ShreddingTransformer 来插入文档。 :::

InMemory

安装 langchain-graph-retriever package:

      pip install "langchain-graph-retriever"
      

然后创建一个向量存储并加载测试文档:

      from langchain_core.vectorstores import InMemoryVectorStore

      vector_store = InMemoryVectorStore.from_documents(
          documents=animals,
          embedding=embeddings,
      )
      

:::tip 使用 InMemoryVectorStore 是开始使用 Graph RAG 的最快方式 但不建议用于生产环境。建议改用 **AstraDB** or **OpenSearch**. :::

图遍历

此图检索器从与查询最匹配的一个动物开始,然后 遍历到具有相同 habitat and/or origin.

  from graph_retriever.strategies import Eager
  from langchain_graph_retriever import GraphRetriever

  traversal_retriever = GraphRetriever(
      store = vector_store,
      edges = [("habitat", "habitat"), ("origin", "origin")],
      strategy = Eager(k=5, start_k=1, max_depth=2),
  )
  

的其他动物。以上创建了一个图遍历检索器,它从最近的 动物 (start_k=1) 开始,检索 5 个文档 (k=5) 并将搜索限制在 距离第一个动物最多 2 步的文档 (max_depth=2).

edges 定义了如何使用元数据值进行遍历。在这种情况下,每个 动物都与其他具有相同 habitat and/or origin.

results = traversal_retriever.invoke("what animals could be found near a capybara?")

for doc in results:
    print(f"{doc.id}: {doc.page_content}")
capybara: capybaras are the largest rodents in the world and are highly social animals.
heron: herons are wading birds known for their long legs and necks, often seen near water.
crocodile: crocodiles are large reptiles with powerful jaws and a long lifespan, often living over 70 years.
frog: frogs are amphibians known for their jumping ability and croaking sounds.
duck: ducks are waterfowl birds known for their webbed feet and quacking sounds.

图遍历通过利用数据中的结构化关系来提高检索质量。 与标准相似性搜索不同(见下文),它为文档选择提供了清晰、 可解释的依据。

在这种情况下,文档 capybara, heron, frog, crocodilenewt 都 共享相同的 habitat=wetlands,如元数据中所定义。这应该会提高 文档相关性以及 LLM 答案的质量。

与标准检索的比较

max_depth=0时,图遍历检索器的行为类似于标准检索器:

standard_retriever = GraphRetriever(
    store = vector_store,
    edges = [("habitat", "habitat"), ("origin", "origin")],
    strategy = Eager(k=5, start_k=5, max_depth=0),
)

这会创建一个检索器,从最近的 5 个动物开始 (start_k=5), 并返回它们,不进行任何遍历 (max_depth=0)。在这种情况下,边定义 会被忽略。

这基本上与以下相同:

standard_retriever = vector_store.as_retriever(search_kwargs={"k":5})

对于这两种情况,调用检索器会返回:

results = standard_retriever.invoke("what animals could be found near a capybara?")

for doc in results:
    print(f"{doc.id}: {doc.page_content}")
capybara: capybaras are the largest rodents in the world and are highly social animals.
iguana: iguanas are large herbivorous lizards often found basking in trees and near water.
guinea pig: guinea pigs are small rodents often kept as pets due to their gentle and social nature.
hippopotamus: hippopotamuses are large semi-aquatic mammals known for their massive size and territorial behavior.
boar: boars are wild relatives of pigs, known for their tough hides and tusks.

这些文档仅基于相似性进行连接。 存储中的任何结构数据都会被忽略。 与图检索相比,这可能会降低文档 相关性,因为返回结果不太可能有助于回答

使用

按照上面的示例, invoke 用于启动对查询的检索。

API 参考

要了解所有可用参数和高级配置,请参阅 Graph RAG API 参考.