Skip to main content

检索器

概览

存在多种不同类型的检索系统,包括向量存储、图数据库和关系型数据库。
随着大型语言模型的流行,检索系统已成为AI应用中的重要组件(例如,RAG)。
由于其重要性和多样性,LangChain 提供了一个统一的接口来与不同类型的检索系统进行交互。
LangChain 检索器 接口非常简单:

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

关键概念

检索器

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

接口

检索器的唯一要求是能够接受查询并返回文档。
具体来说,LangChain 的检索器类 只需要实现 _getRelevantDocuments 方法,该方法接受一个 query: string 并返回与查询最相关的 Document 对象列表。
获取相关文档所使用的底层逻辑由检索器指定,并且可以根据应用程序的需要灵活设计。

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

const docs = await retriever.invoke(query);

检索器返回一个 Document 对象列表,每个对象具有两个属性:

  • pageContent:文档的内容,目前是一个字符串。
  • metadata:与此文档关联的任意元数据(例如文档ID、文件名、来源等)。
[进一步阅读]

常见类型

尽管检索器接口非常灵活,但一些常见的检索系统类型被频繁使用。

搜索API

需要注意的是,检索器不需要实际存储文档。
例如,我们可以基于搜索API构建检索器,该API仅返回搜索结果!

关系型或图数据库

检索器可以建立在关系型或图数据库之上。
在这种情况下,从自然语言构建结构化查询的 查询分析 技术是关键。
例如,你可以使用文本到SQL转换为SQL数据库构建一个检索器。这允许将自然语言查询(字符串)在后台转换为SQL查询。

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

词汇搜索

正如我们在 检索 的概念回顾中所讨论的,许多搜索引擎是基于匹配查询中的词与文档中的词。
BM25TF-IDF两种流行的词汇搜索算法
LangChain 为许多流行的词汇搜索算法/引擎提供了检索器。

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

向量存储

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

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

高级检索模式

集成检索

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

// 初始化集成检索器
const ensembleRetriever = new EnsembleRetriever({
retrievers: [bm25Retriever, vectorStoreRetriever],
weights: [0.5, 0.5],
});

在集成时,我们如何组合多个检索器的结果?
这促使了重新排序的概念出现,它采用更复杂的算法(例如 互惠秩融合(RRF))来整合多个检索器的输出。

源文档保留

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

使用完整文档的检索

这在AI应用中尤其有用,因为它确保模型不会丢失文档的上下文。
例如,你可能使用较小的块大小对向量存储中的文档进行索引。
如果你仅返回 作为检索结果,那么模型将失去这些块的原始文档上下文。

LangChain 提供了两种不同的检索器来解决这个问题。
Multi-Vector 检索器允许用户使用任何文档转换(例如,使用LLM编写文档摘要)进行索引,同时保留与源文档的链接。
ParentDocument 检索器将文本分割器转换生成的文档块进行索引,同时保留与源文档的链接。

名称索引类型使用LLM使用场景描述
ParentDocument向量存储 + 文档存储如果你的页面包含大量需要单独索引但最好整体检索的不同小信息块。这涉及到为每个文档索引多个块。然后你找到嵌入空间中最相似的块,但检索整个父文档并返回它(而不是单个块)。
Multi Vector向量存储 + 文档存储有时在索引期间如果你能从文档中提取出你认为比文本本身更适合索引的信息。这涉及到为每个文档创建多个向量。每个向量可以通过多种方式创建 - 示例包括文本摘要和假设性问题。
[进一步阅读]

Was this page helpful?


You can also leave detailed feedback on GitHub.