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

RAG中递归分块Recursive Chunking

递归分块的思想是: 先尝试用最大的分隔符切,切完如果某个块还是太大,就换一个更小的分隔符继续切,直到所有块都在 chunkSize 以内。

需注意,此方法最小分隔符需设置为"",也就是单字拆分或者单token拆分,保证能无限细分拆下去,直到<chunkSize

此处使用Java示例表示此分块方式的思路

public class ChunkSpilt {/*** 分隔符列表*/private static final String[] separators = {"\n\n", "\n", ",", ",", "。", " ", ""};/*** chunk最大大小(字符)*/private static final int chunkSize = 50;public static void main(String[] args) {String test = "C++11以前有很多原因不能提供一个通用的split,因为绝大部分人想要的类似于vector<string> split(const string& s, const string& delimiters = \" \") 这种函数是进不了C++标准库的。首先,它返回的是一个vector,而用户想要的可能是list、array,甚至是其它任何用户自定义的容器,这时候就需要自己再拷贝一次。总之就是split返回的结果是一个集合、但是不能限定为任何指定的容器,最好是lazy的,真正需要访问下一个的时候才去split下一个,符合这样的要求的split才能进入C++标准库。";List<String> spilt = spilt(test);System.out.println(spilt.size());for (String s : spilt) {System.out.println(s);}}/*** chunk分割*/private static List<String> spilt(String text) {return spilt(0, text, null);}/*** 递归逐层分割chunk** @param step             当前层数* @param text             原始文本* @param lastSpiltStrings 当前层分割的结果* @return 返回的结果*/private static List<String> spilt(int step, String text, List<String> lastSpiltStrings) {if (step >= separators.length) {// 当前层无法再分割,直接返回return lastSpiltStrings;}String separator = separators[step];if (lastSpiltStrings == null) {lastSpiltStrings = List.of(text.split(separator));} else {// 使用当前层分隔符分割List<String> temp = new ArrayList<>();for (String lastSpiltString : lastSpiltStrings) {temp.addAll(Arrays.asList(lastSpiltString.split(separator)));}lastSpiltStrings = temp;}// 校验每个string是否大于chunkSize,大于则继续拆分,没有了直接返回return lastSpiltStrings.stream().noneMatch(each2 -> each2.length() > chunkSize) ?lastSpiltStrings : spilt(step + 1, text, lastSpiltStrings);}
}

 

http://www.jsqmd.com/news/471519/

相关文章:

  • 炸裂级!提示工程架构师用提示工程突破大数据分析瓶颈
  • 语音情感识别新体验:Emotion2Vec+ Large WebUI界面,操作简单效果惊艳
  • SolidWorks 6-6、拉伸终点的其它方式与拔模
  • 【PHP 8.9类型系统终极前瞻】:20年核心贡献者独家解密RFC草案未公开的5大类型安全增强机制
  • 避坑指南:万爱通礼品卡回收注意事项你必须知道! - 团团收购物卡回收
  • [Wokwi模拟器] ESP32物联网实战(四):MQTT协议、云端数据上报与智能家居场景模拟
  • 链表----环形链表II
  • 基于STM32单片机超声波测速测距防撞报警设计+DS18B20温度液晶显示及补偿及滤波算法设计26-052
  • 不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码
  • 避坑指南:SparkSQL临时表创建时最容易忽略的3个问题(内存泄漏/命名冲突/会话隔离)
  • 新质生产力下的新能源革命:电流传感器如何助力能源系统智能升级?
  • 【开集检测新范式】Grounding DINO:多阶段融合的视觉语言Transformer如何革新目标检测?
  • 【MCP跨语言SDK开发权威指南】:20年架构师亲授插件下载、安装与避坑全流程
  • Step3-VL-10B-Base模型API安全设计:防范常见网络攻击
  • Nanbeige 4.1-3B 构建AI Agent:自主任务规划与执行框架
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 36 章 DS18B20 温度传感器实验
  • Gemma-3-270m在软件测试中的智能用例生成实践
  • 【PHP电商高并发订单处理黄金法则】:20年架构师亲授秒杀场景下零超卖、零重复下单的5大核心策略
  • ESP32S3低成本热成像系统设计与实现
  • USART 串口通信进阶指南:从寄存器配置到高效数据收发
  • 基于ESP32S3的AI对话手办:小智双目可无线充电(骷髅)项目全解析
  • 南北阁 Nanbeige 4.1-3B 思考过程可视化:CoT标签自动解析与UI集成详解
  • AIGlasses OS Pro与MySQL数据库集成指南
  • 文墨共鸣部署案例:边缘设备(Jetson Orin)轻量化部署水墨风语义分析POC
  • Gemma-3-12b-it流式生成原理与调优:TextIteratorStreamer实战解析
  • 新手友好:借助快马AI生成注释详尽的棋牌游戏入门代码示例
  • AIGlasses OS Pro软件测试自动化:基于视觉的UI缺陷检测
  • 【MCP跨语言SDK开发终极指南】:2026年7大不可忽视的技术拐点与避坑清单
  • Qwen2.5-VL-7B-Instruct保姆级教程:模型加载失败时的4种常见修复方案
  • STM32高精度电子鼓MIDI控制器设计与实现