LangChain 框架之文档加载器

61 阅读6分钟

前言

之前学到了 LangChain 框架的核心组件记忆,接下来学习文档加载器(Document Loaders)

文档加载器(Document Loaders)

作用就是加载外部的文档到 LangChain 中,读取文档中的内容,然后用于后续的处理和分析

应用场景

基于文档的问答系统,日常比较常见的例如客服系统,根据产品手册自动回答相关问题,文字自动分类等;个人笔记知识库,基于自己的笔记文档等进行回答,总结等;以及其他场景如学习研究,教育内容管理 等等

文本文件加载 (TextLoader)

TextLoader 是最基础的文档加载器,用于加载纯文本文件

通过 TextLoader() 加载文件,代码如下

from langchain_community.document_loaders import TextLoader  # 文本文件加载器
import os  # 文件操作库
...
    # 创建一个示例文本文件
    sample_text = """
    LangChain 是一个用于构建基于大型语言模型(LLM)应用程序的框架。
    它提供了模块化的组件,让开发者能够轻松地构建复杂的AI应用。
    
    主要特点:
    1. 模块化设计
    2. 易于使用
    3. 支持多种LLM
    4. 丰富的工具集成
    """
    
    # 将示例文本写入文件
    with open("sample.txt", "w", encoding="utf-8") as f:
        f.write(sample_text)
    
    # 使用 TextLoader 加载文本文件
    loader = TextLoader("sample.txt", encoding="utf-8")  # 创建文本加载器,指定编码格式
    documents = loader.load()  # 加载文档,返回 Document 对象列表
    
    # 打印加载结果
    print(f"加载的文档数量: {len(documents)}")
    print(f"文档内容: {documents[0].page_content[:1000]}...")  # 打印前1000个字符
...

通过 loader.load() 返回的对象,包含了文档内容,可以通过 page_content 属性读取,整体操作很简单,两三行代码就能读取文件

PDF加载器 (PyPDFLoader)

PyPDFLoader 是用于加载 PDF 文件的文档加载器,可以读取 PDF 文件中的文本内容

通过 PyPDFLoader() 加载文件,代码如下

from langchain_community.document_loaders import PyPDFLoader  # PDF 文件加载器
import os  # 文件操作库
...
    
    try:
        # 使用 PyPDFLoader 加载同级目录下的 PDF 文件
        loader = PyPDFLoader("document.pdf")  # 创建PDF加载器
        documents = loader.load()  # 加载PDF文档
        
        # 打印加载结果
        print(f"加载的文档数量: {len(documents)}")
        print("\nPDF内容预览:")
        
        # 遍历每一页并输出内容
        for i, doc in enumerate(documents):
            page_num = doc.metadata.get("page", i + 1)  # 获取页码
            content = doc.page_content.strip()  # 获取页面内容并去除首尾空格
            
            print(f"\n--- 页面 {page_num} ---")
            if content:
                # 限制每页输出长度,避免内容过长
                preview = content[:300] + "..." if len(content) > 300 else content
                print(preview)
            else:
                print("(此页面无文本内容)")
            
            # 打印页面元数据
            print(f"元数据: {doc.metadata}")
        
    except FileNotFoundError:
        print("错误:找不到 document.pdf 文件")
        print("请确保在同级目录下存在 document.pdf 文件")
    except Exception as e:
        print(f"PDF加载错误: {e}")
        print("可能的原因:")
        print("1. PDF文件损坏")
        print("2. PDF文件受密码保护")
        print("3. 缺少PDF处理依赖")

和文本加载器类似,通过 loader.load() 返回的对象,包含了文档内容,可以通过 page_content 属性读取,读取PDF文件数据时或输出的时候按需处理对应的格式

网页加载器 (WebBaseLoader)

加载网页,通过网站地址加载网页内容,用法和文本,PDF加载器都一样,一两行代码就能加载网页内容

from langchain_community.document_loaders import WebBaseLoader  # 网页加载器

