AI--LangChain文档加载器

AI–LangChain文档加载器

1.文档加载器

  文档加载器提供了一套标准接口,用于将不同来源(CSV PDF JSON等)的数据读取为LangChain的文档格式,这样子确保了无论数据的来源如何,都能对其进行一致性的处理,需要实现BaseLoader接口

  CLass Document是LangChain内文档的统一载体,所有文档加载器最终返回的都是此类的实例,可以看到,Document类核心记录了:

  • page_content:文档内容
  • metadata:文档元数据(字典)
1
2
3
4
5
6
from langchain_core.documents import Document

document = Document(
page_content="Hello, world!",
metadata={"source": "https://example.com"}
)

  不同的文档加载器可能定义了不同的参数,但是其都实现了统一的接口(方法)

  • load():一次性加载全部文档
  • lazy_load():延迟流式传输文档,对大型数据集很有用,能够避免内存溢出
1
2
3
4
5
6
7
8
9
10
11
12
from langchain_community.document_loaders.csv_loader import CSVLoader

loader = CSVLoader(
... # 初始化参数
)

# 一次性加载全部文档
documents = loader.load()

# 对于大数据集,分段返回文档
for document in loader.lazy_load():
print(document)

  LangChain内置了很多的文档加载器,具体详细可以参见官方文档:

1
https://docs.langchain.com/oss/python/integrations/document_loaders

  这里我们仅学习CSV、JSON、PDF等几个常用的文档加载器

  

2.CSVLoader

  自定义CSV文件的解析和加载,上线我们创建一个csv文件,包含如下数据:

  实例调用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain_community.document_loaders.csv_loader import CSVLoader

loader = CSVLoader(
file_path="./AI_Python/data/stu.csv",
csv_args={
"delimiter": "|", # 指定分隔符
"quotechar": "'", # 指定带有分隔符文本的引号是单引号还是双引号
# 字段列表(无表头使用,有表头勿用会读取首行做为数据)
"fieldnames": ["name", "age", "gender", "hobby"],
},
encoding="utf-8"
)

for document in loader.lazy_load():
print(document)

  

3.JSONLoader

  JSONLoader用于将JSON数据加载为Document类型对象,这里需要注意按照JSONLoader需要额外按照下jq工具,因为LangChain底层对JSON的解析就是基于jq根据实现的

1
pip install jq

  现在创建一个json文件,包含如下数据:

  实例调用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(
file_path="./AI_Python/data/stu.json",
jq_schema=".[].name", # .[] 提取数组中每个元素
text_content=False, # 是否将每个JSON对象的内容作为文档的文本内容
#json_lines=True, # 是否每个JSON对象占一行
)

docs = loader.load()
print(docs)
# for document in loader.lazy_load():
# print(document)

  JSONLoader使用jq的解析语法,常见如:

  • .表示根、[]表示数组
  • .name表示从根取name的值
  • .hobby[1]表示取hobby对应数组的第二个元素
  • .[]表示将数组内的每个字典(JSON对象)都取到
  • .[].name表示取数组内每个字典(JSON)对象的name对应的值

  JSONLoader初始化有4个主要参数:

  • file_path:文件路径,必填

  • jq_schema:jq解析语法,必填

  • text_content:抽取到的是否是字符串,默认True,非必填

  • json_lines:是否是JsonLines文件,默认False,非必填

      • JsonLines文件:每一行都是一个独立的字典(Json对象)

  

4.TextLoader

  Text顾名思义就是读取文本文件(如.txt),将全部内容放入到一个Document对象中

1
2
3
4
5
6
7
8
9
10
11
from langchain_community.document_loaders import TextLoader

loader = TextLoader(
file_path="./AI_Python/data/stu.txt",
encoding="utf-8"
)

docs = loader.load()
print(docs[0].page_content)
print("="*20)
print(len(docs)) # 不切割,只有一个文档

  但是当文档较大时,将所有内容都放到一个Document对象中就不太合适了,这里就需要用到递归字符文本分割器–RecursiveCharacterTextSplitter,作为LangChain官方推荐的默认字符分割器,主要用于按自然段落分割大文档,在报仇上下文完整性和控制片段大小之间实现了 良好的平衡

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
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter


loader = TextLoader(
file_path="./AI_Python/data/stu.txt",
encoding="utf-8"
)

docs = loader.load()
# print(docs[0].page_content)
# print("="*20)
# print(len(docs)) # 不切割,只有一个文档

# 切割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100, # 每个文档的最大字符数
chunk_overlap=10, # 每个文档的重叠字符数
length_function=len, # 计算字符数的函数
is_separator_regex=False, # 是否使用正则表达式作为分隔符
)
splits = text_splitter.split_documents(docs)

for split in splits:
print(split.page_content)
print("="*20)

print(len(splits)) # 切割后,多个文档

  

5.PyPDFLoader

  LangChain内支持许多的PDF的加载器,我们选择其中的PyPDFLoader使用,和JSONLoader类似,该加载器依赖于PyPDF库,所以需要提前安装下

1
pip install pypdf

  实例调用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader(
file_path="./AI_Python/data/vpn.pdf",
mode="page" # 默认是page模式,每个页面形成一个Document对象
#mode="single" # 所有页面合并成一个Document对象
#password="123456" # 如果PDF文件有密码,需要指定密码

)

i = 0
for document in loader.lazy_load():
i += 1
print(document)
print("="*20)

AI--LangChain文档加载器
https://one-null-pointer.github.io/2026/01/22/AI --LangChain文档加载器/
Author
liaoyue
Posted on
January 22, 2026
传送口