LLM 应用为何需要文本加载器及 LangChain 使用方法
本文介绍了 LangChain 中文本加载器的核心作用及具体使用方法。涵盖了 TXT、CSV、PDF、HTML、JSON、Markdown 等多种格式的加载方式,演示了 DirectoryLoader 的批量处理、多线程优化及错误处理机制。同时补充了文本切片策略、安全性考量及元数据管理等最佳实践,旨在帮助开发者高效完成非结构化数据的预处理,为构建 RAG 应用奠定基础。

本文介绍了 LangChain 中文本加载器的核心作用及具体使用方法。涵盖了 TXT、CSV、PDF、HTML、JSON、Markdown 等多种格式的加载方式,演示了 DirectoryLoader 的批量处理、多线程优化及错误处理机制。同时补充了文本切片策略、安全性考量及元数据管理等最佳实践,旨在帮助开发者高效完成非结构化数据的预处理,为构建 RAG 应用奠定基础。

在构建基于大语言模型(LLM)的应用,特别是检索增强生成(RAG)的本地应用时,数据源往往是多样化的。我们需要使用文本加载器来动态获取网页、文档或数据库中的数据。
在不同的应用场景中,需要使用不同的文本内容作为知识的载体。针对不同类型的文本,LangChain 提供了多种文本加载器(Document Loaders),帮助我们快速将非结构化数据转换为标准的 Document 对象,并进行切片处理,从而使开发者能将更多精力集中在核心业务逻辑的实现上。
文档加载器的作用是将源数据加载为 Document 对象。一个 Document 包含两部分:
page_content:实际的文本内容。metadata:关联的元数据(如来源文件路径、页码、作者等)。例如,存在用于加载简单 .txt 文件的加载器,也有用于加载任何网页文本内容甚至 YouTube 视频转录的加载器。
文档加载器通常提供以下方法:
对于简单的纯文本文件,可以使用 TextLoader。
from langchain_community.document_loaders import TextLoader
loader = TextLoader("./index.md")
docs = loader.load()
返回结果示例:
[
{
"page_content": "---\nsidebar_position: 0\n---\n# Document loaders...",
"metadata": {"source": "../docs/docs/modules/data_connection/document_loaders/index.md"}
}
]
逗号分隔值(CSV)文件是常见的数据格式。每一行代表一条记录,字段由逗号分隔。
默认情况下,CSVLoader 会将每一行作为一个独立的文档加载。
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path="./example_data/mlb_teams_2012.csv")
data = loader.load()
每个文档的 page_content 会包含该行的所有字段信息,metadata 中包含源文件路径和行号。
如果 CSV 文件格式特殊(如使用分号分隔,或包含引号),可以通过 csv_args 参数进行配置。
loader = CSVLoader(
file_path="./example_data/mlb_teams_2012.csv",
csv_args={
'delimiter': ',',
'quotechar': '"',
'fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']
}
)
data = loader.load()
在使用链式调用回答问题时,源信息非常重要。可以使用 source_column 参数指定哪一列作为文档的来源标识。
loader = CSVLoader(
file_path="./example_data/mlb_teams_2012.csv",
source_column="Team"
)
data = loader.load()
当需要处理整个文件夹下的多个文档时,DirectoryLoader 非常有用。它可以递归遍历目录并加载匹配的文件。
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader('../', glob="**/*.md")
docs = loader.load()
通过 glob 参数可以控制加载的文件类型(例如只加载 .md 文件)。
为了监控加载过程,可以安装 tqdm 库并启用进度条。
import tqdm
loader = DirectoryLoader('../', glob='**/*.md', show_progress=True)
docs = loader.load()
默认加载是单线程的。对于大量文件,开启多线程可显著提升速度。
loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
docs = loader.load()
默认可能使用 UnstructuredLoader,但也可以显式指定其他加载器类,如 TextLoader 或 PythonLoader。
from langchain_community.document_loaders import PythonLoader
loader = DirectoryLoader('../../../../../', glob="**/*.py", loader_cls=PythonLoader)
docs = loader.load()
如果目录中存在编码不一致的文件(如非 UTF-8),默认行为可能导致整个加载失败。可以通过以下方式优化:
silent_errors=True。TextLoader 自动检测。# 方案 1:跳过错误
text_loader_kwargs={'autodetect_encoding': True}
loader = DirectoryLoader(
path,
glob="**/*.txt",
loader_cls=TextLoader,
silent_errors=True,
loader_kwargs=text_loader_kwargs
)
docs = loader.load()
加载网页内容通常有两种方式:
from langchain_community.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("example_data/fake-content.html")
data = loader.load()
JSON 是常用的数据交换格式。JSONLoader 支持使用 jq 模式来提取特定字段。
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path='./example_data/facebook_chat.json',
jq_schema='.messages[].content',
text_content=False
)
data = loader.load()
对于 JSON Lines (.jsonl) 文件,需设置 json_lines=True。
loader = JSONLoader(
file_path='./example_data/facebook_chat_messages.jsonl',
jq_schema='.content',
json_lines=True
)
data = loader.load()
Markdown 文件广泛用于技术文档。UnstructuredMarkdownLoader 可以很好地解析标题、列表等元素。
from langchain_community.document_loaders import UnstructuredMarkdownLoader
markdown_path = "../../../../../README.md"
loader = UnstructuredMarkdownLoader(markdown_path)
data = loader.load()
若希望保持不同文本块(如标题、段落)的分离,可设置 mode="elements"。
PDF 加载有多种后端选择,适用于不同场景:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split() # 按页分割
对于远程 PDF 文件,可使用 OnlinePDFLoader。
在实际开发 RAG 应用时,仅加载文档是不够的,还需要注意以下几点:
加载后的文档通常较长,直接送入向量数据库会导致上下文窗口溢出或检索精度下降。建议在加载后结合 RecursiveCharacterTextSplitter 进行切片。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = splitter.split_documents(docs)
加载外部 URL 或用户上传的文件时,务必验证来源合法性,防止恶意代码执行或敏感信息泄露。避免直接加载未受信任的远程脚本或二进制文件。
use_multithreading 提升批量加载效率。充分利用 metadata 字段存储来源、时间戳、版本等信息,这有助于后续的数据溯源、权限控制和增量更新。
本文详细介绍了 LangChain 中提供的各类文本加载器,包括 TXT、CSV、PDF、Markdown、HTML、JSON 等格式的基本用法和使用场景。这些加载器最终都将数据统一转换为 Document 对象,便于后续的向量化处理和检索。
构建 LLM 应用的标准流程通常为:
掌握这些基础组件,是构建高质量企业级 AI 应用的关键第一步。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online