langchain(学习)--文档加载器
1. 核心概念
文档加载器是 LangChain 框架中的一个关键组件。它的核心功能是:
- 加载数据:从各种来源(如文件系统、数据库、网页、API等)读取原始数据。
- 结构化处理:将加载的原始数据(如文本文件、PDF、网页内容)转化为 LangChain 能够处理的统一格式——通常是一个或多个
Document对象。 Document对象:这是一个包含以下核心字段的结构:page_content: 存储文档的实际文本内容(字符串)。metadata: 存储与文档相关的元数据(字典),如来源路径、作者、创建日期等。
2. 主要类型
LangChain 提供了极其丰富的文档加载器,支持从各种来源加载数据。以下是一些常见的类型:
(1) 文件系统加载器
TextLoader: 加载纯文本文件 (.txt).
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loder=TextLoader("./data/hello.txt",encoding="utf-8")
documents=loder.load()
介绍一个文本分割器:(RecursiveCharacterTextSplitter)
splitter=RecursiveCharacterTextSplitter(
chunk_size=20, #分段长度
chunk_overlap=10, #分段允许重叠的长度
separators=["。","?","!",".",","], #文本分段依据
length_function=len #指定文本分割函数(len内置函数用于统计字符数)
)
split_docs=splitter.split_documents(documents)
#函数最后返回的时doucument类
CSVLoader: 加载 CSV 文件。可以指定列名,将每一行视为一个Document,或将整个文件视为一个Document。from langchain_community.document_loaders import CSVLoader loder=CSVLoader( file_path="./data/例子.csv" csv_args={ "delimiter": "," #配置:默认分隔符是英文逗号 "quotechar": '"' #指定带有分割符文本的引号包围是单引号还是双引号,"唱跳,rap"这样逗号就不会被识别为分隔符 "fieldnames":["姓名","年龄","爱好"] #指定csv文件的字段名(表头)---如果数据有表头就不要添加该属性 }, encoding="utf-8" } # 批量加载 documents=loder.load() for doc in documents: print(doc.page_content) # #懒加载 for doc in loder.lazy_load(): print(doc.page_content)下面是css的例子:我的css中是有表头的,所以可以不需要fieldnames,上述只是用于讲解详细添加的。
id,name, happy 1001,赵丽颖,"唱跳,rap" 1002,冯绍峰,"唱跳,rap" 1003,王一博,"唱跳,rap" 1004,谢娜,"唱跳,rap" 1005,倪妮,"唱跳,rap" 1006,肖战,"唱跳,rap"两个直接使用的结果就是在识别时你的字段名也会被识别为属性值:(例如)
姓名: id
性别: name
爱好: happy
JSONLoader: 加载 JSON 文件。需要指定jq_schema来提取文本内容(如.content)和元数据。
from langchain_community.document_loaders import JSONLoader
loder=JSONLoader(
file_path="./data/stu.json",
jq_schema="." ,#指定json文件的字段名,
# .为抽取全部,但是抽取出来的是dict所以需要转换为string否则回报错
# .name 意味抽取name字段
text_content=False,
)
loder1=JSONLoader(
file_path="./data/stus.json",
jq_schema=".[].name" ,
# []代表数组,[0]代表数组的第一个元素
text_content=False,
)
loder_JsonLines=JSONLoader(
file_path="./data/stu_json_lines.json",
jq_schema=".name" ,
text_content=False,
json_lines=True,# 指定为json_lines格式(每一行都是独立的标准JSON)
)
#load全加载
documents=loder_JsonLines.load()
print(documents)
stu.json
{
"name": "周杰伦",
"age": 18,
"sex": "男",
"hobby": [ "听歌", "看电影"],
"info": {
"address": "上海",
"phone": "123456789"
}
}
stu_json_lines.json
{ "name": "周杰伦", "age": 18, "sex": "男"}
{ "name": "王力宏", "age": 19, "sex": "男"}
{ "name": "张学友", "age": 20, "sex": "男"}
stus.json
[
{"name": "周杰伦", "age": 18},
{"name": "王力宏", "age": 19},
{"name": "张学友", "age": 20}
]
PDFMinerLoader/PyPDFLoader/UnstructuredPDFLoader: 加载 PDF 文件。注意:PDF 解析复杂,效果取决于 PDF 本身(文本型 PDF vs 扫描图片型 PDF)。这些加载器尝试提取文本。from langchain_community.document_loaders import PyPDFLoader loader=PyPDFLoader( file_path="./data/java手册.pdf", mode= 'page' )
关键参数说明:
-
file_path: PDF 文件路径
-
mode: 提取模式"single": 整个文档作为一个文档对象"page": 每一页作为独立的文档对象 )
-
extraction_mode: 文本提取模式"plain": 传统方式,简单提取文本"layout": 保留 PDF 布局格式,更精确
-
password: 加密 PDF 的密码 ⚠️(当前为空,如果 PDF 没有密码可以删除或设为 None)
-
extract_images: 是否提取图片(默认 False)
-
pages_delimiter: 在 single 模式下分隔页面的字符串
(2) 网页加载器
WebBaseLoader: 加载网页的 HTML 内容,并提取其中的文本。from langchain_community.document_loaders import WebBaseLoader loader = WebBaseLoader( web_paths=["https://www.thepaper.cn/newsDetail_forward_5074332"], ) document = loader.load()[0] print(document.page_content)AsyncHtmlLoader: 异步版本,用于批量加载多个网页。NewsURLLoader: 专门用于加载新闻文章 URL。
(3) 数据库加载器
FaissLoader: 从 Faiss 向量存储中加载文档(通常与检索器一起使用)。SingleStoreDBLoader: 从 SingleStore 数据库中加载。
(4) 其他来源加载器
NotionDirectoryLoader: 加载导出的 Notion 工作空间目录。GoogleDriveLoader: 从 Google Drive 加载文件(需要认证)。GitHubLoader: 加载 GitHub 仓库的文件或 Issues。YouTubeAudioLoader: 加载 YouTube 视频的音频,并转录为文本(需要语音识别库)。
3. 关键作用
文档加载器在 LangChain 的文档处理流程中扮演着起始点的角色:
- 数据接入:它们提供了标准化的接口,将来自五花八门来源的数据统一转化为
Document格式。 - 下游处理的基础:生成的
Document对象可以直接传递给:- 文本分割器 (Text Splitters):将长文档拆分成更小的片段(如段落、句子),便于嵌入或模型处理。
- 向量存储 (Vector Stores):将文档片段转换为向量并存储,用于后续的检索。
- 语言模型 (LLMs):作为模型的输入上下文。
4. 使用要点
- 选择合适的加载器:根据你的数据源类型(文件格式、数据库、网页等)选择对应的加载器。
- 处理元数据:加载器通常会尝试捕获源文件的元信息(文件名、URL、最后修改时间等),这些信息对后续处理(如检索结果的来源标注)很有价值。
- 错误处理:文件加载可能出错(如文件不存在、格式解析失败),代码中需要考虑异常处理。
- 性能考量:对于大量数据或网络请求,考虑异步加载器或批量处理。
总结
文档加载器是 LangChain 生态中连接原始数据与高级处理(如嵌入、检索、问答)的桥梁。它们负责将异构数据源标准化为 Document 对象,为后续的文档切分、信息检索和语言模型交互提供基础输入。理解并熟练使用各种文档加载器是构建 LangChain 应用的重要一步。
更多推荐


所有评论(0)