概述
本教程将让您熟悉 LangChain 的 文档加载器、嵌入 和 向量存储 抽象。这些抽象旨在支持从(向量)数据库和其他来源检索数据,以与 LLM 工作流集成。它们对于获取数据以作为模型推理的一部分进行推理的应用程序非常重要,例如检索增强生成或 RAG。 在这里,我们将基于 PDF 文档构建一个搜索引擎。这将允许我们检索 PDF 中与输入查询相似的段落。本指南还包括基于搜索引擎的最小 RAG 实现。概念
本指南侧重于文本数据的检索。我们将涵盖以下概念:设置
安装
本指南需要@langchain/community 和 pdf-parse:
LangSmith
您使用 LangChain 构建的许多应用程序将包含多个步骤,并多次调用 LLM。 随着这些应用程序变得越来越复杂,能够检查链或代理内部到底发生了什么变得至关重要。 最好的方法是使用 LangSmith。 在上面的链接注册后,请确保设置环境变量以开始记录跟踪:1. 文档和文档加载器
LangChain 实现了一个 Document 抽象,旨在表示文本单元及其关联的元数据。它有三个属性:pageContent:表示内容的字符串;metadata:包含任意元数据的字典;id:(可选)文档的字符串标识符。
metadata 属性可以捕获有关文档来源、与其他文档的关系以及其他信息的信息。请注意,单个 Document 对象通常表示较大文档的一部分。
如果需要,我们可以生成示例文档:
加载文档
让我们将 PDF 加载到Document 对象序列中。这是一个示例 PDF —— 2023 年耐克的 10-k 文件。我们可以查阅 LangChain 文档以了解 可用的 PDF 文档加载器。
PDFLoader 为每个 PDF 页面加载一个 Document 对象。对于每一个,我们可以轻松访问:
- 页面的字符串内容;
- 包含文件名和页码的元数据。
分割
对于信息检索和下游问答目的,页面可能是一个太粗略的表示。我们最终的目标是检索回答输入查询的Document 对象,进一步分割我们的 PDF 将有助于确保文档相关部分的含义不会被周围的文本“冲淡”。
我们可以为此目的使用 文本分割器。在这里,我们将使用一个基于字符进行分区的简单文本分割器。我们将把文档分成 1000 个字符的块,块之间有 200 个字符的重叠。重叠有助于减少将语句与其相关的重要上下文分离的可能性。我们使用 RecursiveCharacterTextSplitter,它将使用常见的分隔符(如换行符)递归地分割文档,直到每个块的大小合适。这是通用文本用例的推荐文本分割器。
2. 嵌入
向量搜索是存储和搜索非结构化数据(如非结构化文本)的一种常见方式。其思想是存储与文本关联的数值向量。给定一个查询,我们可以将其 嵌入 为相同维度的向量,并使用向量相似度度量(如余弦相似度)来识别相关文本。 LangChain 支持来自 数十个提供商 的嵌入。这些模型指定了如何将文本转换为数值向量。让我们选择一个模型:- OpenAI
- Azure
- AWS
- VertexAI
- MistralAI
- Cohere
3. 向量存储
LangChain VectorStore 对象包含添加文本和Document 对象到存储以及使用各种相似度度量查询它们的方法。它们通常使用 嵌入 模型进行初始化,该模型确定如何将文本数据转换为数值向量。
LangChain 包含一套与不同向量存储技术的 集成。有些向量存储由提供商托管(例如,各种云提供商),需要特定的凭据才能使用;有些(如 Postgres)在单独的基础设施中运行,可以在本地或通过第三方运行;其他的可以在内存中运行以进行轻量级工作负载。让我们选择一个向量存储:
- Memory
- Chroma
- FAISS
- MongoDB
- PGVector
- Pinecone
- Qdrant
- Redis
VectorStore,我们就可以查询它。VectorStore 包含查询方法:
- 同步和异步;
- 按字符串查询和按向量;
- 返回或不返回相似度分数;
- 按相似度和 最大边际相关性(以在检索结果中平衡相似度与查询的多样性)。
4. 检索器
LangChainVectorStore 对象不是 Runnable 的子类。LangChain Retrievers 是 Runnables,因此它们实现了一组标准方法(例如,同步和异步 invoke 和 batch 操作)。虽然我们可以从向量存储构造检索器,但检索器也可以与非向量存储数据源(如外部 API)交互。
向量存储实现了一个 as_retriever 方法,该方法将生成一个 Retriever,特别是 VectorStoreRetriever。这些检索器包括特定的 search_type 和 search_kwargs 属性,用于标识要调用的底层向量存储方法以及如何参数化它们。例如,我们可以使用以下代码复制上述内容:
后续步骤
您现在已经了解了如何基于 PDF 文档构建语义搜索引擎。 关于文档加载器的更多信息: 关于嵌入的更多信息: 关于向量存储的更多信息: 关于 RAG 的更多信息,请参阅:将这些文档连接 到 Claude、VSCode 等,通过 MCP 获取实时解答。

