一架梯子,一头程序猿,仰望星空!
LangChain查询分析 > 内容正文

扩展用户输入问题


扩展用户输入问题

RAG应用中,使用向量进行文本相似度搜索,查询跟问题相关的文档,向量搜索对措辞和特定关键词可能非常敏感, 有时候用户说不清楚自己的问题,基于RAG的AI应用,通过用户问题去搜索相似的资料,也找不到准确的资料,进而回答的问题质量也不准确。为了减轻这一问题,本章节提供的思路是先通过LLM的语义理解能力,生成多个跟用户问题相关的多个释义版本的问题,然后通过多个释义版本的问题去向量数据库搜索相似的文档,进而交给LLM回答用户问题。这思路就是所谓的扩展查询

下面给出生成扩展查询的例子。

设置

安装依赖项

# %pip install -qU langchain langchain-openai

设置环境变量

在这个示例中,我们将使用 OpenAI:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

# Optional, uncomment to trace runs with LangSmith. Sign up here: https://smith.langchain.com.
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

扩展查询

为了确保我们获得多个释义版本的问题,这里将使用 OpenAI 的函数调用 API。

from langchain_core.pydantic_v1 import BaseModel, Field

# 扩展查询数据结构
class ParaphrasedQuery(BaseModel):
    """你可以执行查询扩展,用于生成原始问题的释义版本。"""

    paraphrased_query: str = Field(
        ...,
        description="原始问题的独特释义版本。",
    )
from langchain.output_parsers import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system = """您是将用户问题转换为数据库查询的专家。您可以访问一个关于构建基于 LLM 应用程序的视频教程数据库。

执行查询扩展。如果有多种常用措辞或者问题关键词的常用同义词,确保返回查询的多个版本以及不同的表达方式。

如果有缩写词或您不熟悉的词语,请不要尝试改述它们。

返回至少 3 个问题版本。"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
# 定义模型
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
# 绑定模型可以调用的工具
llm_with_tools = llm.bind_tools([ParaphrasedQuery])
# 定义chain
query_analyzer = prompt | llm_with_tools | PydanticToolsParser(tools=[ParaphrasedQuery])

让我们看看我们的分析器对我们之前搜索的问题生成了哪些查询:

query_analyzer.invoke(
    {
        "question": "如何在链中使用多模态模型并将链变成rest API"
    }
)

下面是llm生成的多个版本的问题

[ParaphrasedQuery(paraphrased_query='如何在链中使用多模态模型,并将链转换为 REST API'),
 ParaphrasedQuery(paraphrased_query='使用多模态模型在链中进行序列化并将序列转换为 REST API 的步骤'),
 ParaphrasedQuery(paraphrased_query='在链中使用多模态模型并将链转换为 REST API 的指南')]
query_analyzer.invoke({"question": "来自LLM代理的流事件"})
[ParaphrasedQuery(paraphrased_query='如何从 LLM 代理中流式传输事件?'),
 ParaphrasedQuery(paraphrased_query='我如何实时接收来自 LLM 代理的事件?'),
 ParaphrasedQuery(paraphrased_query='从 LLM 代理中捕获事件的过程是什么?')


关联主题