RAG 21种通用分割策略初次尝试总结

背景:基于一次从“21 种通用分块策略”出发,尝试抽象一套可通用于不同文档/领域的 RAG 文本分块体系的探索。实践后结论:21 条更像“策略原型 (Archetypes)”的知识清单,而非可以直接普适落地的齐全方法集。


1. 初始目标

希望用一个“通用策略列表(21 种)”来覆盖企业知识库、技术文档、合同、小说、日志、表格、API 说明、多模态等不同场景的 RAG 分块需求,并构建:

  • 可配置的策略管线 (Pipeline)
  • 多层级(快速上线 → 结构增强 → 语义增强 → 智能生成)
  • 指标闭环与回退机制

初始假设

  1. 只要枚举足够多的“分块方法”,即可通过排序或组合达到普适性。
  2. 所有文档类型都可以先走“通用策略 → 组装 plan → 部署”。
  3. 复杂策略(语义/LLM)只是在成本上的增强,并不改变结构抽象。

结论:以上假设部分失效,尤其是第 1、2 点。


2. 21 条策略列表(原始“概念层”)

  1. 行 (Naive)
  2. 固定窗口
  3. 滑动窗口
  4. 句子
  5. 段落
  6. 页面
  7. 结构化(HTML/JSON/日志/CSV)
  8. 标题/小节结构
  9. 关键词边界
  10. 实体 (NER)
  11. Token 长度控制
  12. 主题聚类
  13. 表格感知
  14. 内容类型感知(代码/列表/引用)
  15. 上下文增强(摘要/注释)
  16. 语义相似归并
  17. 递归分块(分层长度控制)
  18. 动态嵌入聚合
  19. LLM Agent 自主切分
  20. 分层(章节→节→段)
  21. 模态感知(文字/图片/表格)
    (H) Hybrid 混合编排

发现:它们描述的是“手段类型”而不是“直接可复用的策略实现”。


3. 分层与演进(提炼:依赖维度)

层级描述示例原型价值局限
Tier0 纯规则无外部模型行/窗口/句/段/关键词/递归快速上线不理解语义/边界粗糙
Tier1 结构感知解析格式/布局标题/表格/内容类型/层级保留结构语义需解析器 & 领域适配
Tier2 语义增强嵌入/NER/聚类实体/主题/语义合并/动态聚合减少碎片 & 语义集中成本↑ 调参复杂
Tier3 生成/智能LLM / 多模态摘要增强/Agent/多模态自适应 & 高压缩成本+不确定性

现实:领域策略不是单纯“进入更高层”,而是“在一个层内插入特化规则”。


4. 已实际落地的部分 (本次尝试结果)

已实现的最小可用模块:langchain4j-spring-ai-rag-chunk (Tier0)。

实现的 8 个策略/控制器:

  • LINE (LineChunker)
  • FIXED_WINDOW (FixedWindowChunker)
  • SLIDING_WINDOW (SlidingWindowChunker)
  • SENTENCE (SentenceChunker)
  • PARAGRAPH (ParagraphChunker)
  • KEYWORD (KeywordChunker)
  • PAGE (PageChunker)
  • RECURSIVE_LENGTH (RecursiveLengthController)

配套:模型类(RawDocument/Chunk/ChunkContext)、Pipeline、若干测试用例。

未进入实现(但原先规划有):章节结构解析、短段合并、对话聚合、结构/表格解析、语义/NER、Agent 等。


5. 遭遇的核心问题 & 认知更新

问题表现认知更新
“通用列表”难直接复用尝试将小说、合同、API 用同一组策略顺序描述时需大量条件分支需要“原型 + 领域特化”两层抽象
策略粒度不一致有的描述“切分方式”,有的是“后处理”或“合并规则”需要拆分:边界检测 / 合并 / 后处理 / 长度控制 四类角色
配置爆炸21+ 策略平铺会形成过多组合应由 Planner 决定最小可行链条,且 domain override
语义策略门槛嵌入/NER 引入后:缓存、批量、阈值调参复杂不应与基础规则耦合,应延迟加载能力 (capability gating)
LLM 参与不稳定Agent 切分设计 JSON 容错、成本评估困难仅在结构置信度低 + 长文 + 预算允许时触发
通用句法欠缺中文长段/对话结构远超简单标点策略需要针对对话/章节/场景的特化模块

