当前位置: 首页 > article >正文

RecursiveCharacterTextSplitter类解读

基于 LangChain 当前官方文档与官方源码/参考入口RecursiveCharacterTextSplitter可以这样理解文章目录1) 切分原理2) 关键参数3) 方法接口4) 适用边界5) 中文场景优化6核心类方法的使用1. split_text(text: str) - list[str]2. create_documents(texts: list[str], metadatas: list[dict] | None None) - list[Document]3. from_language(language: Language, **kwargs: Any) - RecursiveCharacterTextSplitter4. get_separators_for_language(language: Language) - list[str]5结论1) 切分原理它是 LangChain 官方推荐的通用文本默认切分器核心思路是给定一组分隔符按顺序递归尝试分割文本如果当前层级切出来的片段仍然超过目标大小就继续用下一层更“细”的分隔符再切。默认分隔符是[\n\n, \n, , ]也就是优先保留段落其次换行再其次空格最后退化到逐字符级别。因此它的目标不是“绝对平均切块”而是尽量在语义完整性和块大小约束之间取平衡。官方文档也明确说了对大多数场景先从它开始。(LangChain 文档)从源码看它会先在传入的separators里找到当前文本中实际存在的第一个分隔符用这个分隔符先切对小于chunk_size的片段先暂存对超长片段再递归调用_split_text(..., new_separators)用后续更细的分隔符继续切。切完后再做 merge得到最终 chunks。这个机制解释了它为什么通常比“固定长度硬切”更适合 RAG。(GitHub)2) 关键参数官方示例里最关键的是这几个chunk_size、chunk_overlap、length_function、is_separator_regex。其中chunk_size是单块上限具体“大小”由length_function决定chunk_overlap是相邻块之间的目标重叠用来降低上下文被切断后的信息损失length_function决定如何计算长度默认示例用lenis_separator_regex则决定你传入的 separators 是按普通字符串解释还是按正则解释。(LangChain 文档)源码还显示它自己的构造参数里额外暴露了separators默认值就是[\n\n, \n, , ]并且keep_separator默认是True。这意味着切分时通常会保留分隔符而不是简单把分隔符丢掉源码中的_split_text_with_regex还支持keep_separatorstart或end这样的控制方式。这个点在处理标点、代码边界时很有用因为保留边界符往往更利于语义还原。(GitHub)一个容易忽略但很重要的点官方文档页写的是“chunk size 按字符数衡量”这是针对默认length_functionlen的讲法如果你换了length_function例如改成 tokenizer 计数本质上它就不再是“字符长度切分器”而是“递归分隔 自定义长度度量”。(LangChain 文档)3) 方法接口直接可用的核心接口有split_text(text) - list[str]输入字符串输出字符串列表。官方文档明确把它作为“直接拿字符串 chunks”的入口。(LangChain 文档)create_documents(texts, metadatasNone) - list[Document]把文本列表切分后生成Document对象适合后续 embedding、向量库入库、检索链路。官方递归切分文档直接这样推荐基类源码也表明这是标准接口。(LangChain 文档)split_documents(documents) - list[Document]与transform_documents(documents)这两个是基类TextSplitter上的文档级接口前者对输入Document序列做拆分后者则是“transform”风格封装内部仍然走文档切分。(GitHub)from_language(language, **kwargs)官方源码和代码切分文档都给出了这个工厂方法它会根据编程语言拿一套预置 separators并且用is_separator_regexTrue初始化。适合代码、Markdown、HTML、LaTeX 这类带明显结构边界的内容。(GitHub)get_separators_for_language(language)返回某种语言的预置分隔符。官方代码切分文档明确展示了它的用法比如 Python 的 separators 包含\n class、\n def、\n\n、\n、、。(LangChain 文档)另外RecursiveCharacterTextSplitter继承自TextSplitter。官方参考入口显示基类还提供from_tiktoken_encoder和from_huggingface_tokenizer这类工厂方法因此你可以把“长度计算”切到 token 维度而保留递归分隔策略。(LangChain 参考文档)4) 适用边界它最适合的是普通自然语言文本、轻度结构化文档、以及希望尽量保留段落/句子完整性的通用 RAG 预处理。官方把它定位为 generic text 的推荐起点这个判断很明确。(LangChain 文档)但它也有边界第一它本质仍是基于分隔符的启发式切分不是语义模型切分器。也就是说它能“尽量沿自然边界切”但不理解真正的语义单元遇到表格、复杂 JSON、长公式、扫描文本、跨段强依赖内容时效果可能一般。官方文本切分总览页也把 splitter 分成 text structure-based、length-based、document structure-based 等不同类别说明它并不是所有类型文档的最优器。(LangChain 文档)第二默认策略对无空格语言不够友好。官方专门拿中文、日文、泰文举例说明默认分隔符[\n\n, \n, , ]可能会把词切断。也就是说中文不建议直接吃默认配置。(LangChain 文档)第三如果你的真正约束是模型 token 窗口而不是字符数那么仅用默认len并不稳妥。更合理的做法是保留RecursiveCharacterTextSplitter的递归分隔思想但把长度函数改成 tokenizer 维度或直接用基类提供的 tokenizer 工厂能力。(LangChain 文档)5) 中文场景优化官方对中文场景的建议非常直接给separators增补中文常见标点尤其是句号和逗号类边界。文档明确列出应考虑加入.、、。、零宽空格\u200b、,、、、以避免无词边界语言在 chunk 之间被生硬截断。(LangChain 文档)一个更实用的中文配置可以写成这样fromlangchain_text_splittersimportRecursiveCharacterTextSplitter text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap80,separators[\n\n,\n,。,,,,,、, ,],)这里我在官方建议基础上额外加了 ? 这类中文句读符号这部分属于实践扩展不是官方原样列表但方向与官方“为中文补充标点边界”的建议一致。官方原文明确列出的仍然是.、,、、。、、、和\u200b。(LangChain 文档)中文实践里我建议这样落地纯段落型文章先用[\n\n, \n, 。, , ]问答/客服语料优先加入、法规/制度/合同加入、条款编号分隔符必要时开启 regex混合中英文本同时保留英文.,和中文。代码/Markdown/HTML优先考虑from_language(...)的结构化 separators而不是手写一套中文标点规则 (LangChain 文档)6核心类方法的使用根据 LangChain 官方文档RecursiveCharacterTextSplitter提供了几个关键方法核心方法包括split_text、create_documents和from_language。以下是这些方法的使用示例和核心说明1.split_text(text: str) - list[str]此方法用于将输入的文本按设定的分隔符切割成较小的文本片段。默认的分隔符为[\n\n, \n, , ]可以根据需求自定义。它是获取文本切分后的基础方法。使用示例fromlangchain_text_splittersimportRecursiveCharacterTextSplitter text_splitterRecursiveCharacterTextSplitter(chunk_size100,chunk_overlap20,length_functionlen,is_separator_regexFalse,)textMadam Speaker, Madam Vice President, our First Lady and Second Gentleman...chunkstext_splitter.split_text(text)print(chunks)此方法直接返回切割后的文本列表。2.create_documents(texts: list[str], metadatas: list[dict] | None None) - list[Document]此方法将切分后的文本转换为Document对象。每个Document对象包含文本及其元数据通常用于后续处理如嵌入embedding或存储在向量数据库中。使用示例fromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 假设你已经有了切分后的文本列表 textstexts[Madam Speaker...,Justices of the Supreme Court...,My fellow Americans...]metadatas[{source:speech1},{source:speech2},{source:speech3}]text_splitterRecursiveCharacterTextSplitter(chunk_size100,chunk_overlap20)documentstext_splitter.create_documents(texts,metadatasmetadatas)fordocindocuments:print(doc.page_content)print(doc.metadata)此方法返回的是Document对象列表。3.from_language(language: Language, **kwargs: Any) - RecursiveCharacterTextSplitter此类方法是一个工厂方法根据指定语言来返回一个配置了特定语言分隔符的RecursiveCharacterTextSplitter实例。适用于代码、Markdown、HTML 等语言/文档类型需要结构化分隔符。使用示例fromlangchain_text_splittersimportRecursiveCharacterTextSplitter,Language# 创建一个专门用于处理 Python 代码的文本切分器text_splitterRecursiveCharacterTextSplitter.from_language(languageLanguage.PYTHON,chunk_size100,chunk_overlap20)这会自动选择适合 Python 代码的分隔符如\n class ,\n def 等并初始化一个切分器。不同语言可以通过Language枚举来配置。4.get_separators_for_language(language: Language) - list[str]这个静态方法返回指定语言的分隔符列表适用于从头开始构建分隔符时使用或者调试时查看分隔符。使用示例fromlangchain_text_splittersimportRecursiveCharacterTextSplitter,Language# 查看 Python 语言的分隔符separatorsRecursiveCharacterTextSplitter.get_separators_for_language(Language.PYTHON)print(separators)返回的分隔符列表可以帮助用户了解该语言在代码分割中的常用分隔符例如\n def 或\n class 等。5这些方法配合使用可以帮助我们根据不同的文本类型和需求切分文本处理大规模文本数据并优化模型上下文窗口的输入。对于需要进行语义保留和块大小控制的应用场景RecursiveCharacterTextSplitter是一个非常强大的工具。需要注意的是from_language和get_separators_for_language等方法特别适合结构化文档如代码、Markdown而对于自然语言文本直接使用split_text和create_documents就足够了。结论如果你把它放到 RAG 预处理中最准确的定位是RecursiveCharacterTextSplitter 递归分隔策略 可配置长度度量 面向通用文本的默认首选。默认配置适合英文或带空格文本到了中文场景核心优化不是盲目调大chunk_size而是先把 separators 改对再根据召回和答案完整率调chunk_size / chunk_overlap。(LangChain 文档)

