Akemi

Langchain模块DataCollection组件-文件加载器loader

2025/12/05

为了llm应用获取外部数据,langchain提供了加载、转换、存储和查询数据的功能

  • 文档加载器:加载不同来源的文档
  • 文档转换器:拆分文档,将文档转换成问答格式、删除冗余文档
  • 文本嵌入模型Embed:将非结构化文本转换为向量
  • 向量存储:存储和搜索嵌入的数据
  • 检索器:查询数据

文档加载器load

  • csv、html、json、pdf文档加载
  • 加载同一目录下多文档
  • 第三方数据源组件

加载csv文档

csv是一种使用逗号来分隔值的文本文件

csv文件加载器允许定制csv解析和加载,可以通过csv_args参数来设置,比如设定分隔符、引用字符和字段名等(跟awk差不多

1
2
3
4
5
6
7
8
9
10
11
12
电影名称,上映年份,导演,主演,评分
肖申克的救赎,1994,弗兰克·德拉邦特,蒂姆·罗宾斯,9.3
阿甘正传,1994,罗伯特·泽米吉斯,汤姆·汉克斯,9.5
盗梦空间,2010,克里斯托弗·诺兰,莱昂纳多·迪卡普里奥,9.3
泰坦尼克号,1997,詹姆斯·卡梅隆,莱昂纳多·迪卡普里奥,9.2
星际穿越,2014,克里斯托弗·诺兰,马修·麦康纳,9.2

from langchain.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path="./example.csv")
print(loader.load())

# [Document(metadata={'source': './example.csv', 'row': 0}, page_content='电影名称: 肖申克的救赎\n上映年份: 1994\n导演: 弗兰克·德拉邦特\n主演: 蒂姆·罗宾斯\n评分: 9.3'), Document(metadata={'source': './example.csv', 'row': 1}, page_content='电影名称: 阿甘正传\n上映年份: 1994\n导演: 罗伯特·泽米吉斯\n主演: 汤姆·汉克斯\n评分: 9.5'), Document(metadata={'source': './example.csv', 'row': 2}, page_content='电影名称: 盗梦空间\n上映年份: 2010\n导演: 克里斯托弗·诺兰\n主演: 莱昂纳多·迪卡普里奥\n评分: 9.3'), Document(metadata={'source': './example.csv', 'row': 3}, page_content='电影名称: 泰坦尼克号\n上映年份: 1997\n导演: 詹姆斯·卡梅隆\n主演: 莱昂纳多·迪卡普里奥\n评分: 9.2'), Document(metadata={'source': './example.csv', 'row': 4}, page_content='电影名称: 星际穿越\n上映年份: 2014\n导演: 克里斯托弗·诺兰\n主演: 马修·麦康纳\n评分: 9.2')]

加载目录下文件

directoryLoader类可以加载一个目录下的所有文件,langchain的document_loaders提供了数量众多的文件解析器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from langchain.document_loaders import DirectoryLoader,TextLoader,PythonLoader,UnstructuredMarkdownLoader,UnstructuredHTMLLoader

loader = DirectoryLoader(
path='./langchain源代码', # 选择目录
glob="**/*.md", # 加载所有的md结尾的文件
# loader_cls=TextLoader # 使用TextLoader为解析器
# loader_cls=PythonLoader, # 使用PythonLoader为解析器
# loader_cls=UnstructuredHTMLLoader, # 使用html的解析器
loader_cls=UnstructuredMarkdownLoader, # 使用md的解析器
show_progress=True, # 显示加载进度
use_multithreading=True # 启用多线程
)

docs = loader.load()

for doc in docs:
print(doc.metadata)

# 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 36/43 [00:03<00:00, 9.41it/s]
# {'source': 'langchain源代码/MIGRATE.md'}
# {'source': 'langchain源代码/AGENTS.md'}
# {'source': 'langchain源代码/CLAUDE.md'}
# {'source': 'langchain源代码/SECURITY.md'}
# {'source': 'langchain源代码/libs/README.md'}
# {'source': 'langchain源代码/libs/cli/README.md'}
# {'source': 'langchain源代码/libs/cli/DOCS.md'}
# {'source': 'langchain源代码/lib

json文件加载

JSONLoader使用jq模式从JSON文件中解析数据,可以解析json文件或json行文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from langchain.document_loaders import JSONLoader

# 加载json文件(使用jq解析特定字段下的信息
loader = JSONLoader(
file_path='data_example.json',
jq_schema='.messages[].content'
)

# 加载json行文件
loader = JSONLoader(
file_path='data_example.json',
jq_schema='.content',
json_lines=True
)

# 提取元数据
def metadata_fun(record: dict,metadata: dict) ->dict:
# 将json中的信息映射到文档的元数据中
metadata["title"] = record.get("title")
metadata["genres"] = record.get("genres")
return metadata

loader = JSONLoader(
file_path='data_example.json',
jq_schema=".notable_films[]",
content_key="genres", # 哪个字段应该成为文档的文本内容
text_content=False, # 告诉JSONLoader不要期望字符串
metadata_func=metadata_fun
)
data = loader.load()

for doc in data:
print(doc.metadata)


# {'source': '/root/python-langchain/data_example.json', 'seq_num': 1, 'title': '低俗小说', 'genres': ['犯罪', '黑色幽默', '剧情']}
# {'source': '/root/python-langchain/data_example.json', 'seq_num': 2, 'title': '被解救的姜戈', 'genres': ['西部', '剧情', '动作']}
# {'source': '/root/python-langchain/data_example.json', 'seq_num': 3, 'title': '无耻混蛋', 'genres': ['战争', '剧情', '黑色幽默']}

pdf文件加载

PyPDF可以用来加载PDF文件并转换为文档数组,文档数组包含并通过embed将其转换为文档数组

然后使用embedding进行向量化,并存储到向量数据库。

可选的加载器有:
PyPDFLoader(适用表格类的pdf)
UnstructuredPDFLoader(使用扫描类的pdf)

如果使用UnstructuredPDFLoader则推荐安装全套组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
pip install "unstructured[pdf,ocr]" 
pip install pdfminer.six pi-heif pillow pillow-heif
yum install -y tesseract poppler-utils

from langchain.document_loaders import PyPDFLoader # 使用纯文本(非扫描件
from langchain.document_loaders import UnstructuredPDFLoader
from dotenv import load_dotenv

# embeddings = HuggingFaceEmbeddings(
# model_name="sentence-transformers/all-mpnet-base-v2",
# # sentence-transformers/all-mpnet-base-v2 或 sentence-transformers/all-MiniLM-L6-v2
# model_kwargs={'device': 'cpu'}
# )

# faiss_index = FAISS.from_documents(pages,embeddings)

# docs = faiss_index.similarity_search("机票的使用者是谁?",k=1)

# for doc in docs:
# print(str(doc.metadata["page"]) + doc.page_content)

loader = UnstructuredPDFLoader("./data_example.pdf",
mode="elements", # 选择返回数组
strategy="hi_res" # 高保真
)
data = loader.load()
print(data)

# [Document(metadata={'source': './data_example.pdf', 'coordinates': {'points': ((np.float64(740.1666666666666), np.float64(74.83333333333333)), (np.float64(740.1666666666666), np.float64(232.30555555555554)),
CATALOG
  1. 1. 文档加载器load
    1. 1.1. 加载csv文档
    2. 1.2. 加载目录下文件
    3. 1.3. json文件加载
    4. 1.4. pdf文件加载