# 引言
在数据分析和信息检索领域中,复杂的查询需求常常会导致生成多个查询。这种情况下,我们需要能够有效地运行所有查询并合并结果。本文将通过一组简单的示例(使用模拟数据)演示如何高效地进行这种操作。
# 主要内容
## 设置环境
首先,我们需要安装必要的依赖项,并设置环境变量以使用OpenAI的服务:
```bash
# 安装依赖
%pip install -qU langchain langchain-community langchain-openai langchain-chroma
import getpass
import os
# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass()
创建索引
接下来,我们将创建一个向量存储,用于存储我们要检索的虚假信息。
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})
查询分析
我们使用函数调用来结构化输出,并让它返回多个查询。
from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field
class Search(BaseModel):
"""在职位记录数据库中进行搜索。"""
queries: List[str] = Field(..., description="要搜索的不同查询")
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
output_parser = PydanticToolsParser(tools=[Search])
system = """您可以发出搜索查询以帮助获取用户信息。
如果需要查找两种不同的信息,可以这样做!"""
prompt = ChatPromptTemplate.from_messages([("system", 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) # 使用API代理服务提高访问稳定性
docs.extend(new_docs)
return docs
# 测试代码
await custom_chain.ainvoke("where did Harrison Work")
await custom_chain.ainvoke("where did Harrison and ankush Work")
常见问题和解决方案
- 查询响应时间长: 使用异步调用和API代理服务可以显著降低网络延迟。
- 结果去重: 合并结果集时,考虑对文档进行重新排序或去重。
总结和进一步学习资源
在这篇文章中,我们探讨了如何有效处理多重查询,并通过代码示例阐述了具体实现过程。关于更多的信息检索优化技术,推荐阅读相关文献和教程。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---