【技术专题】基于LangChain的RAG与Agent智能体 - 文档加载器

0 阅读8分钟

大家好,我是锋哥。最近连载更新《基于LangChain的RAG与Agent智能体》技术专题。

QQ截图20260324143646.jpg 本课程主要介绍和讲解RAG,LangChain简介,接入通义千万大模型,Ollama简介以及安装和使用,OpenAI库介绍和使用,以及最重要的基于LangChain实现RAG与Agent智能体开发技术。同时也配套视频教程 《2027版 基于LangChain的RAG与Agent智能体开发视频教程》

文档加载器

image.png

在企业里使用 LangChain 进行知识库或问答系统构建时,文档加载器(Document Loader)主要是用来把企业内部的各种信息源转化成 LangChain 可以处理的 Document 对象。

文档加载器官方文档:

docs.langchain.com/oss/python/…

根据企业实际使用场景,最常见的三种文档类型通常是:


1. PDF 文档

  • 用途:合同、政策手册、技术文档、报告、PPT 导出的 PDF 等。

  • 加载器:

    • PyPDFLoader:基本 PDF 文档加载。
    • UnstructuredPDFLoader:使用 unstructured 库解析 PDF,可处理复杂排版。
    • PDFMinerLoader / PyMuPDFLoader:解析更复杂的 PDF,支持文字、图片等内容。
  • 企业场景

    • 法律、财务文档知识库。
    • 产品技术说明书或内部培训资料。

2. Word / Office 文档

  • 用途:合同模板、项目报告、会议纪要、内部文档。

  • 加载器:

    • UnstructuredWordLoader:基于 unstructured 库,支持 .doc.docx
    • Docx2txtLoader:简单的 .docx 文本提取。
  • 企业场景:

    • HR 文档管理(考勤、合同、员工手册)。
    • 内部项目文档或工作总结。

3. Markdown / 文本文件

  • 用途:企业内部知识库、Wiki、开发文档。

  • 加载器:

    • TextLoader:加载纯文本文件 .txt
    • UnstructuredMarkdownLoader:加载 .md,保留标题层级和结构信息。
  • 企业场景:

    • 开发团队的 README、Wiki 文档。
    • 产品 FAQ、知识管理系统内容。

💡 补充说明

  • 企业有时也会加载 HTML、CSV、数据库、网页内容 等,但 PDF、Word、Markdown/文本是最常见、加载量最大的。
  • 在实际企业落地中,通常会结合 分段、嵌入向量化 来处理这些文档,让问答系统更高效。

接下来课程我们准备了一些测试数据:

image.png

CSVLoader文档加载器

CSVLoader 是 LangChain 中专门用于加载逗号分隔值(CSV) 文件的文档加载器。它将 CSV 文件的每一行数据转换为一个独立的 Document 对象,非常适合处理销售报表、用户数据、财务记录等结构化表格数据 。

有两个加载方法:

1,load()方法,一次性加载全部文档内容

2,lazy_load()方法,延迟加载,适合数据库很大的文档。

我们先看一个load()加载示例:

from langchain_community.document_loaders import CSVLoader
​
# 创建CSV加载器对象
loader = CSVLoader(
    file_path="../data/员工信息.csv",  # 文件路径
    encoding="utf-8",  # 文件编码
)
​
# 一次性加载数据
documents = loader.load()
print(documents)
​
for doc in documents:
    print("===" * 20)
    print(doc)
    print(doc.page_content)

运行输出:

image.png

再看一个延迟加载示例:

from langchain_community.document_loaders import CSVLoader
​
# 创建CSV加载器对象
loader = CSVLoader(
    file_path="../data/员工信息.csv",  # 文件路径
    encoding="utf-8",  # 文件编码
)
​
for doc in loader.lazy_load():
    print("===" * 20)
    print(doc)
    print(doc.page_content)

运行输出:

CSVLoader还有一个csv_args配置参数

