Lazy loaded image
🧑‍💼建立一个将自然语言的问题转换成结构化对象并查询的RAG应用| 🦜️🔗 LangChain
Words 1600Read Time 5 min
2024-12-31
2024-12-31
type
status
date
slug
summary
tags
category
icon
password
comment
Status
本文将展示如何在一个基本的端到端示例中使用查询分析。这包括创建一个简单的搜索引擎,在原始用户问题传递给该搜索引擎时调用失败的情况,然后实现一个查询分析如何帮助解决该问题的示例。
我们将在LangChain YouTube视频上进行检索。

配置

安装依赖

设置环境变量

加载文本

我们可以使用 YouTubeLoader 加载一些 YouTube 上 LangChain 视频的字幕:
API 调用:YoutubeLoader
以下是我们已加载的视频的标题:
这是与每个视频关联的元数据。我们可以看到,每个文档还具有标题、观看次数、发布日期和长度:
下面是某个文档内容的样本:

文本索引

每当我们执行检索时,我们需要创建一个文档索引,以便我们可以查询。我们将使用向量存储来索引我们的文档,并首先将它们分块,使我们的检索更加简洁和精确:

Retrieval 检索器

我们可以直接在用户问题上执行相似性搜索,以找到与问题相关的片段:
这个方法效果相当不错!我们的第一个结果与问题非常相关。
如果我们想要搜索特定时间段的结果怎么办?
我们的第一个结果是来自2024年的(尽管我们要求的是2023年的视频),并且与输入内容不太相关。由于我们只是针对文档内容进行搜索,所以结果无法根据任何文档属性进行过滤。
这只是可能出现的失败情况中的一种。现在,让我们看看基本的查询分析如何能够解决这个问题!

查询分析

我们可以使用查询分析来改善检索结果。这需要定义一个包含日期过滤器的查询结构,并使用函数调用模型将用户问题转换为结构化查询。

Query schema

在这种情况下,我们将有明确的最小和最大属性用于过滤发布日期。

查询生成

为了将用户问题转换为结构化查询,可以使用 OpenAI 工具调用的API。使用新的ChatModel.with_structured_output()构造函数来处理将结构传递给模型并解析输出。
让我们看看分析器为我们之前搜索的问题生成了哪些查询:

使用查询分析的检索

现在让我们尝试使用生成的查询执行实际的检索。
注意:在我们的示例中,我们指定了 tool_choice="Search"。这将强制LLM调用一个(且仅有一个)工具,这意味着我们总是有一个优化后的查询来进行查找。请注意,情况并非总是如此——请参阅其他指南,了解在没有或返回多个优化查询时如何处理。
API 调用:Document
现在我们再问一下之前的问题,并看到它只输出了那一年的结果!
 
官网链接:
 
 
上一篇
构建一个基于SQL数据的问答系统 | 🦜️🔗 LangChain
下一篇
构建一个基于PDF的问答系统 | 🦜️🔗 LangChain