检索器
概述
存在许多不同类型的检索系统,包括向量存储、图数据库和关系数据库。随着大型语言模型越来越受欢迎,检索系统已成为 AI 应用的重要组成部分(例如,RAG)。由于它们的重要性及可变性,LangChain 为与不同类型的检索系统交互提供了统一的接口。LangChain 检索器 接口非常简单
- 输入:查询(字符串)
- 输出:文档列表(标准化的 LangChain Document 对象)
关键概念
所有检索器都实现了一个简单的接口,用于使用自然语言查询检索文档。
接口
检索器的唯一要求是能够接受查询并返回文档。特别是,LangChain 的检索器类 仅要求实现 _get_relevant_documents
方法,该方法接受 query: str
并返回与查询最相关的 Document 对象列表。用于获取相关文档的底层逻辑由检索器指定,并且可以是对于应用程序最有用的任何逻辑。
LangChain 检索器是一个 runnable,它是 LangChain 组件的标准接口。这意味着它有一些通用方法,包括 invoke
,用于与之交互。可以使用查询调用检索器
docs = retriever.invoke(query)
检索器返回 Document 对象列表,这些对象具有两个属性
page_content
:此文档的内容。目前是字符串。metadata
:与此文档关联的任意元数据(例如,文档 ID、文件名、来源等)。
- 请参阅我们关于构建您自己的自定义检索器的操作指南。
常见类型
尽管检索器接口具有灵活性,但仍经常使用一些常见类型的检索系统。
搜索 API
重要的是要注意,检索器不需要实际存储文档。例如,我们可以在搜索 API 之上构建检索器,这些 API 仅返回搜索结果!请参阅我们与 Amazon Kendra 或 Wikipedia 搜索的检索器集成。
关系数据库或图数据库
检索器可以构建在关系数据库或图数据库之上。在这些情况下,使用 查询分析 技术从自然语言构建结构化查询至关重要。例如,您可以使用文本到 SQL 转换为 SQL 数据库构建检索器。这允许将自然语言查询(字符串)检索器在幕后转换为 SQL 查询。
词汇搜索
正如我们在 检索 的概念回顾中所讨论的,许多搜索引擎都基于将查询中的单词与每个文档中的单词进行匹配。BM25 和 TF-IDF 是 两种流行的词汇搜索算法。LangChain 具有针对许多流行的词汇搜索算法/引擎的检索器。
- 请参阅 BM25 检索器集成。
- 请参阅 TF-IDF 检索器集成。
- 请参阅 Elasticsearch 检索器集成。
向量存储
向量存储 是一种强大而有效的方式来索引和检索非结构化数据。向量存储可以通过调用 as_retriever()
方法用作检索器。
vectorstore = MyVectorStore()
retriever = vectorstore.as_retriever()
高级检索模式
集成
由于检索器接口非常简单,给定搜索查询,返回一个 Document
对象列表,因此可以使用集成来组合多个检索器。当您有多个检索器擅长查找不同类型的相关文档时,这尤其有用。创建一个 集成检索器 非常容易,它可以将多个检索器与线性加权分数组合起来
# Initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_store_retriever], weights=[0.5, 0.5]
)
当集成时,我们如何组合来自多个检索器的搜索结果?这激发了重新排序的概念,它接受多个检索器的输出,并使用更复杂的算法(例如 倒数排名融合 (RRF))将它们组合起来。
源文档保留
许多检索器利用某种索引来使文档易于搜索。索引过程可以包括转换步骤(例如,向量存储通常使用文档分割)。无论使用何种转换,保留转换后的文档和原始文档之间的链接都非常有用,从而使检索器能够返回原始文档。
这在 AI 应用程序中尤其有用,因为它确保模型不会丢失文档上下文。例如,您可以使用小块大小来索引向量存储中的文档。如果您仅返回块作为检索结果,则模型将丢失块的原始文档上下文。
LangChain 有两个不同的检索器可用于应对此挑战。多向量检索器允许用户使用任何文档转换(例如,使用 LLM 编写文档摘要)进行索引,同时保留与源文档的链接。父文档检索器链接来自文本分割器转换的文档块以进行索引,同时保留与源文档的链接。
名称 | 索引类型 | 使用 LLM | 何时使用 | 描述 |
---|---|---|---|---|
ParentDocument | 向量存储 + 文档存储 | 否 | 如果您的页面包含许多较小的、不同的信息片段,这些信息片段最好单独索引,但最好一起检索。 | 这涉及为每个文档索引多个块。然后,您找到在嵌入空间中最相似的块,但您检索整个父文档并返回它(而不是单个块)。 |
多向量 | 向量存储 + 文档存储 | 有时在索引期间 | 如果您能够从文档中提取您认为比文本本身更相关的索引信息。 | 这涉及为每个文档创建多个向量。可以以多种方式创建每个向量 - 示例包括文本摘要和假设性问题。 |