LangChain 文档加载器学习总结

13 阅读3分钟

LangChain 文档加载器学习总结

各文件知识点总结

1. markdown_loader_example.py

是什么: Markdown 文件专用加载器

有什么用: 将 .md 文件转换为 LangChain 可处理的 Document 对象

核心类: UnstructuredMarkdownLoader

示例代码:

from langchain_community.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader("./项目API资料.md")
documents = loader.load()

print(documents)  # 查看 Document 对象
print(len(documents))  # 查看文档数量
print(documents[0].metadata)  # 查看元数据

2. Office文档.py

是什么: Microsoft Office 文档加载器集合

有什么用: 加载 Excel、Word、PPT 等常见 Office 文件

核心类:

  • UnstructuredExcelLoader - Excel 表格
  • UnstructuredWordDocumentLoader - Word 文档
  • UnstructuredPowerPointLoader - PowerPoint 演示文稿

示例代码:

from langchain_community.document_loaders import (
    UnstructuredExcelLoader,
    UnstructuredWordDocumentLoader,
    UnstructuredPowerPointLoader
)

# PowerPoint 示例
ppt_loader = UnstructuredPowerPointLoader("./章节介绍.pptx", mode="elements")
ppt_document = ppt_loader.load()

print(ppt_document)
print(len(ppt_document))
print(ppt_document[0].metadata)

重要参数:

  • mode="elements": 按元素分割文档(如按幻灯片、段落等)
  • mode="single": 作为单个文档加载(默认)

3. URL网页加载器.py

是什么: 网页内容加载器

有什么用: 直接从 URL 抓取网页内容并转换为 Document 对象

核心类: WebBaseLoader

示例代码:

from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://imooc.com")
documents = loader.load()

print(documents)
print(len(documents))
print(documents[0].metadata)

特点:

  • 自动处理 HTML 解析
  • 提取网页主要文本内容
  • metadata 中包含 URL 来源信息

4. 通用文件加载器.py

是什么: 通用文件加载器,支持多种文件格式

有什么用: 当不知道文件类型或需要统一处理时使用

核心类: UnstructuredFileLoader

示例代码:

from langchain_community.document_loaders import UnstructuredFileLoader

loader = UnstructuredFileLoader("./项目API资料.md")
documents = loader.load()

print(documents)
print(len(documents))
print(documents[0].metadata)

适用场景:

  • 文件类型不确定时
  • 需要统一接口处理多种文件
  • 快速原型开发

核心概念

Document 对象结构

所有加载器返回的 Document 对象包含两个主要属性:

Document(
    page_content="文档的文本内容",
    metadata={
        "source": "文件路径或URL",
        "file_path": "完整文件路径",
        # 其他元数据...
    }
)
  • page_content: 文档的实际文本内容
  • metadata: 文档元数据(来源、类型、创建时间等)

加载器对比

加载器适用文件类型优势使用场景
UnstructuredMarkdownLoader.md针对 Markdown 优化技术文档、笔记
UnstructuredExcelLoader.xlsx, .xls表格数据处理数据分析、报表
UnstructuredWordDocumentLoader.docxWord 文档处理正式文档、合同
UnstructuredPowerPointLoader.pptx按幻灯片分割演示文稿处理
WebBaseLoader网页 URL直接抓取网页在线内容采集
UnstructuredFileLoader通用自动识别类型不确定文件类型时

应用场景

这些文档加载器主要用于:

  1. 构建 RAG 系统(检索增强生成)

    • 将各类文档加载到向量数据库
    • 为 LLM 提供外部知识
  2. 知识库文档预处理

    • 企业文档库搭建
    • 智能问答系统
  3. 多源数据整合

    • 统一处理不同格式的数据源
    • 批量文档处理
  4. 向量数据库的数据准备

    • 文档 Embedding 转换前的预处理
    • 构建语义搜索索引

学习要点

  • 选择合适的加载器可以大幅简化文档处理流程
  • 注意 mode 参数的使用(elements vs single)
  • metadata 信息对文档溯源很重要
  • 加载后的文档通常需要配合 TextSplitter 进行分割

自定义文档加载器

from typing import Iterable, AsyncIterator

from langchain_core import document_loaders
from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document


class CustomDocumentLoader(BaseLoader):
    def __init__(self, file_path: str):
        self.file_path = file_path

    def lazy_load(self) -> Iterable[Document]:
        with open(self.file_path, "r", encoding="utf-8") as f:
             line_number = 0
             for line in f:
                 line_number += 1
                 yield Document(
                     page_content=line,
                     metadata={"score": self.file_path,"line_number": line_number}
                 )
                 line_number += 1
    
    async def alazy_load(self) -> AsyncIterator[Document]:
        import aiofiles
        async with aiofiles.open(self.file_path, "r", encoding="utf-8") as f:
            line_number = 0
            async for line in f:
                line_number += 1
                yield Document(
                    page_content=line,
                    metadata={"score": self.file_path,"line_number": line_number}
                )
                line_number += 1

import os
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, "./test.txt")
loader = CustomDocumentLoader(file_path)

documents = loader.load()

print(documents)
print(len(documents))
print(documents[0].metadata)