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