文档加载器 API
BaseLoader 与文档加载
概述
文档加载器负责从各种数据源加载文档内容,转换为 LangChain 可使用的 Document 对象。
graph TD
A[BaseLoader] --> B[TextLoader]
A --> C[PyPDFLoader]
A --> D[WebBaseLoader]
A --> E[DirectoryLoader]
A --> F[JSONLoader]
B --> G[Document]
C --> G
D --> G
E --> G
F --> G
style A fill:#e1f5fe
style G fill:#c8e6c9
基类
BaseLoader
所有文档加载器的抽象基类。
from langchain_core.document_loaders import BaseLoader
class BaseLoader(ABC):
"""文档加载器基类"""
@abstractmethod
def load(self) -> List[Document]:
"""
加载文档
Returns:
Document 对象列表
"""
def load_and_split(
self,
text_splitter: Optional[TextSplitter] = None,
) -> List[Document]:
"""
加载并分割文档
Args:
text_splitter: 文本分割器
Returns:
分割后的 Document 列表
"""
async def aload(self) -> List[Document]:
"""异步加载文档"""
return await asyncio.to_thread(self.load)
def lazy_load(self) -> Iterator[Document]:
"""
懒加载文档
Yields:
Document 对象
"""
async def alazy_load(self) -> AsyncIterator[Document]:
"""
异步懒加载
Yields:
Document 对象
"""
Document
文档对象。
from langchain_core.documents import Document
class Document(Serializable):
"""文档对象"""
page_content: str
"""文档内容"""
metadata: Dict[str, Any] = {}
"""元数据字典"""
type: Literal["Document"] = "Document"
"""类型标识"""
def __init__(
self,
page_content: str,
metadata: Optional[Dict[str, Any]] = None,
**kwargs: Any,
):
"""
初始化文档
Args:
page_content: 文档内容
metadata: 元数据
**kwargs: 额外参数
"""
def to_json(self) -> str:
"""转换为 JSON"""
@classmethod
def from_json(cls, json_str: str) -> "Document":
"""从 JSON 创建文档"""
常用加载器
TextLoader
加载文本文件。
from langchain_community.document_loaders import TextLoader
class TextLoader(BaseLoader):
"""文本文件加载器"""
def __init__(
self,
file_path: str,
encoding: Optional[str] = None,
autodetect_encoding: bool = False,
):
"""
初始化
Args:
file_path: 文件路径
encoding: 文件编码
autodetect_encoding: 是否自动检测编码
"""
def load(self) -> List[Document]:
"""加载文本文件"""
使用示例
python
from langchain_community.document_loaders import TextLoader
# 加载单个文件
loader = TextLoader("example.txt")
documents = loader.load()
# 自动检测编码
loader = TextLoader("example.txt", autodetect_encoding=True)
# 指定编码
loader = TextLoader("example.txt", encoding="utf-8")
PyPDFLoader
加载 PDF 文件。
from langchain_community.document_loaders import PyPDFLoader
class PyPDFLoader(BaseLoader):
"""PDF 文件加载器"""
def __init__(
self,
file_path: str,
password: Optional[str] = None,
extract_images: bool = False,
):
"""
初始化
Args:
file_path: PDF 文件路径
password: PDF 密码(如有)
extract_images: 是否提取图片
"""
def load(self) -> List[Document]:
"""加载 PDF(每页一个 Document)"""
使用示例
python
from langchain_community.document_loaders import PyPDFLoader
# 基础使用
loader = PyPDFLoader("document.pdf")
pages = loader.load()
# 带密码
loader = PyPDFLoader("document.pdf", password="secret")
# 提取图片
loader = PyPDFLoader("document.pdf", extract_images=True)
# 查看页数
print(f"总页数: {len(pages)}")
print(f"第一页: {pages[0].page_content[:100]}")
WebBaseLoader
加载网页内容。
from langchain_community.document_loaders import WebBaseLoader
class WebBaseLoader(BaseLoader):
"""网页加载器"""
def __init__(
self,
web_path: Union[str, List[str]],
header_template: Optional[Dict[str, str]] = None,
verify_ssl: bool = True,
requests_per_second: Optional[int] = None,
continue_on_failure: bool = False,
):
"""
初始化
Args:
web_path: URL 或 URL 列表
header_template: HTTP 请求头
verify_ssl: 是否验证 SSL
requests_per_second: 请求速率限制
continue_on_failure: 失败时是否继续
"""
def load(self) -> List[Document]:
"""加载网页"""
使用示例
python
from langchain_community.document_loaders import WebBaseLoader
# 加载单个网页
loader = WebBaseLoader("https://example.com")
document = loader.load()
# 加载多个网页
urls = [
"https://example.com/page1",
"https://example.com/page2"
]
loader = WebBaseLoader(urls)
documents = loader.load()
# 自定义请求头
loader = WebBaseLoader(
"https://example.com",
header_template={
"User-Agent": "Mozilla/5.0",
"Authorization": "Bearer token"
}
)
# 使用 BeautifulSoup 选择器
from bs4 import SoupStrainer
loader = WebBaseLoader(
"https://example.com",
bs_kwargs={
"parse_only": SoupStrainer(["p", "h1", "h2"])
}
)
DirectoryLoader
加载目录下的所有文件。
from langchain_community.document_loaders import DirectoryLoader
class DirectoryLoader(BaseLoader):
"""目录加载器"""
def __init__(
self,
path: str,
glob: str = "**/[!.]*",
silent_errors: bool = False,
load_hidden: bool = False,
loader_cls: LoaderType = TextLoader,
loader_kwargs: Optional[Dict[str, Any]] = None,
recursive: bool = False,
show_progress: bool = False,
use_multithreading: bool = False,
max_concurrency: int = 4,
):
"""
初始化
Args:
path: 目录路径
glob: 文件匹配模式
silent_errors: 是否忽略错误
load_hidden: 是否加载隐藏文件
loader_cls: 使用的加载器类
loader_kwargs: 传递给加载器的参数
recursive: 是否递归加载
show_progress: 是否显示进度
use_multithreading: 是否使用多线程
max_concurrency: 最大并发数
"""
def load(self) -> List[Document]:
"""加载目录中的所有文件"""
使用示例
python
from langchain_community.document_loaders import DirectoryLoader, TextLoader
# 加载所有文本文件
loader = DirectoryLoader(
"./data",
glob="**/*.txt",
loader_cls=TextLoader
)
documents = loader.load()
# 加载 PDF 文件
from langchain_community.document_loaders import PyPDFLoader
loader = DirectoryLoader(
"./documents",
glob="**/*.pdf",
loader_cls=PyPDFLoader
)
# 递归加载
loader = DirectoryLoader(
"./data",
glob="**/*.txt",
recursive=True
)
# 使用多线程
loader = DirectoryLoader(
"./data",
glob="**/*.txt",
use_multithreading=True,
max_concurrency=8,
show_progress=True
)
JSONLoader
加载 JSON 文件。
from langchain_community.document_loaders import JSONLoader
class JSONLoader(BaseLoader):
"""JSON 文件加载器"""
def __init__(
self,
file_path: str,
jq_schema: Optional[str] = None,
content_key: Optional[str] = None,
metadata_func: Optional[Callable[[Dict, Dict], Dict]] = None,
text_content: bool = True,
json_lines: bool = false,
):
"""
初始化
Args:
file_path: JSON 文件路径
jq_schema: jq 表达式(用于选择数据)
content_key: 内容字段名
metadata_func: 元数据生成函数
text_content: 是否提取文本内容
json_lines: 是否为 JSON Lines 格式
"""
def load(self) -> List[Document]:
"""加载 JSON 文件"""
使用示例
python
from langchain_community.document_loaders import JSONLoader
# 加载 JSON 数组
loader = JSONLoader(
file_path="data.json",
jq_schema=".[]", # 展开数组
text_content=False # 保留 JSON 结构
)
# 提取特定字段
loader = JSONLoader(
file_path="data.json",
jq_schema=".[] | {title, content}",
content_key="content"
)
# 自定义元数据
def metadata_func(record: dict, metadata: dict) -> dict:
metadata["title"] = record.get("title")
metadata["date"] = record.get("date")
return metadata
loader = JSONLoader(
file_path="data.json",
jq_schema=".[]",
metadata_func=metadata_func
)
其他常用加载器
CSVLoader
python
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
file_path="data.csv",
csv_args={
"delimiter": ",",
"quotechar": '"',
"fieldnames": ["col1", "col2", "col3"]
}
)
MarkdownLoader
python
from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader("README.md")
YouTubeLoader
python
from langchain_community.document_loaders import YoutubeLoader
loader = YoutubeLoader.from_youtube_url(
"https://www.youtube.com/watch?v=xxx",
add_video_info=True,
language=["en", "zh"],
translation="en"
)
使用示例
python
# ========== 示例1: 加载文本文件 ==========
from langchain_community.document_loaders import TextLoader
loader = TextLoader("example.txt")
docs = loader.load()
print(f"内容: {docs[0].page_content}")
print(f"元数据: {docs[0].metadata}")
# ========== 示例2: 加载 PDF ==========
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("document.pdf")
pages = loader.load()
for i, page in enumerate(pages):
print(f"页码: {page.metadata.get('page')}")
print(f"内容: {page.page_content[:100]}")
# ========== 示例3: 加载目录 ==========
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader(
"./documents",
glob="**/*.txt",
show_progress=True
)
docs = loader.load()
# ========== 示例4: 加载并分割 ==========
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = TextLoader("large_document.txt")
docs = loader.load_and_split(
text_splitter=RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
)
# ========== 示例5: 加载网页 ==========
from langchain_community.document_loaders import WebBaseLoader
urls = [
"https://example.com/article1",
"https://example.com/article2"
]
loader = WebBaseLoader(urls)
docs = loader.load()
# ========== 示例6: 异步加载 ==========
import asyncio
async def load_documents():
loader = TextLoader("example.txt")
docs = await loader.aload()
return docs
docs = asyncio.run(load_documents())
# ========== 示例7: 懒加载(大文件)==========
def process_large_file():
loader = TextLoader("huge_file.txt")
for doc in loader.lazy_load():
# 逐块处理
process_chunk(doc.page_content)
# ========== 示例8: 自定义加载器 ==========
from langchain_core.document_loaders import BaseLoader
class CustomLoader(BaseLoader):
def __init__(self, source: str):
self.source = source
def load(self) -> List[Document]:
# 自定义加载逻辑
with open(self.source) as f:
content = f.read()
return [
Document(
page_content=content,
metadata={"source": self.source}
)
]
loader = CustomLoader("custom.dat")
docs = loader.load()