相关文章:

RecursiveCharacterTextSplitter类解读

基于 LangChain 当前官方文档与官方源码/参考入口,RecursiveCharacterTextSplitter 可以这样理解: 文章目录1) 切分原理2) 关键参数3) 方法接口4) 适用边界5) 中文场景优化6)核心类方法的使用1. split_text(text: str) -> list[str]2. cre…...

【绝密工作流】R 4.5下TCGA批量下载→准确定量→生存分析→可视化交付(全程无GUI,纯R脚本,含NCBI API密钥安全注入方案)

第一章:R 4.5基因测序数据分析教程概览R 4.5 版本引入了对 Bioconductor 3.19 的原生兼容性增强、更高效的稀疏矩阵处理能力,以及针对单细胞RNA-seq和ChIP-seq数据的底层内存优化。本教程面向具备基础R编程经验的生物信息学实践者,聚焦于从原…...

Java Loom + R2DBC + VirtualThread三重奏:构建零阻塞数据库访问层(含GraalVM原生镜像适配方案)

第一章:Java Loom响应式编程转型的背景与核心价值长期以来,Java 的并发模型依赖线程(Thread)作为基本执行单元,但传统线程是重量级操作系统资源,受限于内核调度开销与内存占用(每个线程栈默认 1…...

3大优化策略:霞鹜文楷屏幕阅读版字体解决数字时代视觉疲劳难题

3大优化策略:霞鹜文楷屏幕阅读版字体解决数字时代视觉疲劳难题 【免费下载链接】LxgwWenKai-Screen LXGW WenKai for Screen Reading. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenKai-Screen 你是否经常在长时间面对屏幕后感到眼睛干涩、视觉疲劳&…...

从‘Hello World’到实战:用 ArcObjects SDK for .NET 在 ArcMap 10.8 中开发你的第一个自定义工具插件

从零构建ArcGIS插件:实战驱动的ArcObjects开发指南 当你第一次打开ArcMap,看着那些功能丰富的工具栏,是否曾想过:"如果我能开发一个专属工具,让软件按我的需求工作该多好?"这正是ArcObjects SDK赋…...

Avalonia UI ..-RC正式发布次

一、什么是 Q 饱和运算? 1. 核心痛点:普通运算的 “数值回绕” 普通算术运算(如 ADD/SUB)溢出时,数值会按补码规则 “回绕”,导致结果完全错误: 示例:int8_t 类型最大值 127 1 → 结…...

老马失前蹄,竟然在数据库外键上翻车了,重温外键级联巡

AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...

【CLion实战】CMakeLists文件加载失败:从环境冲突到.gitignore配置的完整解决路径

1. 问题现象:当CLion突然"失明"时 那天早上我像往常一样打开CLion准备继续昨天的项目,结果发现原本好好的项目突然变成了"无头苍蝇"——CMakeLists文件加载失败,项目结构一片空白,所有代码文件都显示不可编译…...

给MFC老项目续命:用C++类封装图像处理模块,实现算法热插拔(实战灰度化与反色)

给MFC老项目续命:用C类封装图像处理模块,实现算法热插拔(实战灰度化与反色) 在工业检测、医学影像等传统领域,仍有大量基于MFC框架开发的桌面应用程序在稳定运行。这些"老兵"承载着核心业务逻辑,…...

JW Player插件开发教程:如何快速扩展播放器功能

JW Player插件开发教程:如何快速扩展播放器功能 【免费下载链接】jwplayer No Longer Maintained 项目地址: https://gitcode.com/gh_mirrors/jw/jwplayer JW Player是一款功能强大的开源媒体播放器,通过插件系统可以轻松扩展其功能。本文将带你快…...

unix-privesc-check使用教程

unix-privesc-check是Kali Linux中一款款专注于Unix/Linux系统本地权限提升检测的轻量级脚本工具。它通过自动化扫描系统中的文件权限、配置设置和潜在安全漏洞,帮助渗透测试人员和系统管理员识别可能被本地用户利用来提升权限(如从普通用户获取root权限…...

【系统架构师-案例题-建模分析】21年下(4)预约挂号管理系统 UML 建模案例分析

文章目录题目【问题1】(6分)【问题2】(10分)【问题3】(9分)答案与解答【问题1】答案解答【问题2】答案顺序图与协作图的区别解答【问题3】答案1. 三种模型的定义2. 三种模型的关联关系3. 需求分析阶段的适用性解答题目 某医院拟委托软件公司开发一套预约挂号管理系统&#xff…...

工业物联网通信困境:如何用j2mod Java Modbus库构建高效设备通信系统

工业物联网通信困境:如何用j2mod Java Modbus库构建高效设备通信系统 【免费下载链接】j2mod Enhanced Modbus library implemented in the Java programming language 项目地址: https://gitcode.com/gh_mirrors/j2/j2mod 在工业自动化和物联网系统开发中&a…...

PoeCharm实战指南:5步打造你的流放之路完美BD构建

PoeCharm实战指南:5步打造你的流放之路完美BD构建 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的BD构建而头疼吗?PoeCharm作为一款专为中文玩家打…...

PixelMentor:一个开源网站 · 调用AI视觉能力分析图片 · 提供影视后期修改意见略

1. 前言 本文详细介绍如何使用 kylin v10 iso 文件构建出 docker image,docker 版本为 20.10.7。 2. 构建 yum 离线源 2.1. 挂载 ISO 文件 mount Kylin-Server-V10-GFB-Release-030-ARM64.iso /media 2.2. 添加离线 repo 文件 在/etc/yum.repos.d/下创建kylin-local…...

include-media插件生态:8个实用插件提升开发效率

include-media插件生态:8个实用插件提升开发效率 【免费下载链接】include-media 📐 Simple, elegant and maintainable media queries in Sass 项目地址: https://gitcode.com/gh_mirrors/in/include-media include-media是一个功能强大的Sass媒…...

【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---命令解析和工具映射张

先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)&#xf…...

终极指南:Mitsuba 3与Dr.Jit编译器如何用JIT技术重塑渲染管线

终极指南:Mitsuba 3与Dr.Jit编译器如何用JIT技术重塑渲染管线 【免费下载链接】mitsuba3 Mitsuba 3: A Retargetable Forward and Inverse Renderer 项目地址: https://gitcode.com/gh_mirrors/mi/mitsuba3 Mitsuba 3是一个革命性的研究导向渲染系统&#xf…...

QmlBook深度解析:Qt5与QML的核心概念与架构设计

QmlBook深度解析:Qt5与QML的核心概念与架构设计 【免费下载链接】qmlbook The source code for the upcoming qml book 项目地址: https://gitcode.com/gh_mirrors/qm/qmlbook QmlBook是学习Qt5与QML技术的权威指南,它系统介绍了Qt5的架构设计与Q…...

手把手教你用Multisim和Matlab复现《开关电源控制环路设计》第一章的所有仿真案例

从零开始复现《开关电源控制环路设计》第一章仿真案例:Multisim与Matlab实战指南 1. 仿真环境搭建与基础准备 工欲善其事,必先利其器。在开始复现书中的仿真案例前,我们需要确保工具链配置正确。这里推荐使用**Multisim 14.0和Matlab R2020b*…...

如何在5分钟内开始使用EmulatorJS:新手完整入门教程

如何在5分钟内开始使用EmulatorJS:新手完整入门教程 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS EmulatorJS是一款基于Web的RetroArch前端工具,让你能够直接在…...

如何用Draw.io ECE库快速绘制专业电路图:免费电子工程绘图终极指南

如何用Draw.io ECE库快速绘制专业电路图:免费电子工程绘图终极指南 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.c…...

PotPlayer字幕翻译终极指南:5步实现外语视频无障碍实时翻译

PotPlayer字幕翻译终极指南:5步实现外语视频无障碍实时翻译 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为观看外语…...

百度网盘Mac版SVIP特权解锁:从限速到极速的完整技术方案

百度网盘Mac版SVIP特权解锁:从限速到极速的完整技术方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的下载速度而苦…...

基于Simulink的2ASK调制解调系统建模与性能对比分析

1. 2ASK调制解调系统基础入门 第一次接触通信系统仿真时,我被各种调制方式搞得头晕眼花。直到用Simulink搭建了第一个2ASK模型,才发现原来通信原理可以这么直观。**2ASK(二进制幅移键控)**是最基础的数字调制方式之一,…...

毕业论文排版救星:Word多级列表+自动编号保姆级教程(含格式调整技巧)

毕业论文排版救星:Word多级列表自动编号保姆级教程(含格式调整技巧) 写毕业论文最让人头疼的莫过于排版问题——手动调整章节编号不仅耗时费力,一旦中间插入新内容,后续所有编号都要重新修改。我曾见过一位同学因为反复…...

从零构建私有CA链:OpenSSL实战生成根证书与多级签发

1. 为什么需要自建私有CA链? 第一次接触证书体系时,我和大多数人一样有个疑问:为什么不用现成的Lets Encrypt免费证书?直到在金融项目中遇到内网隔离环境才明白,私有CA就像企业内部的身份证制作中心,完全掌…...

如何为EmulatorJS贡献代码:从问题报告到PR提交的完整流程

如何为EmulatorJS贡献代码:从问题报告到PR提交的完整流程 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS EmulatorJS是一个基于Web的RetroArch前端项目,允许用户…...

如何永久保存微信聊天记录?WeChatMsg帮你打造个人专属的数字记忆库

如何永久保存微信聊天记录?WeChatMsg帮你打造个人专属的数字记忆库 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trend…...

AI开发-python-langchain框架(--AI 直接生成并执行 Python 代码 )谱

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c…...