6. 放弃“单层完全通用”后的新模型

新的认知方式:

  1. 21 条 = 策略原型分类表 (Strategy Archetype Catalog)
  2. 领域特化 (Specialization) = 原型 + 领域知识(正则 / 触发词 / 词典 / 结构标记)
  3. 执行链 (Plan) = 按文档 profile 选择最小必要原型 + 领域特化
  4. 能力门控 (Capability Gating) = tokenizer / embedding / ner / llm 可选注入
  5. 质量闭环 = 指标 (长度/碎片/重复/实体完整) + 回退 (fallback)

7. 示例:网络玄幻小说的“特化”映射

原型特化策略触发/规则目的
标题结构 (#8)CHAPTER_HEADING^第[一二三四五六七八九十百千万0-9]+章章节层级根
段落 (#5)SHORT_PARAGRAPH_MERGE段长 < 阈值 → 合并邻近降低碎片
句子 (#4)DIALOGUE_MERGE连续引号行聚合 (最大字数/轮次)保持对白语境
语义合并 (#16)SCENE_BOUNDARY触发词 + 相似度跌落场景组织
上下文增强 (#15)SCENE_SUMMARYLLM 摘要快速检索二跳
递归 (#17)LENGTH_CONTROLLER超过 hardMax 继续切保持成本

当前我们仅实现了可用于“临时替代”的:SENTENCE + PARAGRAPH + FIXED_WINDOW + RECURSIVE_LENGTH。


8. 为什么“继续堆通用策略”性价比低

  • 新增策略 → 需要语义/格式特征 → 又需领域判断 → 再写条件分支 → 回退复杂度指数增长。
  • 真正的问题是“领域结构差异”,不是“策略不够多”。
  • 成本最高的是错误切分(碎片化、跨语义),而不是“还少几个策略名字”。

9. 精简的基础使用建议(当前能力)

文档类型推荐 Tier0 组合备注
小说(临时)SENTENCE → FIXED_WINDOW → RECURSIVE_LENGTH等待章节/对白特化补齐
FAQ/短问答PARAGRAPH 或 LINE → RECURSIVE_LENGTH去除空行 + 过滤无效行
长说明文PARAGRAPH → SENTENCE(大粒度合并) → FIXED_WINDOW句子 joinThreshold 提高
粗糙日志LINE → FIXED_WINDOW行即事件(后续可结构化)
含页 PDF 文本PAGE → PARAGRAPH → FIXED_WINDOW需要保持页码引用

10. 暂停本次“通用覆盖”尝试的理由

  1. 已验证:没有“无需特化即可表现优秀”的一条龙方案。
  2. 基础模块可稳定支撑进一步特化开发;无需先把所有原型写成半成品。
  3. 继续抽象会引入过多“名义策略”而未提升实际可用性。

决策:终止“21 条直接落地通用”路径,转向“原型 + 领域特化 + 增量演进”。


11. 经验教训 & 可复用结论

经验结论建议
不加区分地枚举策略快速变成策略清单墙纸先确定领域用例 → 逆推需要的原型
过早引入高级策略成本高 & 价值不确定先验证结构保持 & 长度分布
忽视元数据结构后面难加层级/回退早期就为 ChunkMetadata 预留扩展键
混合语义+结构逻辑代码耦合难测试通过 capability & planner 解耦
无指标无法判断改进主观分块优劣难量化最少收集:avg_len / short_ratio / overlap_waste

12. 后续可选方向(若恢复推进)

优先层级:

  1. 特化:ChapterHeadingChunker, DialogueMergeChunker, ShortParagraphMergeChunker
  2. 元数据增强:strategy_version, plan_signature, specialization 字段
  3. Metrics:avg_len, max_len, short_ratio, redundancy_ratio
  4. 结构层 (Tier1):Heading / Table(技术文档或合同再选)
  5. 语义层 (Tier2):SceneBoundary (novel) / ClauseNER (contract)
  6. 生成层 (Tier3):场景摘要 / 条款释义(按 ROI 决策)

13. 若完全停留在 Tier0 的风险

风险影响补救(最小特化)
小说对白碎片化QA 指代断裂对话聚合
合同条款被截断法务问答失准条款正则切
表格被切坏数值语境丢失表格整体抽取
主题漂移块召回噪声短段合并 + 语义合并

14. 结论(One-Liner)

通用 21 策略”不是最终实现蓝图,而是“分块手段原型目录”;有效落地必须通过“领域特化 + 渐进增强 + 指标闭环”路线推进,本次尝试已完成 Tier0 基础并明确转向新的认知模型。


15. 附:本次实现产物清单

模块路径内容
Tier0 代码langchain4j-spring-ai-rag-chunk8 个基础策略 + Pipeline + 测试
文档 v1.0/v1.1RAG分块策略实现.md / RAG分块策略实现规划 (rev)原型 + 分层 + v1.1 补充
当前总结本文件尝试回顾与方向调整

16. 推荐的“重新出发”最小脚本 (示例)

ChunkPipeline pipeline = ChunkPipeline.builder()
    .add(ParagraphChunker.of(180))
    .add(FixedWindowChunker.of(650, 90))
    .add(new RecursiveLengthController(800, 650, 90))
    .build();

作为小说/长说明文的过渡方案;再按需要逐步替换/插入特化策略。


17. 结束语

尝试终止 ≠ 失败,而是完成了“从模糊列举 → 可执行骨架 → 明确边界”的学习闭环。后续若再推进,可直接以“领域特化任务”切入,避免重新陷入泛化抽象泥潭。

### 如何实现RAG嵌入模型中的文本分割器 在构建基于检索增强生成(Retrieval-Augmented Generation, RAG)的系统时,文本分割是一个至关重要的环节。它决定了如何将文档分解成更小的部分以便于后续处理和存储。以下是关于RAG嵌入模型中文本分割器的设计与实现的关键点: #### 文本分割的重要性 为了使语义搜索引擎能够高效工作,原始文档通常被拆分为较小的片段或段落。这些片段随后会被编码为向量并存入矢量数据库中[^1]。通过这种方式,当用户发起查询时,系统可以根据查询内容快速找到最相关的文档片段。 #### 实现方法概述 一种常见的做法是利用滑动窗口技术来创建重叠的文本块。这种方法不仅有助于捕捉上下文信息,还能提高召回率。具体来说,可以定义一个固定的长度作为每个块的最大字符数或者词数量,并设置步幅(step size),即每次移动多少个单位前进到下一个位置开始新的切片操作[^2]。 下面展示了一个简单的Python函数用于执行上述逻辑: ```python def split_text(text, chunk_size=500, stride=250): chunks = [] start = 0 while start < len(text): end = min(start + chunk_size, len(text)) chunks.append(text[start:end]) if end == len(text): break start += (chunk_size - stride) return chunks ``` 此代码接受三个参数:待分隔的大段文字`text`, 每一块的目标大小`chunk_size`(默认值设为500), 和两个连续块之间的偏移量`stride`(默认设定为250). 它返回由多个子字符串组成的列表形式的结果. 另外值得注意的是,在实际应用过程中可能还需要考虑一些额外的因素比如特殊标记符的位置调整以及去除冗余空白区域等预处理步骤以优化最终效果. #### 使用场景举例说明 假设我们有一个非常长的技术手册需要建立索引供日后搜索使用,则可以通过调用上面定义好的split_text() 函数先将其划分为若干较短的小节后再逐一转化为对应的embeddings 并上传至相应的vector store 中等待匹配请求到来即可完成整个流程搭建过程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值