用例(User Case)
查询分析(QueryAnalysis)
技术(Techniques)
扩展(Expansion)

扩展

信息检索系统对于措辞和特定关键词非常敏感。为了减轻这个问题,一种经典的检索技术是生成查询的多个释义版本,并返回所有版本的查询结果。这被称为查询扩展。 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代理捕获事件的流程是什么?')]