零基础学AI大模型之RAG系统链路构建:文档切割转换全解析

零基础学AI大模型之RAG系统链路构建:文档切割转换全解析
大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战

前情摘要
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的“幻觉”
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战

本文章目录

零基础学AI大模型之RAG系统链路构建:文档切割转换全解析

大家好,我是工藤学编程 🦉 ,一个专注AI大模型实战的小博主~ 上一篇我们详细拆解了RAG系统的文档加载环节,用PyPDFLoader、WebBaseLoader等工具搞定了PDF、网页、Word等多源数据的加载。但加载后的原始文档往往存在「长度超标」「格式混乱」「信息零散」等问题——500页的法律合同直接喂给模型会超token限制,网页文本混着广告导航栏,产品手册的关键参数散在不同页面……这时候就需要RAG链路中的核心环节:文档切割转换来“提纯”数据。

今天这篇就带大家吃透LangChain中的文档转换器(Document Transformers),从「为什么要做」到「核心参数怎么调」,再到「不同场景实战」,手把手教你做好RAG的数据预处理第一步~

请添加图片描述

一、先搞懂:为啥RAG必须做文档切割转换?

上一篇加载后的文档只是“原始素材”,直接用于向量化和检索会踩3个大坑,这也是文档切割转换的核心价值所在:

核心痛点具体影响解决思路
模型输入token限制GPT-4最大32k tokens、Claude 3最高200k,长文档(如500页合同)直接输入会API报错,或被截断导致信息丢失按模型上下文窗口合理分块,确保每个文本块长度合规
信息密度不均 & 语义断裂关键信息(如合同条款、产品参数)分散在长文本中,粗暴分割会把完整语义(如一个句子、一个功能模块)拆碎按自然语义边界(段落、句子)分割,保留上下文连贯性
格式混乱 & 噪音干扰网页文本含广告/导航栏、代码文档混着Markdown格式、PDF有乱码特殊字符,会降低向量检索精度文本清洗去噪 + 格式标准化,提取纯净有效内容

简单说:文档切割转换的本质是「数据提纯+结构化」——把杂乱的原始文档变成「长度合规、语义完整、无噪音、带上下文元数据」的标准化文本块,为后续向量化和检索筑牢基础。

二、LangChain文档转换器:核心逻辑与核心任务

LangChain中的Document Transformers是处理文档流水线的“数据加工厂”,核心围绕3件事展开,缺一不可:

1. 三大核心任务(直接决定后续检索效果)

核心任务具体操作最终效果
文本分块按「固定长度+语义边界」分割文本(优先用段落、句子分隔符)避免截断完整语义,适配模型token限制
去噪处理移除特殊字符、乱码、HTML标签、广告内容、多余空格提升文本信息密度,减少噪音对向量化的干扰
元数据增强为每个文本块注入来源(如“XX合同第3章”)、页码、时间戳、加载器类型等上下文检索时可追溯信息源头,提高答案可信度

2. 核心组件:TextSplitter抽象类

所有文档切割逻辑都基于langchain_text_splitters.TextSplitter抽象类实现——它定义了分块的核心接口,但不直接实现分割逻辑,需通过子类(如RecursiveCharacterTextSplitterCharacterTextSplitter)按具体策略执行。

先看核心源码结构(关键参数带场景解读):