def main():
    print("=== 网页加载演示 ===")
    
    try:
        # 使用 WebBaseLoader 加载 LangChain 官方文档
        loader = WebBaseLoader("https://docs.langchain.com/oss/python/langchain/overview")  # 创建网页加载器
        documents = loader.load()  # 加载网页内容
        
        # 打印加载结果
        print(f"加载的文档数量: {len(documents)}")
        print(f"网页内容预览: {documents[0].page_content[:500]}...")  # 打印前500个字符
        print(f"网页元数据: {documents[0].metadata}")  # 包含URL等信息
        
    except Exception as e:
        print(f"网页加载错误: {e}")
        print("可能是网络连接问题或网站不可访问")
    
    print()

数据库加载器 (SQLDatabaseLoader)

作用是从数据库中加载数据,返回的是一个文档对象列表,每个文档对象包含了数据库中的一条记录,记录的内容就是数据库中的字段值,记录的元数据就是数据库中的字段名

由于我日常前端开发为主,下面使用 CSVLoader 加载 CSV 文件,模拟数据库数据

from langchain_community.document_loaders import CSVLoader  # CSV文件加载器
import os  # 文件操作库

def main():
    """主函数:演示数据库内容加载"""
    print("=== 数据库加载演示 ===")
    
    # 创建一个示例CSV文件来模拟数据库数据
    csv_content = """id,name,description,category
1,Python,一种高级编程语言,编程语言
2,JavaScript,网页脚本语言,编程语言
3,MySQL,关系型数据库,数据库
4,MongoDB,文档型数据库,数据库
5,Docker,容器化平台,开发工具"""
    
    # 将CSV内容写入文件
    with open("data.csv", "w", encoding="utf-8") as f:
        f.write(csv_content)
    
    # 使用 CSVLoader 加载CSV文件(模拟数据库数据)
    loader = CSVLoader("data.csv", encoding="utf-8")  # 创建CSV加载器
    documents = loader.load()  # 加载数据
    
    # 打印加载结果
    print(f"加载的记录数量: {len(documents)}")
    print("前3条记录:")
    for i, doc in enumerate(documents[:3]):
        print(f"记录 {i+1}: {doc.page_content}")
        print(f"元数据: {doc.metadata}")
    
    # 清理示例文件
    os.remove("data.csv")
    

Markdown文件加载器 (MarkdownLoader)

从 Markdown 文件中加载内容,和文本加载器类似,就是函数名不一样

# 导入必要的库
from langchain_community.document_loaders import UnstructuredMarkdownLoader  # Markdown文件加载器
import os  # 文件操作库

def main():
    """主函数:演示Markdown文件加载"""
    print("=== Markdown文件加载演示 ===")
    
    # 创建一个示例Markdown文件
    markdown_content = """# LangChain 教程

## 简介
LangChain 是一个强大的框架,用于构建基于LLM的应用程序。

## 主要功能
- **文档处理**: 加载和分割各种格式的文档
- **向量存储**: 高效的文档检索
- **链式调用**: 复杂的工作流程

## 代码示例

from langchain.llms import OpenAI
llm = OpenAI()
result = llm("Hello, LangChain!")


## 总结
LangChain 让AI应用开发变得简单高效。"""
    
    # 将Markdown内容写入文件
    with open("sample.md", "w", encoding="utf-8") as f:
        f.write(markdown_content)
    
    # 使用 UnstructuredMarkdownLoader 加载Markdown文件
    loader = UnstructuredMarkdownLoader("sample.md")  # 创建Markdown加载器
    documents = loader.load()  # 加载文档
    
    # 打印加载结果
    print(f"加载的文档数量: {len(documents)}")
    print(f"文档内容预览: {documents[0].page_content[:200]}...")
    print(f"文档元数据: {documents[0].metadata}")
    
    # 清理示例文件
    os.remove("sample.md")
    print()

if __name__ == "__main__":
    main()

小结

文档加载器相关知识点和例子就结束了,除了概念和作用有点内容了解一下,代码上没什么新鲜东西,引入的库和函数不一样,看下例子简单过一遍就行了

后面将继续学习文本分割器相关内容

欢迎留言交流,如果觉得有帮助,可以点个赞支持一下

公众号:草帽lufei