PILLAR 03 · RAG 與向量資料庫

文件切割策略完整指南:Fixed、Semantic、Hierarchical

切得太大召回差、太小失語境——三種策略的取捨與實作 Python 範例。

PUBLISHED
2026-05-30
READ TIME
10 min
CATEGORY
PILLAR 03
UPDATED
2026-09-27
KEY TAKEAWAY · 一句話結論

文件切片是 RAG 表現好壞的第一關,常見三種策略:Fixed Size 最簡單快速、Semantic 語義完整但慢且貴、Hierarchical 適合有章節結構的文件;作者建議第一版用 Fixed Size 500 tokens 加 50 overlap,Hit Rate 低於 70% 再試 Semantic,chunk_size 實務最佳為 300 到 800 tokens,overlap 取 10 到 20%。

發布 2026-05-30 · 最後更新 2026-09-27 · 作者 賴家榮 Andy Lai

文件切片(Chunking)是 RAG 表現好壞的第一關。切錯了,後面 Embedding 再強、Reranker 再準也救不回來。這篇教您三種策略與實作。

為什麼要切片?

  • LLM context 有限,不能塞整本書
  • 太大的 chunk 會稀釋相關度
  • 切片可以保留來源 metadata(章節、頁碼)

策略 1:Fixed Size(固定大小)

最簡單:每 N 個 tokens 切一刀,相鄰 chunk 有 overlap。

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", ",", " ", ""]
)
chunks = splitter.split_text(text)

優:簡單、快、可預測
缺:可能在句中切斷、語義不完整

建議參數:500 tokens + 50 overlap(中文)/ 800 + 100(英文)

策略 2:Semantic(語義切片)

用 embedding 偵測語義邊界——當相鄰句子的 embedding 距離大於門檻時切。

from llama_index.core.node_parser import SemanticSplitterNodeParser

splitter = SemanticSplitterNodeParser(
    buffer_size=1,
    breakpoint_percentile_threshold=95,
    embed_model=embed_model
)
nodes = splitter.get_nodes_from_documents(docs)

優:語義完整、效果好
缺:慢、貴(每次切都要算 embedding)

策略 3:Hierarchical(階層式)

多層切:章 → 節 → 段。檢索時可以動態調整粒度。

# 結構化文件(有 H1, H2, H3)
def hierarchical_chunk(doc):
    chapters = split_by_heading(doc, 'h1')
    for chapter in chapters:
        sections = split_by_heading(chapter, 'h2')
        for section in sections:
            paragraphs = split_by_size(section, 300)
            yield {
                'text': paragraph,
                'metadata': {'chapter': ..., 'section': ...}
            }

優:保留結構、利於檢索
缺:實作較複雜,適合有 H1/H2/H3 結構的文件

三種策略對比

策略速度品質適合
Fixed Size極快中大量純文字
Semantic慢高高品質要求、量不大
Hierarchical中高結構化文件(書、報告)

實務建議

  1. 第一版用 Fixed Size 500/50,跑起來看效果
  2. 若 Hit Rate < 70%,試 Semantic
  3. 若文件本身有結構(章節清楚),用 Hierarchical
  4. 所有策略都要保留 metadata(來源、頁碼、章節)

中文切片的特殊問題

  • 沒有 word boundary,分詞工具不可靠 → 直接用字元數切
  • 句號、分號是好的切點
  • 表格、清單建議整塊保留
  • 標題與內文要連在一起,別切散

chunk_size 怎麼挑?

  • 太小(< 200):缺乏語境
  • 太大(> 1500):稀釋相關度
  • 實務最佳:300–800 tokens

chunk_overlap 怎麼挑?

  • 0:邊界資訊會丟
  • 10–20%:剛好
  • 50%+:重複、浪費儲存

常見問題

為什麼 RAG 需要做文件切片?

因為 LLM 的 context 有限,不能塞整本書;太大的 chunk 會稀釋相關度;切片還能保留章節、頁碼等來源 metadata。切片是 RAG 的第一關,切錯了後面的 Embedding 再強、Reranker 再準也救不回來。

Fixed Size、Semantic、Hierarchical 三種切片策略有什麼差別?

Fixed Size 每 N 個 tokens 切一刀並帶 overlap,極快、品質中等,適合大量純文字,缺點是可能在句中切斷。Semantic 用 embedding 偵測語義邊界,品質高但慢且貴,適合量不大的高品質需求。Hierarchical 依章、節、段多層切,速度中等、品質高,適合書籍與報告等結構化文件。

chunk_size 和 chunk_overlap 該設多少?

chunk_size 小於 200 會缺乏語境,大於 1500 會稀釋相關度,實務最佳是 300 到 800 tokens。overlap 設 0 會丟失邊界資訊,50% 以上會重複浪費儲存,10 到 20% 剛好。文章建議中文用 500 tokens 加 50 overlap,英文用 800 加 100。

中文文件切片有什麼特別要注意的?

中文沒有 word boundary,分詞工具不可靠,建議直接用字元數切;句號與分號是好的切點;表格與清單建議整塊保留;標題與內文要連在一起,不要切散。程式碼範例中的 separators 也依序放入換行、句號、逗號作為切點。

第一次做 RAG 該用哪種切片策略?

作者建議第一版用 Fixed Size 500/50 先跑起來看效果;若 Hit Rate 低於 70% 再試 Semantic;若文件本身章節清楚就改用 Hierarchical。不論哪種策略,都要保留來源、頁碼、章節等 metadata。


RELATED ARTICLES

延伸閱讀。

延伸工具

LAST STEP

給我 30 分鐘,
告訴我你的業務。

我直接告訴你:你公司最該先用 AI 的 3 個地方、大概花多少預算、能不能用政府補助降低成本。

SOUTH TAIWAN AI WEEKLY

每週一封,南台灣中小企業
AI 應用週報。

賴家榮親自整理:本週最值得看的 AI 應用案例、補助公告、課程開班資訊。免費、可隨時退訂。

我們不分享您的 Email · 可隨時退訂

📞 立即撥打 預約免費診斷