第七讲 | RAG文档加载:PDF/TXT/JSON/CSV多种文档读取
一、前言
RAG知识库的数据来源是各类本地文件,不同格式文档需要对应的加载工具。LangChain集成了丰富的文档加载器,本讲实战演示TextLoader、PyPDFLoader、JsonLoader、CSVLoader,实现文本、PDF、结构化数据的读取,掌握文档载入、文档对象基础处理方式,完成RAG第一步数据源接入。
二、Document Loaders文档加载器
文档加载器提供了一套标准接口,用于将不同来源(如CSV、PDF、或JSON等)的数据读取为LangChain的文档格式。这确保了无论数据来源如何,都能对其进行一致性处理。
文档加载器(内置或自行实现)需实现BaseLoader接口。
Class Document,是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():延迟流式传输文档,对大型数据集很有用,避免内存溢出
三、TextLoader
作用:读取文本文件(如.txt),将全部内容放入一个Document对象中。
from langchain_community.document_loaders import TextLoader
loader = TextLoader(
"xxx.txt",
encoding="utf-8",
)
docs = loader.load()
print(docs)
print(len(docs)) # 结果为1
RecursiveCharacterTextSplitter,递归字符文本分割器,主要用于按自然段落分割大文档。
是LangChain官方推荐的默认字符分割器。
它在保持上下文完整性和控制片段大小之间实现了良好平衡。
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = TextLoader(
"../P3_LangChainRAG开发/data/Python基础语法.txt",
encoding="utf-8",
)
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 分段的最大字符数
chunk_overlap=50, # 分段之间允许重叠的字符数
# 文本分段依据
separators=["\n\n", "\n", "。", "!", "?", ".", "!", "?", " ", ""],
# 字符统计依据(函数)
length_function=len,
)
split_docs = splitter.split_documents(docs)
四、PyPDFLoader
PyPDFLoader加载器,依赖PyPDF库,所以我们需要安装它:pip install pypdf
PyPDFLoader使用还是比较简单的,如下代码即可快速加载PDF中的文字内容了:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
file_path="", # 文件路径必填
mode='page', # 读取模式,可选page(按页面划分不同Document)和single(单个Document)
password='password', # 文件密码
)
五、JsonLoader
JSONLoader用于将JSON数据加载为Document类型对象。
使用JSONLoader需要额外安装:pip install jq
jq是一个跨平台的json解析工具,LangChain底层对JSON的解析就是基于jq工具实现的。将JSON数据的信息抽取出来,封装为Document对象,抽取的时候依赖jq_schema语法。
{
"name":"周杰伦",
"age": 11,
"hobby": ["唱", "跳", "RAP"],
"other": {
"addr": "深圳",
"tel": "12333546156"
}
}
-.表示整个JSON对象(根)
-[]表示数组
-.name表示抽取周杰伦
-.hobby表示抽取爱好数组
-.hobby[1]或.hobby.[1]表示抽取跳
-.other.addr表示抽取地址深圳
[
{"name": "小明", "age": 11, "gender": "男"},
{"name": "小红", "age": 11, "gender": "女"},
{"name": "小亮", "age": 12, "gender": "男"}
]
-.[].得到3个字典
-.[],name表示抽取全部的name,即得到3个name信息
了解了jq的基本抽取规则后,即可使用JSONLoader加载JSON文件了。
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="xxx.json", # 文件路径
jq_schema=".", # jq schema语法
text_content=False, # 抽取的是否是字符串,默认True
json_lines=True, # 是否是JsonLines文件(每一行都是JSON的文件)
)
document = loader.load()
如下是一个典型的JsonLines文件:
{"name": "小明", "age": 11, "gender": "男"}
{"name": "小红", "age": 11, "gender": "女"}
{"name": "小亮", "age": 12, "gender": "男"}
六、CSVLoader
CSVLoader的使用示例如下:
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(
file_path="xxx.csv",
csv_args={
"delimiter": ",", # 指定分隔符
"quotechar": '"', # 指定带有分隔符文本的引号包围是单引号还是双引号
# 如果数据原本有表头,就不要下面的代码,如果没有可以使用
"fieldnames": ['name', 'age', 'gender']
},
encoding="utf-8" # 指定编码
)
七、结语
本讲完成RAG系统的数据源接入,掌握txt、pdf、json、csv多种文档加载方式。理解LangChain文档对象结构、文档读取逻辑,解决了知识库数据如何进入RAG系统的核心问题,为向量化存储与检索做好准备。
更多推荐

所有评论(0)