高效信息检索新方法:LangChain中Retriever的多种高级策略

文摘   2024-11-23 10:01   福建  

在当今的信息时代,如何高效检索信息变得至关重要,尤其是在面对海量数据时。LangChain作为一个强大的工具集,通过不同类型的Retriever为用户提供高效的信息检索解决方案。本文将为大家介绍在LangChain中如何运用三种先进的Retriever策略,包括向量存储检索器(Vector Store Retriever)、多查询检索器(MultiQueryRetriever)、以及上下文压缩检索器(Contextual Compression Retriever)。无论是快速获取相关文档,还是针对特定上下文的精准信息提取,这些Retriever都能极大提升LLM(大型语言模型)的实用性和用户体验。

.01

向量存储检索器:高效检索的核心技术
向量存储检索器是一种通过向量表示来实现文档检索的技术,它能够将查询转换为向量,与文档库中的向量进行比对,从而找到最相关的内容。通过向量存储的方式,Retriever可以非常高效地从大量文档中找到符合查询条件的内容。
使用向量存储作为Retriever
在LangChain中,创建向量存储检索器非常简单,以下是具体步骤:
    • 数据加载:我们从CSV文件中加载客户评论,并进行文本分割。
    • 创建向量存储:使用向量化工具(如Pinecone)对文本进行向量化。
    • 创建Retriever:将向量存储配置为Retriever,可以进行相似度搜索或设置特定参数。
示例代码:
from langchain_community.document_loaders import CSVLoader
from langchain_community.vectorstores import Pinecone
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 加载数据
loader = CSVLoader("customer_reviews.csv")
documents = loader.load()

# 文本分割
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# 向量化
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(texts, embeddings)

# 配置Retriever
retriever = vectorstore.as_retriever()


使用此Retriever可以方便地执行查询,比如想要了解“用户对电池续航的评价”,代码如下:
docs = retriever.invoke("What do customers think about the battery life?")

通过设置不同的检索参数,比如相似度得分阈值或结果数量(top-k),可以进一步优化检索效果。

.03

多查询检索器:多视角的精准检索
多查询检索器(MultiQueryRetriever)是一种增强的向量数据库检索技术。通过自动化的提示调整,结合大型语言模型(LLM)生成多种视角的查询,可以覆盖不同的查询表达方式,从而获得更全面的检索结果。它适用于用户输入模糊或存在多种解读可能的情况。
构建多查询检索器的示例
以下代码展示了如何使用多查询检索器来检索“客户在智能手机上最看重的特性”:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI

# 创建查询
question = "What features do customers value in smartphones?"
llm = ChatOpenAI(temperature=0)

# 初始化MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(
    retriever=vectordb.as_retriever(), llm=llm
)
unique_docs = retriever_from_llm.invoke(question)


通过这种方法,多查询检索器生成了多个不同角度的查询,以增加检索的多样性和相关性。这一策略尤其适用于复杂或多意图的查询,确保返回结果更全面。
自定义查询提示
用户还可以为多查询检索器自定义查询提示,以更好地满足特定应用需求。例如,我们可以使用PromptTemplate创建自定义查询模板:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI

# 创建查询
question = "What features do customers value in smartphones?"
llm = ChatOpenAI(temperature=0)

# 初始化MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(
    retriever=vectordb.as_retriever(), llm=llm
)
unique_docs = retriever_from_llm.invoke(question)
通过这种方式,多查询检索器在满足用户的查询需求的同时,还能根据不同的需求进行自定义调整。

.04

上下文压缩检索器:优化信息的精确提取
在大型文档中检索有用信息时,常常会遇到冗长且不相关的信息。上下文压缩检索器(Contextual Compression Retriever)能够通过上下文压缩技术,将检索结果优化为用户真正需要的内容,从而避免浪费资源。
上下文压缩的工作原理
上下文压缩检索器结合了基础检索器和文档压缩器,通过提取与查询相关的内容来压缩检索结果。具体步骤如下:
    • 基础检索:先使用基础的向量存储检索器进行初步查询。
    • 压缩检索:结合大型语言模型进一步提取与查询最相关的信息,过滤掉无关部分。
以下是一个使用上下文压缩检索器的示例:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAI

# 初始化LLM和压缩器
llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)

# 配置上下文压缩检索器
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke("What actions are being proposed to combat climate change?")

通过上下文压缩检索器,返回的内容更加精确且切中要害。这一技术尤其适用于需要精准回答的场景,如政策分析或新闻报道。

.05

自定义检索器:打造个性化的检索工具
LangChain中还提供了灵活的接口,允许用户根据自己的需求创建自定义检索器。通过扩展BaseRetriever类并实现核心方法,用户可以定制符合自身应用场景的检索逻辑。以下是一个简单的示例,展示如何实现自定义检索器:
from typing import List
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever

class CustomRetriever(BaseRetriever):
    """一个简单的检索器,根据查询返回包含关键字的文档。"""

    documents: List[Document]
    k: int

    def _get_relevant_documents(self, query: str) -> List[Document]:
        matching_documents = [doc for doc in self.documents if query.lower() in doc.page_content.lower()]
        return matching_documents[:self.k]

# 示例
documents = [
    Document("Dogs are great companions.", {"type""dog"}),
    Document("Cats are independent pets.", {"type""cat"}),
]
retriever = CustomRetriever(documents=documents, k=1)
result = retriever.invoke("dog")
print(result[0].page_content)  # Output: "Dogs are great companions."

这种自定义检索器可以应用于特定场景,比如公司内部资料或特定主题的文档搜索,满足多样化的应用需求。

.06

结论:灵活高效的信息检索
在LangChain框架中,Retriever是实现高效信息检索的核心组件。通过学习和运用不同的Retriever类型——向量存储检索器、多查询检索器和上下文压缩检索器,开发者可以根据不同的应用场景选择合适的工具,优化信息检索的准确性和效率。此外,LangChain还提供了灵活的自定义功能,使得开发者能够基于特定需求构建个性化的检索器。
掌握这些Retriever策略,可以帮助开发者在LLM应用中更好地管理大数据集,提升用户体验,实现高效的知识访问和信息提取。无论是在客户服务、教育还是金融等领域,这些技术都能为复杂应用场景提供便捷、高效的信息解决方案。
 

参考:

  1. https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/





Halo咯咯
专注于技术知识整理,包含人工智能、大模型、机器学习、深度学习、大数据等多个领域的技术知识,以及各种开源的内容~
 最新文章