跳转到主要内容

category

注意:这篇文章假设你对LangChain有一定的熟悉程度,并且是适度的技术性文章。

💡 TL;DR:我们引入了新的抽象和新的文档检索器,以便于对检索到的文档进行后处理。具体来说,新的抽象使得获取一组检索到的文档并仅从中提取与给定查询相关的信息变得容易。

介绍

许多LLM支持的应用程序需要一些可查询的文档存储,以便检索尚未烘焙到LLM中的特定于应用程序的信息。

假设你想创建一个聊天机器人,可以回答有关你个人笔记的问题。一种简单的方法是将笔记嵌入大小相等的块中,并将嵌入的内容存储在向量存储中。当你问系统一个问题时,它会嵌入你的问题,在向量存储中执行相似性搜索,检索最相关的文档(文本块),并将它们附加到LLM提示中。

langchain

A simple retrieval Q&A system

问题

这种方法的一个问题是,当您将数据摄取到文档存储系统中时,您通常不知道将使用哪些特定查询来检索这些文档。在我们的笔记问答示例中,我们简单地将文本划分为大小相等的块。这意味着,当我们得到一个特定的用户问题并检索一个文档时,即使文档有一些相关的文本,它也可能有一些不相关的文本。

在LLM提示中插入不相关的信息是错误的,因为:

  • 这可能会分散LLM对相关信息的注意力
  • 它占用了宝贵的空间,可以用来插入其他相关信息。

解决方案

为了帮助实现这一点,我们引入了DocumentCompressor抽象,它允许您在检索到的文档上运行compress_documents(documents:List[Document],query:str)。这个想法很简单:我们可以使用给定查询的上下文对它们进行压缩,从而只返回相关信息,而不是按原样立即返回检索到的文档。这里的“压缩”是指压缩单个文档的内容和大规模过滤掉文档。

langchain

Retrieval Q&A system with contextual document compression

压缩器的目标是使仅将相关信息传递给LLM变得容易。通过这样做,它还使您能够将更多信息传递给LLM,因为在最初的检索步骤中,您可以专注于召回(例如,通过增加返回的文档数量),并让压缩器处理精度。

特征

我们在LangChain Python包中实现了几个新功能:

  • 一套文档压缩器,您可以开箱即用。
  • ContextualCompressionRetriever将另一个Retriever与DocumentCompressor一起打包,并自动压缩基本Retriever的检索文档。

一些文档压缩器示例:

  • LLMChainExtractor使用LLMChain仅从每个文档中提取与查询相关的语句。
  • EmbeddingsFilter嵌入检索到的文档和查询,并筛选出嵌入与嵌入查询不太相似的任何文档。这个压缩器本身的功能与大多数VectorStore检索器非常相似,但它作为…
  • …DocumentCompressorPipeline,它可以轻松地创建转换和压缩器的管道并按顺序运行它们。一个简单的例子是,您可能需要将TextSplitter和EmbeddingsFilter组合在一起,首先将文档分解成更小的部分,然后筛选出不再相关的拆分文档。

您可以在任何现有的Retriever(无论是基于VectorStore还是其他)上尝试这些方法,比如:

from langchain.llms import OpenAI
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

# base_retriever defined somewhere above...

compressor = LLMChainExtractor.from_llm(OpenAI(temperature=0))
compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)
contextual_retriever.get_relevant_documents("insert query here")

前往笔记本这里获取一些示例

文章链接