LangChain:数据增强之加载器-Loader
LangChain框架中的Loader组件是数据增强处理流程中的核心模块,负责将不同格式的数据源转换为统一的Document对象。这些文档对象包含文本内容(page_content)和元数据(metadata),为后续的文本处理、嵌入、问答等操作奠定基础。
加载器(Loader)是数据增强流程的起点,负责将多源数据加载为文档(包含文本内容和元数据),支持本地文件(PDF、CSV、HTML)、数据库、网页、API等内容。
LangChain内部已提供的加载器:
- 使用
AsyncChromiumLoader
加载动态网页,结合BeautifulSoupTransformer
提取特定HTML标签内容。 - 通过
CSVLoader
或WebBaseLoader
加载结构化或非结构化数据。
官方:LangChain > document-loaders
Document loaders
Document Loaders are responsible for loading documents from a variety of sources.
- How to: load PDF files
- How to: load web pages
- How to: load CSV data
- How to: load data from a directory
- How to: load HTML data
- How to: load JSON data
- How to: load Markdown data
- How to: load Microsoft Office data
- How to: write a custom document loader
核心作用
- 多格式支持:支持 PDF、Markdown、HTML、代码文件、Notion、Discord 等格式。
- 数据标准化:将PDF、HTML、CSV等异构数据统一转换为结构化文档对象,便于后续处理(如文本分割、向量化等)。
- 结构化处理:自动解析文档结构(如章节标题、表格、代码块)。
- 元数据保留:自动提取来源、创建时间等元信息,增强检索和溯源能力。
- 扩展性:支持自定义加载器,适配私有数据源(如数据库、API等)。
- 性能优化:部分加载器实现懒加载或分块读取,适合处理大文件。
- 预处理集成:与文本分割器(Text Splitter)、向量化工具无缝衔接。
组件解析
加载器目录
LangChain 核心内部和LangChain社区包分别提供了不同的加载器(Loader)。
- LangChain 核心包加载器目录:langchain_core.document_loaders,已过时。
- Langchain 社区包加载器目录:langchain_community.document_loaders。
核心接口BaseLoader
加载器提供了 load() 方法,用于从指定的数据源读取数据;还提供了一个 **lazy_load()**方法,用于实现数据的懒加载,即在需要时才将数据加载到内存中,这样可以有效地减少内存占用,并提高数据的处理效率。
1
2
3
4
5
6
7class BaseLoader(ABC):
def load(self) -> list[Document]:
"""将原始数据转换为Document对象列表"""
def lazy_load(self) -> Iterator[Document]:
"""实现流式加载的迭代器"""Document对象结构
1
2
3class Document:
page_content: str # 文本内容
metadata: dict # 包含来源、创建时间等元数据
分类与示例
文本加载器
TextLoader:用于加载普通的文本文件(如 .txt 文件)。
1 | from langchain_community.document_loaders import TextLoader |
输出
1 | TextLoader:[Document(metadata={'source': 'example.txt'}, page_content='Hello World!')] |
PDF加载器
安装依赖
1 | pip install -qU pypdf |
PyPDFLoader
PyPDFLoader:可加载PDF文件,提取其中的文本内容。
1 | from langchain_community.document_loaders import PyPDFLoader |
输出
1 | PyPDFLoader:[Document(metadata={'producer': 'Typora', 'creator': 'Typora', 'creationdate': '20250426165647', 'moddate': '20250426165647', 'source': 'file/example.pdf', 'total_pages': 1, 'page': 0, 'page_label': '1'}, page_content='PDF File Example')] |
异步调用
1 | from langchain_community.document_loaders import PyPDFLoader |
结果输出
1 | {'producer': 'Typora', 'creator': 'Typora', 'creationdate': '20250426165647', 'moddate': '20250426165647', 'source': 'file/example.pdf', 'total_pages': 1, 'page': 0, 'page_label': '1'} |
CSV/Excel加载器
CSVLoader:CSV/Excel文件加载器
CSV:逗号分隔值(Comma-Separated Values,CSV)文件使用逗号来分隔值的文本文件。文件的每一行都是一条数据记录,每条记录包含一个或多个用逗号分隔的字段。LangChain 将CSV文件的每一行都视为一个独立的文档。
1 | from langchain_community.document_loaders import CSVLoader |
每个Document对象代表CSV文件的一行,CSV文件的每一行都被转换为键值对象,并输出到 Document 对象的 page_content 中。
输出结果如下:
1 | page_content='姓名: 张三 |
Web网页加载器
安装依赖
1 | pip install -qU langchain-community beautifulsoup4 |
WebBaseLoader:用于从网页上抓取文本内容。
1 | # 加载网页内容 |
电子邮件加载器
UnstructuredEmailLoader:支持加载电子邮件文件(如 .eml 文件)。
1 | from langchain.document_loaders import UnstructuredEmailLoader |
目录加载器
DirectoryLoader:目录加载器
1 | from langchain.document_loaders import DirectoryLoader |
代码仓库加载器
GitLoader:基于Git仓库加载
1 | from langchain.document_loaders import GitLoader |
加载特定目录
1 | loader = GitLoader( |
元数据增强:加载时会自动生成元数据
1 | { |
自定义处理(如忽略测试文件)
1 | def file_filter(file_path: str) -> bool: |
从本地已有仓库加载(无需克隆)
1 | loader = GitLoader( |
关键特性说明:
增量加载:支持通过lazy_load()迭代处理大仓库
二进制文件:默认跳过二进制文件(可通过file_filter调整)
依赖项:需预先安装gitpython包:
1 | pip install gitpython |
数据库加载器
1 | from langchain.document_loaders import SQLDatabaseLoader |
带分页大表加载
1 | loader = SQLDatabaseLoader( |
加载关联表数据
1 | query = """ |
依赖安装
1 | pip install sqlalchemy pymysql |
特别说明
复杂查询建议在SQL中完成JOIN和过滤,比加载后处理更高效
敏感字段(如密码)应避免在metadata_columns中指定
支持所有SQLAlchemy兼容的数据库(PostgreSQL/Oracle等)
Notion 数据库加载器
示例:获取网页特定标签内容
1 | from langchain_community.document_loaders import AsyncChromiumLoader |
自定义JSON加载器
1 | from langchain.document_loaders import JSONLoader |
自定义加载器
1 | from langchain.schema import Document |
非结构化文件加载器
官方文档:LangChain > Unstructured,Supported file types
加载非结构化文件,必须先安装依赖,否则可能会报错,例如:UnstructuredMarkdownLoader resulting in zipfile.BadZipFile: File is not a zip file
。
依赖安装
1 | import nltk |
安装完后,再次运行程序,若问题仍存在,执行下面的代码
1 | import nltk |
Markdown加载器
MarkdownLoader:专门用于加载Markdown格式的文件(如 .md 文件)。
Markdown 是非结构化文件,需先添加非结构化依赖库。
1 | pip install markdown |
使用示例
1 | from langchain_community.document_loaders import UnstructuredMarkdownLoader |
输出
1 | MarkdownLoader:[Document(metadata={'source': 'file/example.md'}, page_content='Level1\n\nLevel2\n\nLevel3\n\nTitle\n\npython Hello World!')] |
HTML加载器
1 | # 加载网页内容 |
输出
1 | UnstructuredHTMLLoader:[Document(metadata={'source': 'file/example.html', 'category_depth': 0, 'last_modified': '2025-04-26T20:21:53', 'languages': ['eng'], 'file_directory': 'file', 'filename': 'example.html', 'filetype': 'text/html', 'category': 'Title', 'element_id': '735dd56e06edeaa528f67f8ee4f43d76'}, page_content='Hello World')] |
最佳实践建议
统一元数据规范:
1
2
3
4
5
6
7
8
9class StandardLoader(CSVLoader):
def load(self) -> List[Document]:
base_docs = super().load()
for doc in base_docs:
doc.metadata.update({
"format_version": "1.0",
"processing_time": datetime.now().isoformat()
})
return base_docs异常处理策略:
1
2
3
4
5
6
7
8
9from langchain.document_loaders import UnstructuredPowerPointLoader
try:
loader = UnstructuredPowerPointLoader("presentation.pptx")
slides = loader.load()
except UnstructuredParserError as e:
handle_corrupted_file(e)
except FileNotFoundError:
logging.error("File path invalid")
通过合理选择Loader组件并配置优化参数,开发者可以高效处理各类数据源。建议根据具体场景组合使用不同Loader,并结合LangChain的文本分割、向量化组件构建完整的数据处理流水线。对于特殊格式需求,可通过继承BaseLoader实现定制化加载逻辑。
加载器组件是LangChain框架中数据输入的重要环节,它能够适配多种数据源,帮助开发者将不同格式的数据转换为统一的文档对象,方便后续进行文本处理和分析。根据不同的数据源类型,选择合适的加载器可以提高数据加载的效率和准确性。
高级用法
并发加载:部分加载器支持多线程(如AsyncHtmlLoader)
增量加载:通过lazy_load()方法实现流式处理
元数据增强:可在加载后添加自定义元数据字段
通过组合不同Loader,可以构建复杂的数据管道,例如先加载PDF中的表格,再用CSV解析器处理表格内容。
LangChain:数据增强之加载器-Loader
http://blog.gxitsky.com/2025/04/23/AI-LangChain-011-Data-Connection-Loader/