Chunking(分段/切塊)
又稱:分段 · 切塊 · 文字分塊 · chunk size · chunking 策略
在做 embedding 之前,先把長文件切成一小段一小段;因為向量是把「一整段的意思」壓成一個點,段落越長,那個點就越模糊。
你會在什麼時候遇到它
這是 RAG 裡最安靜卻最關鍵的旋鈕。切太大,一段裡混了好幾個主題,向量被平均掉、檢索不準;切太小,一句話失去上下文,撈回來也看不懂。檢索品質莫名其妙地差,八成是 chunking 沒調好。
打個比方
像把一本書拆成卡片放進圖書館的檢索櫃。卡片太大(整章),一張卡講太多事,很難精準命中;卡片太小(單字),又看不出在講什麼。剛好的卡片,是一段能獨立讀懂的內容。
最小範例
# 常見做法:固定長度切塊,並讓相鄰塊重疊一點,避免句子被切成兩半
def chunk(text, size=500, overlap=50):
out, i = [], 0
while i < len(text):
out.append(text[i:i + size])
i += size - overlap # 重疊:下一塊往回抓 50 個字
return out
# size / overlap 沒有萬能值,要照文件類型試:
# 技術文件、法規 → 偏小、貼著段落切
# 敘事、對話 → 偏大,保留上下文重點在 overlap(重疊):它讓被切在邊界的句子,至少在某一塊裡是完整的。size 和 overlap 會直接改變檢索結果,卻沒有標準答案 —— 這是必須用你自己的文件去試的參數,不是抄別人的數字就好。
最常搞錯的地方
- 只按固定字數硬切,不管句子與段落邊界。結果半個句子被切進上一塊、半個進下一塊,兩塊的向量都失真,檢索自然不準。至少盡量在句號、換行處切。
- 以為 chunking 只是前置處理、隨便切切就好,把心力全放在換更貴的模型上。實務上,改善 chunking 往往比換模型對檢索品質的提升更大、更便宜。