扩展
信息检索系统对于措辞和特定关键词非常敏感。为了减轻这个问题,一种经典的检索技术是生成查询的多个释义版本,并返回所有版本的查询结果。这被称为 查询扩展。 LL 模型是生成查询的这些备选版本的强大工具。
让我们看看如何对我们的 Q&A 机器人在 LangChain YouTube 视频上进行查询扩展,我们在 快速入门 中开始了这个项目。
设置
安装依赖
# %pip install -qU langchain langchain-openai设置环境变量
我们将在此示例中使用 OpenAI:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# 可选的,取消注释以使用 LangSmith 跟踪运行。在此处注册: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 = """您是将用户问题转换为数据库查询的专家。\
您可以访问一个关于构建LLL应用程序的软件库的教程视频数据库。\
执行查询扩展。如果用户问题有多种常见措辞\
或问题中的关键词有常见的同义词,确保返回多个版本\
具有不同措辞的查询。
如果有您不熟悉的缩写或单词,请不要尝试重述它们。
返回至少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])
query_analyzer = prompt | llm_with_tools | PydanticToolsParser(tools=[ParaphrasedQuery])让我们看看我们的分析器为我们之前搜索的问题生成了哪些查询:
query_analyzer.invoke(
{
"question": "如何在链式结构中使用多模型并将链式结构转换为REST API"
}
)[ParaphrasedQuery(paraphrased_query ='如何按顺序使用多模型并将序列转换为 REST API'),
ParaphrasedQuery(paraphrased_query ='使用多模型的步骤,并将序列转换为 RESTful API'),
ParaphrasedQuery(paraphrased_query ='关于在链式结构中使用多模型并将链式结构转换为 RESTful API 的指南')]query_analyzer.invoke({"question": "从LLM代理中流式传输事件"})[ParaphrasedQuery(paraphrased_query ='如何从 LLM 代理中流式传输事件?'),
ParaphrasedQuery(paraphrased_query ='如何实时接收 LLM 代理的事件?'),
ParaphrasedQuery(paraphrased_query ='从 LLM 代理捕获事件的流程是什么?')]