如何处理查询分析中没有生成查询的情况

84 阅读3分钟
# 如何处理查询分析中没有生成查询的情况

在处理自然语言查询时,尤其是使用大语言模型 (LLM) 的查询分析技术时,可能会遇到生成任何数量的查询的情况,包括不生成查询。在这些情况下,我们需要在调用检索器之前检查查询分析的结果,决定是否执行搜索。

这篇文章将带您了解如何处理没有生成查询的情况,并提供一个完整的代码示例。

## 主要内容

### 1. 环境设置

首先,我们需要安装必要的依赖包和设置环境变量。我们将在这篇文章中使用OpenAI的API进行处理。

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

# 设置环境变量
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()

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
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

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

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

4. 代码示例

以下是包含查询分析功能的完整代码示例。

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)
        # 可以在此添加更多逻辑,比如另一个LLM调用
        return docs
    else:
        return response

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

在这里,如果没有查询生成,系统会返回一个普通的响应而不是调用检索器。

5. 常见问题和解决方案

  • 问题1:没有查询但仍需要信息
    解决方案:调整系统提示增加查询条件,确保满足条件时生成搜索查询。

  • 问题2:查询生成但不需要搜索
    解决方案:在工具调用条件中过滤不必要的查询,优化结果。

6. 总结和进一步学习资源

通过这种方法,我们可以通过查询分析技术来智能控制何时执行搜索查询,从而提高系统整体效率。

参考资料

  • OpenAI 官方文档
  • LangChain 项目资源

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

---END---