概述

使用 LangChain 嵌入模型 和 向量存储 在 PDF 文档上构建语义搜索引擎。用它来检索与查询相似的段落,然后将检索器接入 检索增强生成 (RAG) 或其他 LLM 工作流。 本教程涵盖:
  1. 从 PDF 创建 Document 对象。
  2. 生成嵌入向量。
  3. 加载和分割 PDF。
  4. 在向量存储中索引文档块并通过相似性进行查询。
  5. 将存储包装成检索器。
本指南还在搜索引擎的基础上包含了一个最小化的 RAG 实现。

核心概念

本教程专注于文本检索,涵盖以下概念:

设置

安装依赖

本教程使用 pypdf 包来读取 PDF:
更多详情,请参阅 安装指南。

配置 LangSmith

你使用 LangChain 构建的许多应用将包含多个步骤和多次 LLM 调用。 随着这些应用变得越来越复杂,能够检查链或智能体内部到底发生了什么就变得至关重要。 最佳方式是使用 LangSmith。 在上面的链接注册后,请确保设置你的环境变量以开始记录追踪轨迹:
在 notebook 中,你可以这样设置:

创建文档

LangChain 实现了一个 Document 抽象,用于表示一个文本单元及其关联的元数据。它有三个属性:
  • page_content: 表示内容的字符串。
  • metadata: 包含任意元数据的字典。
  • id: (可选)文档的字符串标识符。
metadata 可以捕获文档的来源、与其他文档的关系以及其他信息。一个单独的 Document 通常代表更大文档中的一个块。 以下代码创建了示例文档:

生成嵌入向量

向量搜索存储与文本关联的数值向量。将查询嵌入为相同维度的向量,然后使用相似性度量(如余弦相似度)来查找相关文本。 LangChain 支持来自 众多提供商 的嵌入模型。选择一个模型来指定如何将文本转换为数值向量:
接下来,将嵌入向量存储在支持高效相似性搜索的向量存储中。

选择向量存储

LangChain 的 VectorStore 对象可以将文本和 Document 对象添加到存储中,并使用相似性度量进行查询。它们通常使用 嵌入 模型进行初始化,该模型将文本转换为数值向量。 LangChain 包含与多种向量存储技术的 集成。有些是托管的,需要凭据,有些运行在独立的基础设施(本地或第三方),另一些则在内存中运行,适用于轻量级工作负载。选择一个向量存储:

加载和分割 PDF

从 PDF 加载内容,然后在索引前将其分割成更小的块。本示例使用 2023年 Nike 10-K 报告样本。
对于检索来说,一整页内容往往粒度太粗。进一步分割页面,这样相关的段落就不会被周围的文本稀释。RecursiveCharacterTextSplitter 在通用分隔符(如换行符)上递归分割,直到每个块达到目标大小。这是通用文本用例的推荐文本分割器。 设置 add_start_index=True,以便每个分割块都保留其在原始文档中字符偏移量的 start_index 元数据字段。

索引文档

将文档块索引到向量存储中:
大多数向量存储集成也支持连接到现有存储(例如通过客户端或索引名称)。详情请参阅特定 集成 的文档。

查询向量存储

在将文档添加到 VectorStore 后,你可以查询它:
  • 同步和异步方式
  • 通过字符串查询和通过向量查询
  • 带或不带相似性分数
  • 通过相似性或 最大边际相关性(以平衡相似性与多样性)
这些方法通常返回一个 Document 对象的列表。

按字符串搜索

嵌入模型将文本映射到密集向量,因此语义相似的文本在几何空间上也相近。这意味着你可以通过传递一个自然语言问题来检索相关段落:
异步查询:

返回分数

你可以同时返回文档及其相似性分数。分数的含义因提供商而异。在这个例子中,分数是一个距离度量,与相似性成反比:

按向量搜索

自行嵌入查询,然后使用得到的向量进行搜索:
了解更多:

使用检索器

LangChain 的 VectorStore 对象不是 Runnable 的子类。@[检索器] 是 Runnables,因此它们支持标准方法,如同步和异步的 invoke 和 batch。 你也可以从向量存储构建检索器,检索器也可以包装非向量来源(如外部 API)。 在这种情况下,可以通过包装 similarity_search 来创建一个简单的检索器,而无需子类化 Retriever:
向量存储实现了 as_retriever 方法,该方法返回一个 VectorStoreRetriever。这些检索器暴露 search_type 和 search_kwargs 来选择和参数化底层存储方法。使用以下方式复现上面的示例:
VectorStoreRetriever 支持搜索类型为 "similarity"(默认)、"mmr"(最大边际相关性)和 "similarity_score_threshold"。使用最后一个选项可以通过相似性分数过滤文档。 你可以在更复杂的应用中使用检索器,例如 检索增强生成 (RAG),它将问题与检索到的上下文结合到提示中,供 LLM 使用。要了解更多关于构建此类应用的信息,请查看 RAG 教程。

后续步骤

你现在已经了解了如何在 PDF 文档上构建语义搜索引擎。 更多信息请参阅: 关于 RAG 的更多信息: