扩展用户输入问题
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 代理中捕获事件的过程是什么?')