# 如何有效处理多重查询:从分析到结果合并的完整指南
在数据查询中,有时可能需要生成多个查询来获取完整的信息。在这篇文章中,我们将展示如何在多重查询分析中运行所有查询并合并结果。我们将使用模拟数据来演示这个过程。
## 引言
在进行复杂的数据查询时,可能需要生成多个查询以涵盖所有信息需求。这篇文章旨在展示如何使用Python及Langchain库执行多重查询分析,并有效合并结果。我们将详细介绍库的使用方法,并通过代码示例进行讲解。
## 主要内容
### 环境设置与依赖安装
首先,我们需要安装必要的依赖。
```bash
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
设置环境变量
在这个例子中,我们使用OpenAI的API:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 使用API代理服务提高访问稳定性
创建索引
我们将创建一个基于模拟数据的向量存储。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
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, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Search(BaseModel):
"""Search over a database of job records."""
queries: List[str] = Field(
...,
description="Distinct queries to search for",
)
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
output_parser = PydanticToolsParser(tools=[Search])
system = """You have the ability to issue search queries to get information to help answer user information.
If you need to look up two distinct pieces of information, you are allowed to do that!"""
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)
docs.extend(new_docs)
return docs
# 测试
await custom_chain.ainvoke("where did Harrison Work")
# [Document(page_content='Harrison worked at Kensho')]
await custom_chain.ainvoke("where did Harrison and ankush Work")
# [Document(page_content='Harrison worked at Kensho'), Document(page_content='Ankush worked at Facebook')]
常见问题和解决方案
-
如何处理重复或排名问题?
在合并结果时,可以考虑重新排序或去重,具体实现可以根据具体需求进行调整。 -
API访问限制如何处理?
由于某些地区的网络限制,开发者可以使用API代理服务提高访问的稳定性。
总结和进一步学习资源
处理多重查询是一个复杂但非常实用的技术。在继续深入学习之前,建议阅读以下资源:
参考资料
- Langchain GitHub 代码库
- OpenAI API 说明文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---