1. 核心概念

文档加载器是 LangChain 框架中的一个关键组件。它的核心功能是:

  • 加载数据:从各种来源(如文件系统、数据库、网页、API等)读取原始数据。
  • 结构化处理:将加载的原始数据(如文本文件、PDF、网页内容)转化为 LangChain 能够处理的统一格式——通常是一个或多个 Document 对象。
  • Document 对象:这是一个包含以下核心字段的结构:
    • page_content: 存储文档的实际文本内容(字符串)。
    • metadata: 存储与文档相关的元数据(字典),如来源路径、作者、创建日期等。

2. 主要类型

LangChain 提供了极其丰富的文档加载器,支持从各种来源加载数据。以下是一些常见的类型:

(1) 文件系统加载器

  • TextLoader: 加载纯文本文件 (.txt).     
from langchain_community.document_loaders  import TextLoader
from langchain_text_splitters import  RecursiveCharacterTextSplitter

loder=TextLoader("./data/hello.txt",encoding="utf-8")
documents=loder.load()

       介绍一个文本分割器:(RecursiveCharacterTextSplitter)

splitter=RecursiveCharacterTextSplitter(
    chunk_size=20,          #分段长度
    chunk_overlap=10,       #分段允许重叠的长度
    separators=["。","?","!",".",","],    #文本分段依据
    length_function=len     #指定文本分割函数(len内置函数用于统计字符数)
)
split_docs=splitter.split_documents(documents)
#函数最后返回的时doucument类
  • CSVLoader: 加载 CSV 文件。可以指定列名,将每一行视为一个 Document,或将整个文件视为一个 Document
    from langchain_community.document_loaders import CSVLoader
    
    loder=CSVLoader(
    
        file_path="./data/例子.csv"
        csv_args={
            "delimiter": ","  #配置:默认分隔符是英文逗号
            "quotechar": '"'  #指定带有分割符文本的引号包围是单引号还是双引号,"唱跳,rap"这样逗号就不会被识别为分隔符
            "fieldnames":["姓名","年龄","爱好"]  #指定csv文件的字段名(表头)---如果数据有表头就不要添加该属性  
        },
        encoding="utf-8"
    }    
    
    # 批量加载
    documents=loder.load()
    for doc in documents:
        print(doc.page_content)
    # #懒加载
    for doc in loder.lazy_load():
        print(doc.page_content)

    下面是css的例子:我的css中是有表头的,所以可以不需要fieldnames,上述只是用于讲解详细添加的。

    id,name, happy
    1001,赵丽颖,"唱跳,rap"
    1002,冯绍峰,"唱跳,rap"
    1003,王一博,"唱跳,rap"
    1004,谢娜,"唱跳,rap"
    1005,倪妮,"唱跳,rap"
    1006,肖战,"唱跳,rap"
    

    两个直接使用的结果就是在识别时你的字段名也会被识别为属性值:(例如)

           姓名: id
           性别: name
           爱好: happy

 

  • JSONLoader: 加载 JSON 文件。需要指定 jq_schema 来提取文本内容(如 .content)和元数据。
from langchain_community.document_loaders import JSONLoader

loder=JSONLoader(
    file_path="./data/stu.json",
    jq_schema="." ,#指定json文件的字段名,
    # .为抽取全部,但是抽取出来的是dict所以需要转换为string否则回报错
    # .name 意味抽取name字段
    text_content=False,
)
loder1=JSONLoader(
    file_path="./data/stus.json",
    jq_schema=".[].name" ,
    # []代表数组,[0]代表数组的第一个元素
    text_content=False,
)

loder_JsonLines=JSONLoader(
    file_path="./data/stu_json_lines.json",
    jq_schema=".name" ,
    text_content=False,
    json_lines=True,# 指定为json_lines格式(每一行都是独立的标准JSON)
)

#load全加载
documents=loder_JsonLines.load()
print(documents)

stu.json

{
  "name": "周杰伦",
  "age": 18,
  "sex": "男",
  "hobby": [ "听歌", "看电影"],
  "info": {
    "address": "上海",
    "phone": "123456789"
  }
}