from langchain_text_splitters import TextSplitter from abc import ABC, abstractmethod from typing import Callable, List, Union classTextSplitter(BaseDocumentTransformer, ABC):"""Interface for splitting text into chunks."""def__init__( self, chunk_size:int=4000,# 文本块最大长度(默认字符数,部分子类支持token数) chunk_overlap:int=200,# 相邻块重叠长度(保留上下文) length_function: Callable[[str],int]=len,# 长度计算函数(默认字符数,可改用token计数) keep_separator: Union[bool, Literal["start","end"]]=False,# 是否保留分隔符(如句号、换行) add_start_index:bool=False,# 是否添加文本块在原始文档中的起始索引 strip_whitespace:bool=True,# 是否去除文本块前后空格)->None:...@abstractmethoddefsplit_text(self, text:str)-> List[str]:"""基础文本分割方法,子类必须实现"""...
关键方法调用链路:split_documents → create_documents → split_text

TextSplitter的三个核心方法各有分工,很多新手会混淆,用表格一次性讲清:

方法输入类型输出类型元数据处理典型使用场景
split_text()单个字符串List[str](纯文本块列表)❌ 不保留仅需分割纯文本(如无格式的TXT文件),无需上下文信息
create_documents()字符串列表 + 可选元数据列表List[Document](文档对象列表)✅ 需手动传递从纯文本构建带元数据的文档(如给网页文本添加“来源URL”元数据)
split_documents()List[Document](加载后的文档对象)List[Document](分割后的文档对象)✅ 自动继承处理已加载的文档(如PyPDFLoader加载的PDF、WebBaseLoader加载的网页),无需手动管元数据

调用逻辑小技巧:实际开发中优先用split_documents()——它会自动继承原始文档的元数据(如PDF的页码、网页的URL),避免后续检索时“找不到信息来源”。

三、核心参数深度解析:调对参数=检索精度翻倍

TextSplitter的3个核心参数(chunk_sizechunk_overlapseparators)直接决定分块质量,新手最容易在这里踩坑,下面结合场景讲透:

1. chunk_size:文本块的“最大长度阈值”

  • 定义:每个文本块的最大长度(默认按「字符数」计算,可通过length_function改为token数)
  • 核心作用:控制文本块大小,既要适配模型上下文窗口,又要保证信息密度
  • 关键技巧
    • 不是越小越好:细粒度分块(如chunk_size=500)能提高检索精准度,但会导致语义断裂(比如把一个完整的合同条款拆成两半);
    • 不是越大越好:粗粒度分块(如chunk_size=10000)可能超出模型token限制,且包含无关信息,降低检索效率;
    • 参考值:根据目标模型调整——GPT-4(32k)可设1500-2000,Claude 3(200k)可设5000-8000,预留部分token给后续prompt。

实战案例:分割产品手册文本

from langchain_text_splitters import RecursiveCharacterTextSplitter # 加载后的产品手册文本(假设已用PyPDFLoader加载为Document对象) product_manual_doc =[ Document( page_content="深度学习需要大量数据和计算资源。卷积神经网络(CNN)在图像处理中表现优异,常用于图像分类、目标检测等场景。循环神经网络(RNN)则更适合序列数据,如自然语言处理、时间序列预测。", metadata={"source":"产品手册.pdf","page":5})]# 设置chunk_size=100(字符数),适配中等上下文窗口模型 text_splitter = RecursiveCharacterTextSplitter( chunk_size=100, chunk_overlap=20, strip_whitespace=True)# 分割文档(自动继承元数据) split_docs = text_splitter.split_documents(product_manual_doc)# 输出结果(2个文本块,均含元数据)for doc in split_docs:print(f"文本块:{doc.page_content}")print(f"元数据:{doc.metadata}\n")# 输出:# 文本块:深度学习需要大量数据和计算资源。卷积神经网络(CNN)在图像处理中表现优异,常用于图像分类、# 元数据:{'source': '产品手册.pdf', 'page': 5}# # 文本块:计算资源。卷积神经网络(CNN)在图像处理中表现优异,常用于图像分类、目标检测等场景。循环神经网络(RNN)则更适合序列数据,# 元数据:{'source': '产品手册.pdf', 'page': 5}

2. chunk_overlap:相邻文本块的“上下文粘合剂”

  • 定义:相邻两个文本块之间重叠的字符数(或token数)
  • 核心作用:避免因分割导致语义断裂,确保上下文连贯性
  • 关键技巧
    • 重叠比例建议为chunk_size的10%-20%(如chunk_size=1000时,chunk_overlap=100-200);
    • 无重叠会导致“信息断层”(比如前块结尾是“卷积神经”,后块开头是“网络(CNN)”,单独看都不完整);
    • 重叠过多会导致冗余,增加存储和检索成本。

经典案例:长文本序列分割计算
假设chunk_size=1024,chunk_overlap=128,处理长度为2560的文本:

  • 文本块1:第1-1024个token(完整前半段)
  • 文本块2:第897-1920个token(与块1重叠128个,衔接上下文)
  • 文本块3:第1793-2560个token(与块2重叠128个,覆盖剩余内容)

3. separators:控制分块的“语义边界优先级”

  • 定义:分隔符列表,按优先级顺序递归分割文本(优先用高优先级分隔符,分割后仍超chunk_size再用低优先级)
  • 核心作用:让分块贴合自然语义(段落→句子→短语),减少“拆碎完整语义”的概率
  • 默认分隔符["\n\n", "\n", " ", ""](先按段落分割,再按换行,最后按空格)
  • 自定义技巧:根据文档类型调整——
    • 中文文本:添加"。"“;”“,”(如["\n\n", "。", ";", ",", " "]);
    • 代码文档:添加"\n\n", "\n", "{", "}", ";", " "(避免拆碎代码块);
    • Markdown文档:保留"## "“### ”(按标题分割,保持章节完整性)。

实战案例:中文法律文本自定义分隔符

# 法律合同文本(加载后的Document对象) legal_doc = Document( page_content="第一条 合同双方:甲方(供应商):XX科技有限公司;乙方(采购方):XX制造有限公司。第二条 采购标的:甲方为乙方提供AI服务器10台,型号为XX-2024,单价5万元/台,总金额50万元。第三条 交货时间:乙方支付预付款后30个工作日内交货。", metadata={"source":"采购合同.pdf","page":1})# 自定义中文分隔符(优先按段落→条款→分号→句号分割) text_splitter = RecursiveCharacterTextSplitter( chunk_size=150, chunk_overlap=20, separators=["\n\n","第[一二三四五六七八九十]条",";","。"," "]# 正则匹配中文条款) split_docs = text_splitter.split_documents([legal_doc])for doc in split_docs:print(f"法律文本块:{doc.page_content}\n")# 输出(按条款分割,语义完整)# 法律文本块:第一条 合同双方:甲方(供应商):XX科技有限公司;乙方(采购方):XX制造有限公司。# # 法律文本块:第二条 采购标的:甲方为乙方提供AI服务器10台,型号为XX-2024,单价5万元/台,总金额50万元。# # 法律文本块:第三条 交货时间:乙方支付预付款后30个工作日内交货。
如果觉得这篇文章有帮助,别忘了点赞关注~ 有任何文档切割的踩坑问题,欢迎在评论区交流!咱们下一篇见~ 🚀

Read more

Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环

Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环 前言 在鸿蒙(OpenHarmony)生态迈向大规模跨端协同、涉及前后端高度解耦但逻辑高度依赖的背景下,如何确保客户端与服务端之间的数据交互具备“原子级”的类型安全,已成为提升全栈迭代效率的关键。在鸿蒙设备这类强调分布式部署与多端身份识别的环境下,如果应用依然依赖手写 DTO(Data Transfer Objects)执行网络请求,由于由于人工维护导致的字段命名失配或类型语义漂移,极易由于由于“联调地狱”导致版本交付延期及线上逻辑错位。 我们需要一种能够实现指令驱动(CQRS)、支持跨语言自动生成且具备强类型契约约束的通讯治理方案。 leancode_contracts 为 Flutter 开发者引入了业界领先的契约编程模型。它通过将后端的 API 定义直接映射为端侧的 Dart 强类型对象,彻底消除了

By Ne0inhk
Flutter 组件 activity_files 适配鸿蒙 HarmonyOS 实战:文件活动流治理,构建高性能存储沙箱访问与资产全生命周期管理架构

Flutter 组件 activity_files 适配鸿蒙 HarmonyOS 实战:文件活动流治理,构建高性能存储沙箱访问与资产全生命周期管理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 activity_files 适配鸿蒙 HarmonyOS 实战:文件活动流治理,构建高性能存储沙箱访问与资产全生命周期管理架构 前言 在鸿蒙(OpenHarmony)生态迈向全场景分布式协同、涉及海量多媒体资产处理及严苛应用沙箱(Sandbox)隔离的背景下,如何实现一套既能穿透复杂的层级目录、又能实时追踪文件变更活动且具备极高 I/O 吞吐能力的存储治理架构,已成为决定应用性能广度与数据安全深度。在鸿蒙设备这类强调 AOT 极致性能与受限文件权限周期的环境下,如果应用依然采用陈旧的同步文件读取或缺乏活动追踪的直接 I/O,由于由于频繁的磁盘竞争,极易由于由于“主线程阻塞”或“资产状态不同步”导致用户在管理大型媒体库时发生明显的感知性卡顿。 我们需要一种能够解耦文件路径、支持异步流式追踪(Activity Tracking)且符合鸿蒙分布式文件系统安全范式的操作框架。 activity_files 为 Flutter 开发者引入了“

By Ne0inhk

Tomcat下载安装以及配置(详细教程)

本文讲的是Java环境 文章目录 * 前言 * 下载及安装Tomcat * 启动Tomcat * 测试Tomcat * 配置Tomcat 环境变量 * IDEA中配置Tomcat * Eclipse中配置Tomcat 前言 提示:这里可以添加本文要记录的大概内容: 今天晚上查看自己原来项目的时候,突然发现运行不了,仔细查看发现是tomcat没配置,但是tomcat在电脑里已经下载过了,只是还没有配置,这篇文章就讲tomcat在电脑与idea中的配置 提示:以下是本篇文章正文内容,下面案例可供参考 下载及安装Tomcat 进入tomcat官网,Tomcat官网 选择需要下载的版本,点击下载 下载路径一定要记住,并且路径中尽量不要有中文 下载后是压缩包 .zip,解压后 tomcat系统各个文件夹目录是什么意义: bin:放置的是Tomcat一些相关的命令,启动的命令(startup)和关闭的命令(shutdown)等等 conf:(configure)配置文件 lib:(library)库,依赖的 jar包 logs:Tomca

By Ne0inhk

使用 VS Code 连接 MySQL 数据库

文章目录 * 前言 * VS Code下载安装 * 如何在VS Code上连接MySQL数据库 * 1、打开扩展 * 2、安装MySQL插件 * 3、连接 * 导入和导出表结构和数据 前言 提示:这里可以添加本文要记录的大概内容: 听说VS Code不要钱,功能还和 Navicat 差不多,还能在上面打游戏 但是没安装插件是不行的 发现一个非常牛的博主 还有一个非常牛的大佬 提示:以下是本篇文章正文内容,下面案例可供参考 VS Code下载安装 VS Code下载安装 如何在VS Code上连接MySQL数据库 本篇分享是在已有VS Code这个软件的基础上,数据库举的例子是MySQL 1、打开扩展 2、安装MySQL插件 在搜索框搜索 MySQL和 MySQL Syntax,下载这三个插件 点击下面的插件,选择【install】安装

By Ne0inhk