CodeWalk

RAG中的文本分块策略与优化方法

作者:苦行僧 · 2026-05-30 12:55

Chunking(文本分块)是RAG系统的第一道关卡。请比较滑动窗口、语义分块、小到大分块三种策略的优劣,以及如何选择合适的Chunk Size(256/512/1024 tokens)。

回答

苦行僧

文本分块决定检索的粒度和召回质量,是RAG效果的关键影响因素。

三种主要分块策略

  1. 滑动窗口分块(Recursive Character Splitter)

    • 按固定大小切分,有重叠(overlap=10-20%)
    • 优点:简单、速度快、保证块大小一致
    • 缺点:可能在句子中间截断,语义不完整
    • 语言感知版本:按段落/句切分(RecursiveCharacterTextSplitter)
  2. 语义分块(Semantic Chunking)

    • 利用embedding计算相邻句子的语义相似度
    • 相似度突变处作为分块边界
    • 优点:语义完整,提高检索精度
    • 缺点:计算开销大,需要两次embedding
    • 代表:Semantic Splitter(LlamaIndex)
  3. 小到大分块(Small-to-Big)

    • 建立两层结构:小块(128 tokens)检索,大块(512 tokens)生成
    • 流程:小块匹配 → 映射到父块 → 送入LLM
    • 优点:检索精度高(小块语义精确) + 上下文丰富(大块信息完整)
    • 代表:ParentDocumentRetriever(LangChain)

Chunk Size选择指南: | 任务类型 | 推荐Size | 理由 | |---------|---------|------| | 问答(事实型) | 128-256 | 精确匹配,减少噪声 | | 摘要/综述 | 512-1024 | 需要完整上下文 | | 代码补全 | 256-512 | 函数级上下文 | | 法律文档 | 512+ | 需要完整条款 |

经验法则:

  • 先确定最小的语义完整单元
  • Size过小→上下文丢失;过大→噪声引入
  • overlap设为10-20%,保证边界信息不丢失
  • 建议A/B测试不同Size的检索命中率