如何在查询未生成时优化信息检索链

137 阅读3分钟

在开发AI驱动的信息检索系统时,我们经常会遇到这样的场景:根据用户的输入,可能会生成多个查询,有时甚至一个查询也生成不了。在这种情况下,我们需要巧妙地检查查询分析的结果,再决定是否调用检索器。本文将通过一个具体的例子,展示如何应对这种挑战。

引言

在信息检索领域,尤其是在使用自然语言处理技术进行查询分析时,可能会出现不生成查询的情况。如何高效地处理这种情况是提升系统鲁棒性的重要内容。本文将演示如何利用LangChain库来分析和处理未生成查询的场景。

主要内容

1. 环境设置

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

# %pip install -qU langchain langchain-community langchain-openai langchain-chroma

接下来,设置环境变量以使用OpenAI的API:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API Key: ")

2. 创建索引

我们将通过LangChain创建一个基于虚拟数据的向量存储:

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_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

class Search(BaseModel):
    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

4. 核心功能实现

通过以下方式调用查询分析器,有时会返回工具调用,有时直接响应正常信息:

query_analyzer.invoke("where did Harrison Work")
# 使用API代理服务提高访问稳定性

query_analyzer.invoke("hi!")
# 使用API代理服务提高访问稳定性

代码示例

以下示例展示了如何将查询分析添加到信息检索链中:

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访问受限:对于API访问受限的地区,建议通过API代理服务,确保服务的稳定性。

总结和进一步学习资源

本文通过LangChain库展示了处理未生成查询的实际应用。对于进一步学习,建议查看LangChain的官方文档以及OpenAI的API参考

参考资料

  1. LangChain GitHub
  2. OpenAI API Reference

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

---END---