LangChain之核心组件(文档加载器Document loaders)
5. 文档加载器Document loaders5.1 RAG 介绍5.1.1 RAG 概念我们将重点放在 RAG 阶段Retrieval-Augmented Generation检索增强生成。这是当前大语言模型应用的核心模式。RAG 的流程相对复杂为了更好的理解 RAG我们先用 AI 搜索来引出 RAG。• 对于【AI 大模型】来说它最擅长的是语义理解和文本总结最不擅长的就是获取实时的信息。因为大模型的训练数据是有截止日期的• 对于【搜索引擎】来说它最擅长的就是获取实时的信息缺点是信息分散每次都需要人为进行总结。• 大模型与搜索引擎的结合就是给 AI 配备了一个活字典让 AI 可以随时进行查阅。下图展示了一个最简单的 AI 搜索工作流程搜索引擎在这里充当知识库结合我们的查询语句大模型便可以从知识库中获取相应的查询结果先来思考一个问题搜索引擎可以帮我们解决实时数据的获取但获取到的数据也是受限的。它只能获取到公开在网络中的数据而无法获取到一些本地数据或企业内部的私有数据等此时该如何答案是使用 RAG检索增强生成技术当用户向 LLM 提问时系统首先在知识库如公司内部文档中进行语义搜索找到最相关的内容然后将这些内容和问题一起交给 LLM 来生成答案。与 AI 搜索类比本质是知识库改变了从搜索引擎线上搜索改为了本地或私有知识库中搜索。5.1.2 RAG 流程模型的训练数据有截止日期也不包含你的私有文档。RAG 的思路是先把你的文档喂给系统查询时找到最相关的片段和问题一起交给 LLM。RAG 的离线数据处理流程文档加载Document Loading → 文本分割Splitting → 嵌入向量化Embedding → 存入向量数据库Storage文档加载器干的活就是第一步把各种格式的数据源转成 LangChain 能认识的 Document 对象。RAG 的流程分为【离线数据处理】和【在线检索】两个过程。上面提到RAG 知识库可以是本地文档、公司内部文档等一些私有化数据。但这些私有数据或文档实际上并不能很好地被直接进行检索访问。因此需要将这些私有化数据构建成可以被检索的知识库这就是离线数据处理要干的事情。经过离线数据后知识则会按照某种格式以及排列方式存储在知识库中等待被使用。而在线检索则是我们依赖知识库查询通过大模型生成结果的过程。过程如下图所示• 文档加载 (Document Loading)加载多种不同来源加载文档。LangChain 提供了 100 多种不同的文档加载器包括 PDF 在内的非结构化的数据、SQL 在内的结构化的数据以及 Python、Java之类的代码等。• 文本分割 (Splitting)文本分割器把 Documents 切分为指定大小的块。• 存储 (Storage)存储涉及到两个环节分别是◦ 将切分好的文档块进行嵌入Embedding即将文档块转换成向量的形式。◦ 将 Embedding 后的向量数据存储到向量数据库中。• 检索 (Retrieval)根据语义相似性...等得到结果不是MySQL那种精确查询数据存入向量数据库后。当我们需要进行数据检索时会通过某种检索算法找到与输入问题相似的文档块。• 输出 (Output)把问题以及检索出来的文档块一起提交给 LLMLLM 会通过问题和检索出来的提示一起来生成更加合理的答案。5.2 Document 文档类所有加载器返回的都是这个 Document 对象。from langchain_core.documents import Document要想实现 RAG首先就需要从源中获取数据即加载数据或文档。这是通过 LangChain 的文档加载器完成的。LangChain 文档加载器可以将各种数据源加载成一系列的文档对象Document 。class langchain_core.documents.base.Document 用于存储一段文本和相关元数据的类我们可以直接定义LangChain 文档列表可以直接手写Docementfrom langchain_core.documents import Document documents [ Document( page_content狗是很好的伴侣以忠诚和友好而闻名。, metadata{source: mammal-pets-doc}, ), Document( page_content猫是独立的宠物经常享受自己的空间。, metadata{source: mammal-pets-doc}, ), ]为什么 metadata 重要 后续检索时你可以通过元数据筛选——比如只搜 PDF 第 3 页的内容、只看某个文件的片段。source、page、page_label 是约定俗成的字段。5.3 加载 PDF 文档 — PyPDFLoaderfrom langchain_community.document_loaders import PyPDFLoader代码from langchain_community.document_loaders import PyPDFLoader #1、创建加载器 file_path./file/C面试宝典完整版最最最新.pdf loaderPyPDFLoader(file_path) #2、加载pdf的每个页变成一个Document对象 docsloader.load() #3、查看结果 print(fPDF总页数:{len(docs)}) print(f第一页前200字:\n{docs[0].page_content[:200]}) print(f第一页元数据:\n{docs[0].metadata})第一页元数据{producer: Typora,creator: Typora,creationdate: 20220323035243,moddate: 20220323035243,source: ./file/C面试宝典完整版最最最新.pdf,total_pages: 241,page: 0, page_label: 1}本地 PDF 文件│ PyPDFLoader(file_path).load()▼xxx 个 Document 对象├── docs[0]: page_content第1页文字, metadata{page: 0, source: ...}├── docs[1]: page_content第2页文字, metadata{page: 1, source: ...}└── ...5.4 加载 Markdown 文件 — UnstructuredMarkdownLoaderfrom langchain_community.document_loaders import UnstructuredMarkdownLoader安装依赖pip install unstructured[md] nltk代码single模式from langchain_community.document_loaders import UnstructuredMarkdownLoader loader UnstructuredMarkdownLoader(./file/后端总框架.md) data loader.load() print(len(data)) # 整个文件在一个 Document 里 print(data[0].page_content[:200]) print(data[0].metadata)elements 模式from langchain_community.document_loaders import UnstructuredMarkdownLoader loader UnstructuredMarkdownLoader( ./file/Day 1 详解总览.md, modeelements ) data loader.load() print(len(data)) print(data[0].page_content[:200]) print(data[0].metadata){source: ./file/Day 1 详解总览.md,languages: [zho],file_directory: ./file,filename: Day 1 详解总览.md,filetype: text/markdown,last_modified: 2026-05-05T00:24:23,category: UncategorizedText,element_id: df08ab645ce12d840afe2e3be7dd3d71}文档是根据什么规则拆分呢答案是根据类型拆分。在元数据中有一个表示类型的字段 category 。这些类型都是现代文档解析库如Unstructured.io中用于分类 Markdow每条 data 都自带category元数据标识它的类型层级关系的还原 每个 Document 的 metadata 里有 element_id自己的 ID和 parent_id父元素的 ID通过这个可以拼回完整的文档树single vs elements 怎么选5.5 更多加载器对于 LangChain 来说能加载的文档类型远不止这些它还能加载网页、一些云提供商文件、社交媒体平台文档等更多文档加载器见LangChain Python 集成 - LangChain 文档LangChain 内置了 100 种加载器不止 PDF 和 Markdown总结文档加载的核心思路任意数据源PDF/MD/网页/数据库...│▼ 对应的 LoaderPyPDFLoader / UnstructuredMarkdownLoader / ...│▼list[Document] ← 统一的 Document 对象列表│ 每个 Document 有 .page_content文本和 .metadata元数据▼进入下一环节文本分割Text Splitters一句话 文档加载器 给 LangChain 配了个万能 U 盘把 PDF、Markdown、网页等任何格式都转成统一的 Document 对象为后续检索做好准备。