Skip to content

Document Loaders 文档加载器

文档加载器是 LangChain 框架中负责从各种来源加载文档数据的组件。它们将不同格式、不同来源的数据统一转换为 LangChain 的 Document 对象,为后续的文本分割、嵌入和检索提供基础。

概述

Document 对象包含两个主要部分:

  • page_content:文档的文本内容
  • metadata:文档的元数据(如来源、作者、创建时间等)
python
from langchain_core.documents import Document

doc = Document(
    page_content="这是文档的文本内容。",
    metadata={"source": "example.txt", "author": "张三"}
)

安装

文档加载器主要在 langchain-community 包中:

bash
pip install langchain-community

常用文档加载器

文本加载器

加载纯文本文件:

python
from langchain_community.document_loaders import TextLoader

loader = TextLoader("path/to/file.txt")
docs = loader.load()
print(docs[0].page_content[:100])

CSV 加载器

python
from langchain_community.document_loaders import CSVLoader

loader = CSVLoader("path/to/file.csv")
docs = loader.load()

HTML 加载器

python
from langchain_community.document_loaders import HTMLLoader

loader = HTMLLoader("path/to/page.html")
docs = loader.load()

PDF 加载器

python
from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("path/to/document.pdf")
pages = loader.load()
# pages 是一个列表,每个元素代表 PDF 中的一页
print(f"PDF 共 {len(pages)} 页")
for page in pages:
    print(page.metadata)

JSON 加载器

python
from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(
    file_path="path/to/data.json",
    jq_schema=".messages[].content",
    text_content=False
)
docs = loader.load()

目录加载器(批量加载)

python
from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader(
    "path/to/directory",
    glob="**/*.txt",         # 匹配所有 .txt 文件
    show_progress=True
)
docs = loader.load()

Markdown 加载器

python
from langchain_community.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader("path/to/doc.md")
docs = loader.load()

惰性加载(懒加载)

对于大型文档集,可以使用惰性加载来节省内存:

python
loader = TextLoader("large_file.txt")

# 使用 lazy_load() 逐个加载文档
for doc in loader.lazy_load():
    print(doc.metadata)
    process(doc)  # 处理每个文档

自定义元数据

可以为加载的文档添加自定义元数据:

python
from langchain_community.document_loaders import TextLoader

loader = TextLoader("file.txt")

# 自动推断的元数据
docs = loader.load()

# 加载后手动添加元数据
for doc in docs:
    doc.metadata["category"] = "技术文档"
    doc.metadata["language"] = "zh-CN"

文档转换

加载文档后,可以使用 langchain_core 的文档转换器进行预处理:

python
from langchain_core.documents import Document

# 合并多个小文档
merged_content = " ".join([doc.page_content for doc in docs])
merged_doc = Document(
    page_content=merged_content,
    metadata={"type": "merged", "source_count": len(docs)}
)

完整示例

python
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_community.document_loaders import PyPDFLoader

# 加载多个 PDF 文件
pdf_loader = DirectoryLoader(
    "./docs/",
    glob="**/*.pdf",
    loader_cls=PyPDFLoader,
    show_progress=True
)
pdf_docs = pdf_loader.load()

# 加载文本文件
txt_loader = DirectoryLoader(
    "./docs/",
    glob="**/*.txt",
    loader_cls=TextLoader,
    show_progress=True
)
txt_docs = txt_loader.load()

# 合并所有文档
all_docs = pdf_docs + txt_docs
print(f"共加载 {len(all_docs)} 个文档")

最佳实践

  1. 选择合适的加载器:根据文件格式选择对应的加载器
  2. 使用惰性加载:处理大文件时使用 lazy_load() 避免内存溢出
  3. 善用 DirectoryLoader:批量加载时使用 DirectoryLoader 提高效率
  4. 保留元数据:充分利用 metadata 保存文档来源信息,便于后续追踪
  5. 清洗文本:加载后通常需要清洗文本(去除多余空白、特殊字符等)

下一步

本站为非官方中文学习站点,不代表 LangChain 官方。部分内容参考官方文档并重新整理为中文学习笔记。