Skip to main content
在 GitHub 上打开

Retriever

概述

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

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

关键概念

Retriever

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

接口

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

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

docs = retriever.invoke(query)

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

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

常见类型

尽管检索器界面很灵活,但经常使用一些常见类型的检索系统。

搜索 API

请务必注意,检索器不需要实际存储文档。 例如,我们可以在搜索 API 之上构建检索器,这些检索器只是返回搜索结果! 请参阅我们与 Amazon KendraWikipedia 搜索的检索器集成。

关系数据库或图形数据库

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

延伸阅读
  • 有关如何使用 SQL 数据库和 text-to-SQL 构建检索器的上下文,请参阅我们的教程
  • 请参阅我们的教程,了解如何使用图形数据库和 text-to-Cypher 构建检索器。

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

延伸阅读
  • 请参阅 BM25 retriever 集成。
  • 请参阅 TF-IDF 检索器集成。
  • 请参阅 Elasticsearch 检索器集成。

矢量存储

矢量存储是索引和检索非结构化数据的一种强大而有效的方法。 vectorstore 可以通过调用as_retriever()方法。

vectorstore = MyVectorStore()
retriever = vectorstore.as_retriever()

高级检索模式

整体

因为 retriever 接口非常简单,所以返回一个Document对象给定一个搜索查询,则可以使用 ensembling 组合多个检索器。 当您有多个擅长查找不同类型的相关文档的检索器时,这特别有用。 创建一个将多个检索器与线性加权分数相结合的集成检索器很容易:

# Initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_store_retriever], weights=[0.5, 0.5]
)

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

源文档保留

许多检索器利用某种索引来使文档易于搜索。 索引过程可以包括一个转换步骤(例如,vectorstore 通常使用文档拆分)。 无论使用什么转换,对于保持转换后的文档和原始文档之间的链接都非常有用,从而使检索器能够返回原始文档。

使用完整文档进行检索

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

LangChain 有两种不同的检索器可用于应对这一挑战。 Multi-Vector 检索器允许用户使用任何文档转换(例如,使用 LLM 编写文档摘要)进行索引,同时保留与源文档的链接。 ParentDocument 检索器链接文本拆分器转换中的文档块以进行索引,同时保留与源文档的链接。

名字索引类型使用 LLM适用情形描述
ParentDocumentVector store + Document StoreNoIf your pages have lots of smaller pieces of distinct information that are best indexed by themselves, but best retrieved all together.This involves indexing multiple chunks for each document. Then you find the chunks that are most similar in embedding space, but you retrieve the whole parent document and return that (rather than individual chunks).
Multi VectorVector store + Document StoreSometimes during indexingIf you are able to extract information from documents that you think is more relevant to index than the text itself.This involves creating multiple vectors for each document. Each vector could be created in a myriad of ways - examples include summaries of the text and hypothetical questions.
延伸阅读