Documentloaders文档加载器
文档加载器提供了一套标准接口,用于将不同来源(如CSV、PDF_或JSON等)的数据读取为LangChain的文档格式。这确保了无论数据来源如何,都能对其进行一致性处理。
文档加载器(内置或自行实现)需实现BaseLoader接口。
ClassDocument,是Langchain内文档的统一载体,所有文档加载器最终返回此类的实例。
一个基础的Document类实例,基于如下代码创建:
from langchain_core.documents import Document
document = Document(
page_content="Hello, world!", metadata={"source": "https://example.com"}
)
可以看到,Document类其核心记录了:
- page_content:文档内容
- metadata:文档元数据(字典)
不同的文档加载器可能定义了不同的参数,但是其都实现了统一的接口(方法)。
- load():一次性加载全部文档
- lazy_load():延迟流式传输文档,对大型数据集很有用,避免内存溢出。
一个简单的CsVLoader的使用示例如下:
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(
... # 初始化参数
)
# 一次性加载全部文档
documents = loader.load()
# 对于大数据集,分段返回文档
for document in loader.lazy_load():
print(document)
Langchain内置了许多文档加载器,详细参见官方文档:
https://docs.langchain.com/oss/python/integrations/document_loaders
我们简单的学习如下几个常用的文档加载器:
- CSVLoader
- JSONLoader
- PDFLoader
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path="./xxx.csv")
data = loader.load()
print(data)
自定义CSV文件的解析和加载
# 导入CSVLoader类,用于加载CSV文件
from langchain_community.document_loaders.csv_loader import CSVLoader
# 初始化CSVLoader,指定文件路径和CSV解析参数
loader = CSVLoader(
file_path="./xxx.csv", # CSV文件的路径
csv_args={
"delimiter": ",", # 指定字段分隔符为逗号
"quotechar": '"', # 指定字符串的引号包裹字符
"fieldnames": ["name", "age", "gender"], # 指定CSV文件的字段名(无表头时使用,有表头则首行作为数据)
},
)
# 加载CSV文件中的数据
data = loader.load()
# 打印加载的数据
print(data)
stu.csv
name,age,gender,hobby
王梓涵,25,男,"吃饭,rap"
刘若曦,22,女,"睡觉,rap"
陈俊宇,20,男,"吃饭,rap"
赵思瑶,28,女,"睡觉,rap"
黄浩然,15,男,"吃饭,rap"
林雨桐,20,女,"唱跳,rap"
周博文,20,男,"吃饭,rap"
吴诗琪,24,女,"吃饭,rap"
马子轩,22,男,"睡觉,rap"
孙悦然,27,女,"吃饭,rap"
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
"./data/stu.csv", # CSV文件路径
csv_args={
"delimiter": ",", # 字段分隔符
"quotechar": '"', #指定带有分隔符文本的引号包围是单引号还是双引号
#如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ["name", "age", "gender", "hobby"], # 字段名列表
},
# 其他参数...
encoding="utf-8", # 编码为utf-8,确保正确读取中文
)
# # 加载文档
# docs = loader.load()
# print(docs)
# 懒加载文档
for document in loader.lazy_load():
print(document)
page_content='name: name
age: age
gender: gender
hobby: hobby' metadata={'source': './data/stu.csv', 'row': 0}
page_content='name: 王梓涵
age: 25
gender: 男,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 1}
page_content='name: 刘若曦
age: 22
gender: 女,"睡觉,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 2}
page_content='name: 陈俊宇
age: 20
gender: 男,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 3}
page_content='name: 赵思瑶
age: 28
gender: 女,"睡觉,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 4}
page_content='name: 黄浩然
age: 15
gender: 男,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 5}
page_content='name: 林雨桐
age: 20
gender: 女,"唱跳,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 6}
page_content='name: 周博文
age: 20
gender: 男,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 7}
page_content='name: 吴诗琪
age: 24
gender: 女,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 8}
page_content='name: 马子轩
age: 22
gender: 男,"睡觉,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 9}
page_content='name: 孙悦然
age: 27
gender: 女,"吃饭,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 10}