stu_json_lines.json

{ "name": "周杰伦", "age": 18, "sex": "男"}
{ "name": "王力宏", "age": 19, "sex": "男"}
{ "name": "张学友", "age": 20, "sex": "男"}

stus.json

[
  {"name": "周杰伦", "age": 18},
  {"name": "王力宏", "age": 19},
  {"name": "张学友", "age": 20}
]
  • PDFMinerLoader / PyPDFLoader / UnstructuredPDFLoader: 加载 PDF 文件。注意:PDF 解析复杂,效果取决于 PDF 本身(文本型 PDF vs 扫描图片型 PDF)。这些加载器尝试提取文本。
    from langchain_community.document_loaders import PyPDFLoader
    
    loader=PyPDFLoader(
        file_path="./data/java手册.pdf",
        mode= 'page'
    )

    关键参数说明:

  • file_path: PDF 文件路径

  • mode: 提取模式"single": 整个文档作为一个文档对象"page": 每一页作为独立的文档对象 )

  • extraction_mode: 文本提取模式"plain": 传统方式,简单提取文本"layout": 保留 PDF 布局格式,更精确

  • password: 加密 PDF 的密码 ⚠️(当前为空,如果 PDF 没有密码可以删除或设为 None)

  • extract_images: 是否提取图片(默认 False)

  • pages_delimiter: 在 single 模式下分隔页面的字符串

(2) 网页加载器

  • WebBaseLoader: 加载网页的 HTML 内容,并提取其中的文本。
    from langchain_community.document_loaders import WebBaseLoader
    
    loader = WebBaseLoader(
        web_paths=["https://www.thepaper.cn/newsDetail_forward_5074332"],
    )
    
    document = loader.load()[0]
    print(document.page_content)

     

  • AsyncHtmlLoader: 异步版本,用于批量加载多个网页。
  • NewsURLLoader: 专门用于加载新闻文章 URL。

(3) 数据库加载器

  • FaissLoader: 从 Faiss 向量存储中加载文档(通常与检索器一起使用)。
  • SingleStoreDBLoader: 从 SingleStore 数据库中加载。

(4) 其他来源加载器

  • NotionDirectoryLoader: 加载导出的 Notion 工作空间目录。
  • GoogleDriveLoader: 从 Google Drive 加载文件(需要认证)。
  • GitHubLoader: 加载 GitHub 仓库的文件或 Issues。
  • YouTubeAudioLoader: 加载 YouTube 视频的音频,并转录为文本(需要语音识别库)。

3. 关键作用

文档加载器在 LangChain 的文档处理流程中扮演着起始点的角色:

  1. 数据接入:它们提供了标准化的接口,将来自五花八门来源的数据统一转化为 Document 格式。
  2. 下游处理的基础:生成的 Document 对象可以直接传递给:
    • 文本分割器 (Text Splitters):将长文档拆分成更小的片段(如段落、句子),便于嵌入或模型处理。
    • 向量存储 (Vector Stores):将文档片段转换为向量并存储,用于后续的检索。
    • 语言模型 (LLMs):作为模型的输入上下文。

4. 使用要点

  • 选择合适的加载器:根据你的数据源类型(文件格式、数据库、网页等)选择对应的加载器。
  • 处理元数据:加载器通常会尝试捕获源文件的元信息(文件名、URL、最后修改时间等),这些信息对后续处理(如检索结果的来源标注)很有价值。
  • 错误处理:文件加载可能出错(如文件不存在、格式解析失败),代码中需要考虑异常处理。
  • 性能考量:对于大量数据或网络请求,考虑异步加载器或批量处理。

总结

文档加载器是 LangChain 生态中连接原始数据与高级处理(如嵌入、检索、问答)的桥梁。它们负责将异构数据源标准化为 Document 对象,为后续的文档切分、信息检索和语言模型交互提供基础输入。理解并熟练使用各种文档加载器是构建 LangChain 应用的重要一步。

 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