一、前言
在基于 LangChain 构建 RAG 检索增强生成系统时,文档加载是整个项目的第一步、也是最基础最关键的一环。无论后续向量嵌入、向量数据库、检索链、大模型问答做得多完善,只要文档加载解析出错、乱码、漏内容、格式解析不全,整个 RAG 系统的问答准确率都会大打折扣。
LangChain 官方内置了海量文档加载器,支持日常开发中几乎所有常见格式:TXT、Markdown、PDF、Word、Excel、CSV、网页 URL、本地文件夹批量加载等。本文聚焦纯文档加载模块,介绍环境准备 + 各类文档加载实战代码 + 逐行详细注释 + 常见报错解决方案 + 批量加载封装,全程可直接复制运行,适合入门学习、项目直接复用。
一、环境安装(仅加载依赖)
bash
运行
# 核心框架 pip install langchain langchain-community # 文档解析依赖 pip install pypdf # PDF pip install python-docx # Word pip install pandas openpyxl # Excel/CSV pip install beautifulsoup4 lxml # 网页 pip install charset-normalizer # 自动识别编码,解决乱码二、核心概念(仅看这一段就够)
- 加载器(Loader):LangChain 针对每种文件格式提供专用加载器
- Document 对象:加载后统一返回格式,包含:
page_content:文档文本内容metadata:元数据(路径、页码、标题等)
- 返回值:所有加载器最终都返回
列表[Document]
三、实战代码:全格式文档加载(带超强注释)
3.1 TXT 文本文档加载(最基础)
python
运行
# 导入TXT专用加载器 from langchain.document_loaders import TextLoader # 导入编码自动检测工具 from charset_normalizer import from_path def load_txt(file_path: str): """ 加载TXT文档,自动解决中文乱码 """ # 自动检测文件编码(UTF-8/GBK/ASCII 自动识别) encoding = from_path(file_path).best().encoding # 初始化加载器 loader = TextLoader(file_path, encoding=encoding) # 执行加载 documents = loader.load() # 输出加载信息 print(f"【TXT加载成功】路径:{file_path} | 编码:{encoding} | 文本长度:{len(documents[0].page_content)}") return documents # 调用 # docs = load_txt("测试.txt")3.2 Markdown 文档加载
python
运行
from langchain.document_loaders import MarkdownLoader from charset_normalizer import from_path def load_md(file_path: str): """ 加载MD文档,自动解析语法、提取纯文本 """ encoding = from_path(file_path).best().encoding loader = MarkdownLoader(file_path, encoding=encoding) documents = loader.load() print(f"【MD加载成功】路径:{file_path} | 内容长度:{len(documents[0].page_content)}") return documents # 调用 # docs = load_md("说明文档.md")3.3 PDF 文档加载(带页码、元数据)
python
运行
from langchain.document_loaders import PyPDFLoader def load_pdf(file_path: str): """ 加载PDF,自动分页,自带页码元数据 """ loader = PyPDFLoader(file_path) # 分页加载,每页生成一个Document对象 documents = loader.load() print(f"【PDF加载成功】路径:{file_path} | 总页数:{len(documents)}") # 打印前3页元数据(页码) for i, doc in enumerate(documents[:3]): print(f" 第{doc.metadata['page']+1}页,内容长度:{len(doc.page_content)}") return documents # 调用 # docs = load_pdf("企业知识库.pdf")3.4 Word(.docx)文档加载
python
运行
from langchain.document_loaders import Docx2txtLoader def load_word(file_path: str): """ 加载Word文档(仅支持 .docx,不支持旧版 .doc) """ loader = Docx2txtLoader(file_path) documents = loader.load() print(f"【Word加载成功】路径:{file_path} | 内容长度:{len(documents[0].page_content)}") return documents # 调用 # docs = load_word("合同模板.docx")3.5 CSV 表格加载
python
运行
from langchain.document_loaders import CSVLoader def load_csv(file_path: str): """ 加载CSV表格,按行解析 """ loader = CSVLoader(file_path, encoding="utf-8") documents = loader.load() print(f"【CSV加载成功】路径:{file_path} | 总行数:{len(documents)}") return documents # 调用 # docs = load_csv("产品清单.csv")3.6 Excel(.xlsx)加载
python
运行
from langchain.document_loaders import UnstructuredExcelLoader def load_excel(file_path: str): """ 加载Excel,支持多工作表 """ loader = UnstructuredExcelLoader(file_path, mode="elements") documents = loader.load() print(f"【Excel加载成功】路径:{file_path} | 数据块数量:{len(documents)}") return documents # 调用 # docs = load_excel("销售数据.xlsx")3.7 网页 URL 在线加载
python
运行
from langchain.document_loaders import WebBaseLoader def load_url(url: str): """ 加载任意静态网页,自动剔除HTML标签,保留纯文本 """ loader = WebBaseLoader(url) documents = loader.load() print(f"【网页加载成功】URL:{url} | 标题:{documents[0].metadata['title']}") return documents # 调用 # docs = load_url("https://baike.baidu.com/item/人工智能")四、高级实战:文件夹批量加载(企业级必备)
4.1 批量加载指定格式文档
python
运行
from langchain.document_loaders import DirectoryLoader def batch_load(folder_path: str): """ 批量加载文件夹内所有支持的文档:TXT/MD/PDF/DOCX/CSV 自动跳过损坏文件、不支持格式 """ all_docs = [] # 定义要加载的格式与对应加载器 file_types = { "txt": TextLoader, "md": MarkdownLoader, "pdf": PyPDFLoader, "docx": Docx2txtLoader, "csv": CSVLoader } for ext, loader_cls in file_types.items(): try: loader = DirectoryLoader( path=folder_path, glob=f"*.{ext}", loader_cls=loader_cls, silent_errors=True # 跳过报错文件,不中断程序 ) docs = loader.load() all_docs.extend(docs) print(f"└─ 加载 {ext} 文件:{len(docs)} 个") except: print(f"└─ {ext} 文件无数据或加载失败") print(f"\n【批量加载完成】总计文档:{len(all_docs)} 块") return all_docs # 调用 # all_docs = batch_load("./知识库")五、高频问题解决方案
5.1 中文乱码
所有文本加载都使用:
python
运行
encoding = from_path(file_path).best().encoding自动识别编码,100% 解决乱码。
5.2 PDF 加载空白 / 无法读取
原因:扫描件 PDF(图片)无法提取文字,必须用 OCR 工具先转文字。
5.3 Word 加载失败
原因:只支持.docx,不支持.doc旧版格式,需转换格式后再加载。
5.4 批量加载中断
开启silent_errors=True,跳过损坏文件。
六、总结(纯加载核心)
- 所有文档最终都转为 Document 对象
- 加载器与格式一一对应,专用加载器最稳定
- 乱码用编码自动检测
- 企业项目直接用批量加载
- 本文代码无任何冗余,可直接用于生产环境
专注 RAG 落地开发,只讲硬核实战!关注我,后续更新文档分割、向量库、检索优化、RAG 全流程干货!本文全套加载工具包 + 批量脚本已打包,点赞 + 收藏 + 评论区扣【加载】,立即免费领取