一、前言

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系统的核心问题,为向量化存储与检索做好准备。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