Document Loaders 文档加载器
文档加载器是 LangChain 框架中负责从各种来源加载文档数据的组件。它们将不同格式、不同来源的数据统一转换为 LangChain 的 Document 对象,为后续的文本分割、嵌入和检索提供基础。
概述
Document 对象包含两个主要部分:
page_content:文档的文本内容metadata:文档的元数据(如来源、作者、创建时间等)
python
from langchain_core.documents import Document
doc = Document(
page_content="这是文档的文本内容。",
metadata={"source": "example.txt", "author": "张三"}
)安装
文档加载器主要在 langchain-community 包中:
bash
pip install langchain-community常用文档加载器
文本加载器
加载纯文本文件:
python
from langchain_community.document_loaders import TextLoader
loader = TextLoader("path/to/file.txt")
docs = loader.load()
print(docs[0].page_content[:100])CSV 加载器
python
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader("path/to/file.csv")
docs = loader.load()HTML 加载器
python
from langchain_community.document_loaders import HTMLLoader
loader = HTMLLoader("path/to/page.html")
docs = loader.load()PDF 加载器
python
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("path/to/document.pdf")
pages = loader.load()
# pages 是一个列表,每个元素代表 PDF 中的一页
print(f"PDF 共 {len(pages)} 页")
for page in pages:
print(page.metadata)JSON 加载器
python
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="path/to/data.json",
jq_schema=".messages[].content",
text_content=False
)
docs = loader.load()目录加载器(批量加载)
python
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader(
"path/to/directory",
glob="**/*.txt", # 匹配所有 .txt 文件
show_progress=True
)
docs = loader.load()Markdown 加载器
python
from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader("path/to/doc.md")
docs = loader.load()惰性加载(懒加载)
对于大型文档集,可以使用惰性加载来节省内存:
python
loader = TextLoader("large_file.txt")
# 使用 lazy_load() 逐个加载文档
for doc in loader.lazy_load():
print(doc.metadata)
process(doc) # 处理每个文档自定义元数据
可以为加载的文档添加自定义元数据:
python
from langchain_community.document_loaders import TextLoader
loader = TextLoader("file.txt")
# 自动推断的元数据
docs = loader.load()
# 加载后手动添加元数据
for doc in docs:
doc.metadata["category"] = "技术文档"
doc.metadata["language"] = "zh-CN"文档转换
加载文档后,可以使用 langchain_core 的文档转换器进行预处理:
python
from langchain_core.documents import Document
# 合并多个小文档
merged_content = " ".join([doc.page_content for doc in docs])
merged_doc = Document(
page_content=merged_content,
metadata={"type": "merged", "source_count": len(docs)}
)完整示例
python
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_community.document_loaders import PyPDFLoader
# 加载多个 PDF 文件
pdf_loader = DirectoryLoader(
"./docs/",
glob="**/*.pdf",
loader_cls=PyPDFLoader,
show_progress=True
)
pdf_docs = pdf_loader.load()
# 加载文本文件
txt_loader = DirectoryLoader(
"./docs/",
glob="**/*.txt",
loader_cls=TextLoader,
show_progress=True
)
txt_docs = txt_loader.load()
# 合并所有文档
all_docs = pdf_docs + txt_docs
print(f"共加载 {len(all_docs)} 个文档")最佳实践
- 选择合适的加载器:根据文件格式选择对应的加载器
- 使用惰性加载:处理大文件时使用
lazy_load()避免内存溢出 - 善用 DirectoryLoader:批量加载时使用 DirectoryLoader 提高效率
- 保留元数据:充分利用 metadata 保存文档来源信息,便于后续追踪
- 清洗文本:加载后通常需要清洗文本(去除多余空白、特殊字符等)