高效处理多重查询:实现并发查询分析的简单方法
引言
在现代数据分析中,查询分析技术有时可能会产生多个查询。为了获取完整的结果,我们需要运行所有查询并合并返回的数据。本篇文章将通过一个简单的示例,展示如何在查询分析中有效地处理多重查询。
主要内容
1. 环境设置与依赖安装
首先,确保安装必要的Python库:
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma
接下来,设置环境变量,以便使用OpenAI的服务:
import os
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 如果需要使用LangSmith进行追踪,请设置下面的环境变量
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
2. 创建向量存储索引
接下来,我们将创建一个索引以用于查询检索:
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})
3. 查询分析的实现
使用函数调用来结构化输出,并允许其返回多个查询:
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="Distinct queries to search for",
)
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
4. 并发执行查询检索
使用异步调用来提高查询检索的效率:
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")
# 输出: [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 文档及示例代码
- OpenAI API 使用指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---