切塊
切塊(chunking)把長文件切成可嵌入、可檢索、可塞進提示的小段。RAG 出問題時,很大比例是塊切錯:要嘛切太碎找不到完整意思,要嘛切太大,檢索到一坨不相干的字。
為什麼一定要切
- 嵌入模型有長度上限,超過會被截斷或拒絕。
- 提示有 token 預算:top-k 個塊加起來不能把上下文塞爆。
- 檢索要精準:塊對應「一個可回答的單位」,分數才有意義。
切塊是索引階段的核心步驟,見 建立索引。
常見策略
| 策略 | 做法 | 適合 |
|---|---|---|
| 固定長度 | 每 N 個字元/token 切一刀,常加 overlap | 快速起步、格式雜亂的文字 |
| 遞迴字元切分 | 先依段落、再依句、再依字切(LangChain RecursiveCharacterTextSplitter) |
大多數 Markdown/純文字 |
| 依文件結構 | 標題、章節、表格各自成塊 | 手冊、法規、有清楚標題的 PDF |
| 語意切塊 | 用嵌入找主題轉換點再下刀 | 主題混雜的長文,成本較高 |
入門用「遞迴字元切分 + overlap」就夠。overlap(重疊)讓落在邊界的句子兩邊都還找得到,常見 10–20%。
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=120,
separators=["\n\n", "\n", "。", " ", ""],
)
chunks = splitter.split_text(document_text)
chunk_size 沒有萬能數字。800–1500 字元對中文手冊常是合理起點;程式碼、表格、條列法規則另當別論。調完一定要用真實問題做 評估,不要只憑直覺。
切塊時要一起保存的 metadata
每個塊至少記住:來源檔名、頁碼或標題路徑、在原文的位置。生成時才能引用;權限控管時才能依 metadata 過濾。沒有 metadata 的向量庫,出了錯你也找不到是哪一份文件害的。
常見失敗
- 一切均分、不管標題:一節被切成兩半,問題只命中後半。
- 把整個 PDF 當一塊:檢索永遠回同一份,提示爆掉。
- 切太碎:問「退費流程」只撿到「七天內」三個字,模型無法推論。
- 掃描 PDF 沒先 OCR:切到的是空字或亂碼,後面全白做。
下一頁:向量庫。