概述
本教程将让您熟悉 LangChain 的文档加载器、嵌入和向量存储抽象。这些抽象旨在支持从(向量)数据库和其他来源检索数据——以便与 LLM 工作流集成。对于在模型推理过程中获取数据以进行推理的应用程序来说,它们很重要,如检索增强生成或 RAG 的情况。 在这里,我们将构建一个基于 PDF 文档的搜索引擎。这将允许我们检索与输入查询相似的 PDF 中的段落。本指南还包括在搜索引擎之上的最小 RAG 实现。概念
本指南专注于文本数据的检索。我们将涵盖以下概念:设置
安装
本教程需要langchain-community 和 pypdf 包:
LangSmith
您使用 LangChain 构建的许多应用程序都包含多个步骤和多次 LLM 调用。随着这些应用程序变得越来越复杂,能够检查链或代理内部发生的事情变得至关重要。做到这一点的最佳方法是使用 LangSmith。 在上述链接注册后,确保设置您的环境变量以开始记录追踪:1. 文档和文档加载器
LangChain 实现了文档抽象,旨在表示一个文本单元和关联的元数据。它有三个属性:page_content:表示内容的字符串;metadata:包含任意元数据的字典;id:(可选)文档的字符串标识符。
metadata 属性可以捕获有关文档来源、与其他文档的关系以及其他信息。请注意,单独的文档对象通常代表较大文档的一个块。
我们可以在需要时生成示例文档:
加载文档
让我们将 PDF 加载到一系列文档对象中。这是示例 PDF——Nike 2023 年的 10-K 报告。我们可以查阅 LangChain 文档了解可用的 PDF 文档加载器。
PyPDFLoader 为每个 PDF 页面加载一个文档对象。对于每个,我们可以轻松访问:
- 页面的字符串内容;
- 包含文件名和页码的元数据。
分割
对于信息检索和下游问答目的,页面可能太粗糙而无法表示。我们的最终目标将是检索回答输入查询的文档对象,进一步分割我们的 PDF 将有助于确保文档相关部分的含义不会被周围文本”冲淡”。
我们可以使用文本分割器来实现此目的。在这里,我们将使用基于字符的简单文本分割器。我们将把文档分割成 1000 个字符的块,块之间有 200 个字符的重叠。重叠有助于减轻将陈述与其相关的重要上下文分离的可能性。我们使用 RecursiveCharacterTextSplitter,它将递归地使用常见分隔符(如新行)分割文档,直到每个块达到合适的大小。这是用于通用文本用例的推荐文本分割器。
我们设置 add_start_index=True,以便每个分割文档在初始文档中开始的字符索引被保留为元数据属性”start_index”。
2. 嵌入
向量搜索是存储和搜索非结构化数据(如非结构化文本)的常用方式。其思想是存储与文本关联的数值向量。给定查询,我们可以嵌入它为相同维度的向量,并使用向量相似性度量(如余弦相似性)来识别相关文本。 LangChain 支持来自数十个提供商的嵌入。这些模型指定了如何将文本转换为数值向量。让我们选择一个模型:- OpenAI
- Azure
- Google Gemini
- Google Vertex
- AWS
- HuggingFace
- Ollama
- Cohere
- MistralAI
- Nomic
- NVIDIA
- Voyage AI
- IBM watsonx
- Fake
- Isaacus
3. 向量存储
LangChain VectorStore 对象包含用于向存储添加文本和文档对象的方法,以及使用各种相似性度量查询它们的方法。它们通常使用嵌入模型初始化,这些模型决定如何将文本数据转换为数值向量。
LangChain 包含与不同向量存储技术的一系列集成。一些向量存储由提供商托管(例如各种云提供商),需要特定凭证才能使用;一些(如 Postgres)在可以本地运行或通过第三方运行的单独基础设施中运行;其他可以在内存中运行以处理轻量级工作负载。让我们选择一个向量存储:
- In-memory
- Amazon OpenSearch
- AstraDB
- Chroma
- FAISS
- Milvus
- MongoDB
- PGVector
- PGVectorStore
- Pinecone
- Qdrant
向量存储,我们就可以查询它。向量存储包括用于查询的方法:
- 同步和异步;
- 通过字符串查询和通过向量;
- 带和不带返回相似性分数;
- 通过相似性和最大边际相关性(以平衡检索结果中与查询的相似性和多样性)。
4. 检索器
虽然向量存储是存储和搜索文档的核心,但 LangChain 定义了检索器接口,您可以使用它来封装从向量存储检索的逻辑。
LangChain 的向量存储集成自动为您创建一个检索器。
使用检索器
检索器可以用作链或代理的一部分:5. 最小 RAG 实现
现在我们有了用于索引和检索文档的基础设施,让我们实现一个简单的 RAG(检索增强生成)系统。设置
我们需要加载一个 LLM:创建检索增强链
使用链
Retriever。如果我们选择想要用来检索文档的方法,可以轻松地创建一个可运行对象。下面我们将围绕 similarity_search 方法构建一个:
as_retriever 方法,可以生成一个检索器,具体是 VectorStoreRetriever。这些检索器包含特定的 search_type 和 search_kwargs 属性,用于标识要调用的底层向量存储方法以及如何对其进行参数化。例如,我们可以使用以下方法复制上述结果:
VectorStoreRetriever 支持 "similarity"(默认)、"mmr"(最大边际相关性,如上所述)和 "similarity_score_threshold" 搜索类型。我们可以使用后者通过相似度分数对检索器输出的文档进行阈值过滤。
检索器可以轻松集成到更复杂的应用程序中,例如将给定问题与检索到的上下文结合到 LLM 提示中的检索增强生成 (RAG) 应用程序。要了解有关构建此类应用程序的更多信息,请查看 RAG 教程。

