跳到主要内容

检索器

概述

存在许多不同类型的检索系统,包括向量存储、图数据库和关系数据库。随着大型语言模型的日益普及,检索系统已成为 AI 应用程序的重要组成部分(例如,RAG)。由于它们的重要性和可变性,LangChain 提供了与不同类型的检索系统交互的统一接口。 LangChain 检索器 接口非常简单

  1. 输入:查询(字符串)
  2. 输出:文档列表(标准化的 LangChain Document 对象)

关键概念

Retriever

所有检索器都实现了一个简单的接口,用于使用自然语言查询检索文档。

接口

检索器的唯一要求是能够接受查询并返回文档。 特别是,LangChain 的检索器类 仅要求实现 _getRelevantDocuments 方法,该方法接受 query: string 并返回与查询最相关的 Document 对象列表。 用于获取相关文档的底层逻辑由检索器指定,并且可以是对于应用程序最有用的任何逻辑。

LangChain 检索器是一个 runnable,它是 LangChain 组件的标准接口。 这意味着它有一些通用方法,包括 invoke,用于与之交互。 可以使用查询调用检索器

const docs = await retriever.invoke(query);

检索器返回 Document 对象列表,这些对象具有两个属性

  • pageContent:此文档的内容。 目前是字符串。
  • metadata:与此文档关联的任意元数据(例如,文档 ID、文件名、来源等)。
[进一步阅读]
  • 请参阅我们的 操作指南,了解如何构建您自己的自定义检索器。

常用类型

尽管检索器接口具有灵活性,但仍经常使用一些常见的检索系统类型。

搜索 API

重要的是要注意,检索器实际上不需要存储文档。 例如,我们可以构建在搜索 API 之上的检索器,这些 API 仅返回搜索结果!

关系数据库或图数据库

检索器可以构建在关系数据库或图数据库之上。 在这些情况下,使用 查询分析 技术从自然语言构建结构化查询至关重要。 例如,您可以使用文本到 SQL 转换为 SQL 数据库构建检索器。 这允许将自然语言查询(字符串)检索器转换为幕后的 SQL 查询。

[进一步阅读]
  • 请参阅我们的 教程,了解有关如何使用 SQL 数据库和文本到 SQL 构建检索器的上下文。
  • 请参阅我们的 教程,了解有关如何使用图数据库和文本到 Cypher 构建检索器的上下文。

正如我们在 检索 的概念回顾中所讨论的那样,许多搜索引擎都基于将查询中的单词与每个文档中的单词进行匹配。 BM25TF-IDF两种流行的词法搜索算法。 LangChain 具有适用于许多流行的词法搜索算法/引擎的检索器。

[进一步阅读]
  • 请参阅 BM25 检索器集成。

向量存储

向量存储 是一种强大而高效的索引和检索非结构化数据的方式。 向量存储可以通过调用 asRetriever() 方法用作检索器。

const vectorstore = new MyVectorStore();
const retriever = vectorstore.asRetriever();

高级检索模式

集成

由于检索器接口非常简单,因此返回给定搜索查询的 Document 对象列表,因此可以使用集成组合多个检索器。 当您有多个擅长查找不同类型的相关文档的检索器时,这尤其有用。 创建一个 集成检索器 非常容易,该检索器将多个检索器与线性加权分数相结合

// Initialize the ensemble retriever
const ensembleRetriever = new EnsembleRetriever({
retrievers: [bm25Retriever, vectorStoreRetriever],
weights: [0.5, 0.5],
});

在集成时,我们如何组合来自多个检索器的搜索结果? 这激发了重新排序的概念,重新排序采用多个检索器的输出,并使用更复杂的算法(例如 倒数排名融合 (RRF))将它们组合起来。

源文档保留

许多检索器利用某种索引来使文档易于搜索。 索引过程可以包括转换步骤(例如,向量存储通常使用文档分割)。 无论使用何种转换,都可以非常有用,以保留转换后的文档与原始文档之间的链接,从而使检索器能够返回原始文档。

Retrieval with full docs

这在 AI 应用程序中尤其有用,因为它确保模型不会丢失文档上下文。 例如,您可以使用小块大小在向量存储中索引文档。 如果您返回块作为检索结果,则模型将丢失块的原始文档上下文。

LangChain 有两个不同的检索器可用于解决此挑战。 Multi-Vector 检索器允许用户使用任何文档转换(例如,使用 LLM 编写文档摘要)进行索引,同时保留与源文档的链接。 ParentDocument 检索器链接来自文本分割器转换的文档块以进行索引,同时保留与源文档的链接。

名称索引类型使用 LLM何时使用描述
ParentDocument向量存储 + 文档存储如果您的页面有许多较小的、不同的信息片段,最好单独索引,但最好一起检索。这涉及为每个文档索引多个块。 然后,您找到嵌入空间中最相似的块,但您检索整个父文档并返回它(而不是单独的块)。
Multi Vector向量存储 + 文档存储有时在索引期间如果您能够从文档中提取您认为比文本本身更相关的索引信息。这涉及为每个文档创建多个向量。 每个向量都可以通过多种方式创建 - 示例包括文本摘要和假设性问题。
[进一步阅读]
  • 请参阅我们的 操作指南,了解如何使用 ParentDocument 检索器。
  • 请参阅我们的 操作指南,了解如何使用 MultiVector 检索器。
  • 请观看我们在 多向量检索器 上的 RAG from Scratch 视频。

此页内容对您有帮助吗?


您也可以留下详细的反馈 在 GitHub 上.