概述
使用 LangChain 嵌入模型 和 向量存储 在 PDF 文档上构建语义搜索引擎。用它来检索与查询相似的段落,然后将检索器接入 检索增强生成 (RAG) 或其他 LLM 工作流。 本教程涵盖:- 从 PDF 创建
Document对象。 - 生成嵌入向量。
- 加载和分割 PDF。
- 在向量存储中索引文档块并通过相似性进行查询。
- 将存储包装成检索器。
核心概念
本教程专注于文本检索,涵盖以下概念:设置
安装依赖
本教程使用pdf-parse 包来读取 PDF:
配置 LangSmith
你使用 LangChain 构建的许多应用将包含多个步骤和多次 LLM 调用。 随着这些应用变得越来越复杂,能够检查链或智能体内部到底发生了什么就变得至关重要。 最佳方式是使用 LangSmith。 在上面的链接注册后,请确保设置你的环境变量以开始记录追踪轨迹:创建文档
LangChain 实现了一个Document 抽象,用于表示一个文本单元及其关联的元数据。它有三个属性:
pageContent: 表示内容的字符串。metadata: 包含任意元数据的字典。id: (可选)文档的字符串标识符。
metadata 可以捕获文档的来源、与其他文档的关系以及其他信息。一个单独的 Document 通常代表更大文档中的一个块。
以下代码创建了示例文档:
生成嵌入向量
向量搜索存储与文本关联的数值向量。将查询嵌入为相同维度的向量,然后使用相似性度量(如余弦相似度)来查找相关文本。 LangChain 支持来自 众多提供商 的嵌入模型。选择一个模型来指定如何将文本转换为数值向量:- OpenAI
- Azure
- AWS
- VertexAI
- MistralAI
- Cohere
选择向量存储
LangChain 的VectorStore 对象可以将文本和 Document 对象添加到存储中,并使用相似性度量进行查询。它们通常使用 嵌入 模型进行初始化,该模型将文本转换为数值向量。
LangChain 包含与多种向量存储技术的 集成。有些是托管的,需要凭据,有些运行在独立的基础设施(本地或第三方),另一些则在内存中运行,适用于轻量级工作负载。选择一个向量存储:
- Memory
- MongoDB
- Pinecone
- Qdrant
- Redis
加载和分割 PDF
从 PDF 加载内容,然后在索引前将其分割成更小的块。本示例使用 2023年 Nike 10-K 报告样本。RecursiveCharacterTextSplitter 在通用分隔符(如换行符)上递归分割,直到每个块达到目标大小。这是通用文本用例的推荐文本分割器。
索引文档
将文档块索引到向量存储中:查询向量存储
在将文档添加到VectorStore 后,你可以查询它:
- 同步和异步方式
- 通过字符串查询和通过向量查询
- 带或不带相似性分数
- 通过相似性或 最大边际相关性(以平衡相似性与多样性)
Document 对象的列表。
按字符串搜索
嵌入模型将文本映射到密集向量,因此语义相似的文本在几何空间上也相近。这意味着你可以通过传递一个自然语言问题来检索相关段落:返回分数
你可以同时返回文档及其相似性分数。分数的含义因提供商而异。在这个例子中,分数是一个距离度量,与相似性成反比:按向量搜索
自行嵌入查询,然后使用得到的向量进行搜索:使用检索器
LangChain 的VectorStore 对象不是 Runnable 的子类。@[检索器] 是 Runnables,因此它们支持标准方法,如同步和异步的 invoke 和 batch。
你也可以从向量存储构建检索器,检索器也可以包装非向量来源(如外部 API)。
向量存储实现了 as_retriever 方法,该方法返回一个 VectorStoreRetriever。这些检索器暴露 search_type 和 search_kwargs 来选择和参数化底层存储方法。使用以下方式复现上面的示例:
后续步骤
你现在已经了解了如何在 PDF 文档上构建语义搜索引擎。 更多信息请参阅: 关于 RAG 的更多信息:Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