csv_argsCSVLoader 中用于自定义 CSV 解析行为的一个字典参数。它直接透传给 Python 标准库 csv.DictReader,允许开发者灵活处理各种格式的 CSV 文件(如自定义分隔符、引号字符、编码方式等)。下表列出了最常用的配置参数及其说明:

参数名类型默认值说明
delimiterstr','字段分隔符,默认为逗号。若文件为制表符分隔,可设为 '\t'
quotecharstr'"'用于包裹包含特殊字符(如分隔符、换行符)的字段的引号字符。
escapecharstrNone转义字符,用于转义引号内的分隔符或引号本身(例如设置为 '\')。
doublequoteboolTrue当字段内出现引号时是否用两个引号表示一个引号。若为 False,则需配合 escapechar 使用。
skipinitialspaceboolFalse是否忽略分隔符后面的空白字符。
lineterminatorstr'\r\n'行终止符,通常无需修改。
quotingintcsv.QUOTE_MINIMAL控制何时使用引号。可选值:csv.QUOTE_ALL(全部加引号)、csv.QUOTE_MINIMAL(仅当需要时)、csv.QUOTE_NONNUMERIC(非数字加引号)、csv.QUOTE_NONE(不使用引号)。
fieldnameslistNone指定列名列表。如果 CSV 文件没有表头行,可以通过此参数显式定义列名。
restkeystrNone当一行中的字段数多于 fieldnames 时,多余的字段将以此键名存储。
restvalstrNone当一行中的字段数少于 fieldnames 时,缺失的字段将以此值填充。
from langchain_community.document_loaders import CSVLoader
​
# 创建CSV加载器对象
loader = CSVLoader(
    file_path="../data/员工信息.csv",  # 文件路径
    encoding="utf-8",  # 文件编码
    csv_args={
        "delimiter": ",",  # 分隔符
        "quotechar": '"',  # 引号字符
        "fieldnames": ["id", "name", "age", "gender", "department", "position", "salary", "experience"],  # CSV字段名
    }
)
​
# 一次性加载数据
documents = loader.load()
print(documents)
​
for doc in documents:
    print("===" * 20)
    print(doc.page_content)

运行结果:

image.png

TextLoader文档加载器

TextLoader 是 LangChain 中最基础的文档加载器之一,专门用于从纯文本文件(如 .txt) 中读取内容。它会将整个文件作为一个 Document 对象加载,其中 page_content 包含文件的全部文本,metadata 默认只包含文件路径(source)。该加载器非常适合处理日志文件、配置文件、简单的文本文档等不需要复杂解析的数据源。

🔧 TextLoader 的核心参数

TextLoader 的配置相对简单,主要用于处理文件路径和编码问题。其核心参数如下表所示:

参数名类型默认值说明
file_pathstrPath必需要加载的文本文件的路径。
encodingstrNoneNone指定文件的编码格式,如 "utf-8""gbk"。若不指定,则使用系统默认编码。
autodetect_encodingboolFalse若设为 True,则会自动检测文件编码(使用 chardet 或类似库),避免因编码不匹配导致的 UnicodeDecodeError

加载后,生成的 Document 对象包含:

  • page_content:文件的全部文本内容(字符串)。
  • metadata:一个字典,默认包含 {'source': '文件路径'}

我们来看一个示例:

from langchain_community.document_loaders import TextLoader
​
# 创建TextLoader对象
loader = TextLoader(
    file_path="../data/langchain文档.txt",
    encoding="utf-8",
)
​
# 一次性加载数据
documents = loader.load()
​
print(len(documents), documents)
print(documents[0].page_content)

image.png

PyPDFLoader文档加载器

PyPDFLoader 是 LangChain 中最常用的 PDF 文档加载器之一,基于 pypdf 库(原 PyPDF2)实现。它专门用于从 PDF 文件中提取文本内容,并将每一页转换为一个独立的 Document 对象。这种按页分割的设计使得后续处理(如文本分割、向量化)更加灵活,特别适合处理产品手册、财报、合同、技术文档等企业常见的 PDF 文件。

🔧 PyPDFLoader 的核心参数

PyPDFLoader 的配置相对简单,主要关注文件路径和提取模式。其核心参数如下表所示:

参数名类型默认值说明
file_pathstrPath必需要加载的 PDF 文件的路径。
passwordstrNoneNone如果 PDF 文件受密码保护,提供密码以解密。
extract_imagesboolFalse是否尝试从 PDF 中提取图像(需要额外依赖)。
headersdictNone如果 file_path 是 URL,可提供 HTTP 请求头。
modestrpage默认page模式,根据页来拆分文档,single模式返回一个文档

加载后,PDF 的每一页会生成一个独立的 Document 对象:

  • page_content:该页提取的文本内容。
  • metadata:包含文件来源(source)、页码(page,从 0 开始)等信息。

首先安装下依赖库pypdf

pip install pypdf -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

我们来看一个示例:

from langchain_community.document_loaders import PyPDFLoader
​
# 创建PyPDFLoader对象
loader = PyPDFLoader(
    file_path="../data/langchain文档.pdf",
)
​
documents = loader.load()
print(len(documents), documents)
for doc in documents:
    print("===" * 20)
    print(doc.page_content)

运行输出:

image.png

默认是page页模式,也就是每一页生成一个docment文档。但是这种分法不太好,我们后面这些文档都是要进行向量化,存向量数据库,需要根据实际的段落语义来进行文档分割,等下一个章节,我们会专门讲下文档分割器。所以这里我们要设置成single模式,直接返回一个document文档,然后用文档分割器进行文档分割。

我们修改下:

from langchain_community.document_loaders import PyPDFLoader
​
# 创建PyPDFLoader对象
loader = PyPDFLoader(
    file_path="../data/langchain文档.pdf",
    mode="single"  # 默认是page,根据PDF页来进行拆分,如果是single,则将PDF整体作为单页进行拆分
)
​
documents = loader.load()
print(len(documents), documents)
for doc in documents:
    print("===" * 20)
    print(doc.page_content)

运行结果:

image.png

如果是加密PDF文档,需要加上password属性。

from langchain_community.document_loaders import PyPDFLoader
​
# 创建PyPDFLoader对象
loader = PyPDFLoader(
    file_path="../data/锋哥的网站.pdf",
    password="123456"
)
​
documents = loader.load()
print(len(documents), documents[0].page_content)

运行输出:

image.png

Docx2txtLoader文档加载器

Docx2txtLoader 是 LangChain 中专用于加载 Microsoft Word 文档(.docx 格式)的加载器。它基于 docx2txt 库实现,能够从 Word 文件中提取纯文本内容,并将整个文档作为一个 Document 对象加载。这个加载器非常适合处理企业中大量存在的制度文档、产品需求说明书、项目报告、合同草案等 Word 格式的文件。

🔧 Docx2txtLoader 的核心参数

Docx2txtLoader 的配置非常简单,主要关注文件路径。其核心参数如下表所示:

参数名类型默认值说明
file_pathstrPath必需要加载的 Word 文档(.docx)的路径。
encodingstrNoneNone指定文本编码,通常无需设置。

加载后,整个 Word 文档会生成一个 Document 对象:

  • page_content:从 Word 文档中提取的完整文本内容。
  • metadata:默认包含文件来源(source)信息。

首先安装下依赖库docx2txt

pip install docx2txt -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

我们来看一个示例:

from langchain_community.document_loaders import Docx2txtLoader
​
# 创建Docx2txtLoader对象
loader = Docx2txtLoader(
    file_path="../data/langchain文档.docx",
)
​
# 一次性加载数据
documents = loader.load()
print(len(documents), documents[0].page_content)

运行输出:

image.png