核心模块(Modules)
数据连接(DataConnection)
检索器(Retrievers)
Index

检索器

检索器是一个接口,给定非结构化查询后返回文档。它比向量存储更通用。 检索器不需要能够存储文档,只需要返回(或检索)它们。向量存储可以用作 检索器的骨干,但也有其它类型的检索器。

检索器接受字符串 query 作为输入,并返回 Document 列表作为输出。

高级检索类型

表格各列含义:

  • Name:检索算法的名称。
  • Index Type:它依赖哪种索引类型(如果有)。
  • Uses an LLM:该检索方法是否使用 LLM。
  • When to Use:关于何时应考虑使用该检索方法的说明。
  • Description:该检索算法在做什么的描述。
NameIndex TypeUses an LLMWhen to UseDescription
向量存储Vectorstore否如果你刚开始上手,想找一个快速简单的方法。这是最简单的方法,也是最容易上手的方法。它为每段文本创建嵌入。
ParentDocumentVectorstore + Document Store否如果你的页面包含许多较小的独立信息片段,这些片段最好单独索引,但最好一起检索。它为每个文档索引多个块。然后你找到嵌入空间中最相似的块,但你检索整个父文档并返回它(而不是单个块)。
Multi VectorVectorstore + Document Store索引时有时使用如果你能从文档中提取出你认为比文本本身更值得索引的信息。它为每个文档创建多个向量。每个向量可以用无数种方式创建——例如文本摘要和假设性问题。
Self QueryVectorstore是如果用户提出的问题,通过基于元数据而非文本相似性来获取文档能更好地回答。它使用 LLM 把用户输入转换为两样东西:(1) 一个用于语义查找的字符串,(2) 一个与之搭配的元数据过滤器。这很有用,因为问题常常是关于文档的元数据(而非内容本身)。
Contextual Compression任意有时如果你发现检索到的文档包含太多无关信息,并分散了 LLM 的注意力。它在另一个检索器之上加入一个后处理步骤,只从检索到的文档中提取最相关的信息。这可以通过嵌入或 LLM 完成。
Time-Weighted VectorstoreVectorstore否如果你的文档有时间戳,并且你想检索最新的那些它基于语义相似性(如普通向量检索)和时近性(查看索引文档的时间戳)的组合来获取文档
Multi-Query Retriever任意是如果用户提出的问题很复杂,需要多个独立信息片段才能回答它使用 LLM 从原始查询生成多个查询。当原始查询需要关于多个主题的信息片段才能被正确回答时,这很有用。通过生成多个查询,我们可以为每个查询获取文档。
Ensemble任意否如果你有多种检索方法,并想尝试把它们结合起来。它从多个检索器获取文档,然后把它们组合起来。
Long-Context Reorder任意否如果你在使用长上下文模型,并注意到它没有关注检索文档中间的信息。它从底层检索器获取文档,然后重新排序,使最相似的靠近开头和结尾。这很有用,因为已有研究表明,对于较长的上下文模型,它们有时不会关注上下文窗口中间的信息。

第三方集成 (opens in a new tab)

LangChain 还集成了许多第三方检索服务。要查看完整列表,请查看这份所有集成的 列表 (opens in a new tab)。

在 LCEL 中使用检索器

由于检索器是 Runnable,我们可以轻松地将它们与其它 Runnable 对象组合起来:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
 
template = """Answer the question based only on the following context:
 
{context}
 
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
 
 
def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])
 
 
chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)
 
chain.invoke("What did the president say about technology?")
 

自定义检索器

要实现自定义检索器,请参阅 此处的文档。