Documentloaders文檔加載器
文檔加載器提供了一套標(biāo)準(zhǔn)接口,用于將不同來源(如CSV、PDF_或JSON等)的數(shù)據(jù)讀取為L(zhǎng)angChain的文檔格式。這確保了無論數(shù)據(jù)來源如何,都能對(duì)其進(jìn)行一致性處理。
文檔加載器(內(nèi)置或自行實(shí)現(xiàn))需實(shí)現(xiàn)BaseLoader接口。
ClassDocument,是Langchain內(nèi)文檔的統(tǒng)一載體,所有文檔加載器最終返回此類的實(shí)例。
一個(gè)基礎(chǔ)的Document類實(shí)例,基于如下代碼創(chuàng)建:
from langchain_core.documents import Document
document = Document(
page_content="Hello, world!", metadata={"source": "https://example.com"}
)
可以看到,Document類其核心記錄了:
- page_content:文檔內(nèi)容
- metadata:文檔元數(shù)據(jù)(字典)
不同的文檔加載器可能定義了不同的參數(shù),但是其都實(shí)現(xiàn)了統(tǒng)一的接口(方法)。
- load():一次性加載全部文檔
- lazy_load():延遲流式傳輸文檔,對(duì)大型數(shù)據(jù)集很有用,避免內(nèi)存溢出。
一個(gè)簡(jiǎn)單的CsVLoader的使用示例如下:
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(
... # 初始化參數(shù)
)
# 一次性加載全部文檔
documents = loader.load()
# 對(duì)于大數(shù)據(jù)集,分段返回文檔
for document in loader.lazy_load():
print(document)
Langchain內(nèi)置了許多文檔加載器,詳細(xì)參見官方文檔:
https://docs.langchain.com/oss/python/integrations/document_loaders
我們簡(jiǎn)單的學(xué)習(xí)如下幾個(gè)常用的文檔加載器:
- CSVLoader
- JSONLoader
- PDFLoader
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path="./xxx.csv")
data = loader.load()
print(data)
自定義CSV文件的解析和加載
# 導(dǎo)入CSVLoader類,用于加載CSV文件
from langchain_community.document_loaders.csv_loader import CSVLoader
# 初始化CSVLoader,指定文件路徑和CSV解析參數(shù)
loader = CSVLoader(
file_path="./xxx.csv", # CSV文件的路徑
csv_args={
"delimiter": ",", # 指定字段分隔符為逗號(hào)
"quotechar": '"', # 指定字符串的引號(hào)包裹字符
"fieldnames": ["name", "age", "gender"], # 指定CSV文件的字段名(無表頭時(shí)使用,有表頭則首行作為數(shù)據(jù))
},
)
# 加載CSV文件中的數(shù)據(jù)
data = loader.load()
# 打印加載的數(shù)據(jù)
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"
孫悅?cè)?27,女,"吃飯,rap"
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
"./data/stu.csv", # CSV文件路徑
csv_args={
"delimiter": ",", # 字段分隔符
"quotechar": '"', #指定帶有分隔符文本的引號(hào)包圍是單引號(hào)還是雙引號(hào)
#如果數(shù)據(jù)原本有表頭,就不要下面的代碼,如果沒有可以使用
"fieldnames": ["name", "age", "gender", "hobby"], # 字段名列表
},
# 其他參數(shù)...
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: 孫悅?cè)?age: 27
gender: 女,"吃飯,rap"
hobby: None' metadata={'source': './data/stu.csv', 'row': 10}