概览
本教程会帮助你熟悉 LangChain 的 embedding 和 vector store 抽象。这些抽象用于支持从(向量)数据库和其他来源检索数据,并将其集成到 LLM 工作流中。对于需要获取数据并将其作为模型推理一部分的应用,它们非常重要,例如 retrieval-augmented generation 或 RAG。 这里将基于 PDF 文档构建一个搜索引擎。这样可以检索 PDF 中与输入查询相似的段落。本指南还包含一个基于该搜索引擎的最小 RAG 实现。概念
本指南聚焦文本数据检索。将介绍以下概念:设置
安装
本教程使用pypdf 包读取 PDF:
LangSmith
你用 LangChain 构建的许多应用会包含多个步骤,并多次调用 LLM。 随着这些应用越来越复杂,能够检查链或代理内部究竟发生了什么会变得至关重要。 最好的方式是使用 LangSmith。 在上方链接注册后,请设置环境变量以开始记录 traces:1. 文档
LangChain 实现了 Document 抽象,用于表示一个文本单元及其关联 metadata。它有三个属性:page_content:表示内容的字符串;metadata:包含任意 metadata 的 dict;id:(可选)文档的字符串标识符。
metadata 属性可以捕获文档来源、与其他文档的关系以及其他信息。请注意,单个 Document 对象通常表示较大文档的一个 chunk。
需要时,可以生成示例文档:
2. Embeddings
向量搜索是一种存储和搜索非结构化数据(例如非结构化文本)的常见方式。其思想是存储与文本关联的数字向量。给定查询后,可以将其 embed 为相同维度的向量,并使用向量相似度指标(例如余弦相似度)识别相关文本。 LangChain 支持来自数十个 providers 的 embeddings。这些模型指定如何将文本转换为数字向量。选择一个模型:- OpenAI
- Azure
- Google Gemini
- Google Vertex
- AWS
- HuggingFace
- Ollama
- Cohere
- MistralAI
- Nomic
- NVIDIA
- Voyage AI
- IBM watsonx
- Fake
- Isaacus
3. Vector stores
LangChain VectorStore 对象包含用于向 store 添加文本和Document 对象的方法,以及使用各种相似度指标查询它们的方法。它们通常使用 embedding 模型初始化,这些模型决定文本数据如何转换为数字向量。
LangChain 包含一组面向不同 vector store 技术的 integrations。有些 vector stores 由 provider 托管,使用时需要特定凭证;有些运行在单独基础设施中,可以本地运行或通过第三方运行;还有一些可以在内存中运行,适合轻量工作负载。选择一个 vector store:
- In-memory
- Amazon OpenSearch
- AstraDB
- Chroma
- Milvus
- MongoDB
- PGVector
- PGVectorStore
- Pinecone
- Qdrant
为 vector store 填充数据
用 PDF 内容填充 store。这里有一个示例 PDF,它是 Nike 2023 年的 10-K 文件。将使用一个小型 helper 直接读取 PDF,并在索引前将其拆分为更小的 chunks。RecursiveCharacterTextSplitter,它会使用换行等常见分隔符递归拆分文档,直到每个 chunk 达到合适大小。这是通用文本用例推荐的 text splitter。
设置 add_start_index=True,以便将每个拆分 Document 在初始 Document 中开始处的字符索引保留为 metadata 属性 start_index。
VectorStore 后,就可以查询它。VectorStore 包含以下查询方法:
- 同步和异步查询;
- 按字符串查询和按向量查询;
- 返回或不返回相似度分数;
- 按相似度和 maximum marginal relevance 查询(在与查询的相似度和检索结果多样性之间取得平衡)。
4. Retrievers
LangChainVectorStore 对象不是 Runnable 的子类。LangChain Retrievers 是 Runnables,因此它们实现了一组标准方法(例如同步和异步 invoke 与 batch 操作)。虽然可以从 vector stores 构造 retrievers,但 retrievers 也可以与非 vector store 数据来源对接(例如外部 API)。
可以自己创建一个简单版本,而不需要继承 Retriever。如果选择希望用于检索文档的方法,就可以轻松创建一个 runnable。下面围绕 similarity_search 方法构建一个:
as_retriever 方法,会生成一个 Retriever,具体来说是 VectorStoreRetriever。这些 retrievers 包含特定的 search_type 和 search_kwargs 属性,用于标识应调用底层 vector store 的哪些方法,以及如何参数化它们。例如,可以用下面的方式复现上面的行为:
VectorStoreRetriever 支持 "similarity"(默认)、"mmr"(maximum marginal relevance,上文已描述)和 "similarity_score_threshold" 搜索类型。可以使用后者根据相似度分数对 retriever 输出的文档设置阈值。
Retrievers 可以轻松并入更复杂的应用,例如 retrieval-augmented generation (RAG) 应用,它们会将给定问题与检索到的上下文组合成 LLM prompt。要进一步了解如何构建这类应用,请查看 RAG tutorial。
下一步
现在你已经了解如何基于 PDF 文档构建语义搜索引擎。 更多 embeddings 相关内容: 更多 vector stores 相关内容: 更多 RAG 相关内容:Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

