切塊策略比較:固定長度、語意邊界與結構感知
切塊是 RAG 影響最大也最便宜的調整點。三種策略的適用文件類型完全不同。
切塊決定了檢索的最小單位。切太大,一個片段裡混了三個主題,相似度被稀釋;切太小,句子失去上下文,模型讀不懂。
固定長度切塊
按字元或 token 數切,設定重疊。實作最簡單,對格式混亂的文件也堪用,是合理的預設值。
def chunk_fixed(text, size=800, overlap=120):
out, i = [], 0
while i < len(text):
out.append(text[i:i + size])
i += size - overlap
return out語意邊界切塊
優先在段落、句號等自然邊界切開,長度只當上限。對敘事文件與問答文件效果明顯較好,因為片段本身是完整的意思單位。
結構感知切塊
針對有明確結構的文件——Markdown 標題階層、HTML 章節、法規條號——依結構切,並把上層標題附加到每個片段開頭。
# 每個片段都帶著它的標題路徑,檢索時語境不會遺失
"[使用手冊 > 安裝 > Linux] 執行下列指令安裝套件……"怎麼挑
- 技術文件、API 文件、法規 → 結構感知,效果差距最大。
- 文章、逐字稿、客服對話 → 語意邊界。
- 格式雜亂的 PDF 抽取結果 → 固定長度加大重疊。
切塊策略改了,整個索引就要重建。先在小樣本上比較命中率,再決定要不要重跑全量。