iT邦幫忙

2025 iThome 鐵人賽

DAY 21
1
生成式 AI

一起來打造 PTT 文章智慧問答系統!系列 第 21

【Day 21】RAG 的文章切割策略 - 切割長度應該如何決定

  • 分享至 

  • xImage
  •  

Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com


經過前面 20 天的努力,我們已經完成了一個完整的 PTT RAG 智慧文章檢索系統,從資料爬取、向量化、到基礎的問答流程都跑得起來。雖然系統已經能夠回答基本問題,但裡面還有很多細節值得深入探討。

因此,接下來的最後幾天,我會帶大家一起更仔細地拆解這套系統,包含設計上的取捨、模組間的串接方式,以及一些在實務中遇到的坑與最佳實踐。希望能讓大家不只是「跑得動」,更能理解背後的設計邏輯,方便未來自行延伸或優化。


今日目標

  • 認識為什麼需要對文章做切割(chunking)
  • 探討不同切割長度的優缺點
  • 介紹常見的切割策略與實務上的建議

為什麼要切割文章?

RAG(Retrieval-Augmented Generation) 系統中,文章內容需要先轉換成向量,存放到向量資料庫裡。
但是:

  • 文章太長 → 一個向量塞進去會模糊不清,檢索時相關性降低
  • 文章太短 → 太過零碎,語境斷裂,查詢時找不到完整資訊

因此,如何切割文章內容,是影響 RAG 檢索效果的重要關鍵。


常見切割策略

1. 固定長度切割

例如:每 500 個字或 500 個 Token 就切一段。

優點:

  • 簡單直接,容易實作
  • 可以控制向量數量

缺點:

  • 有可能切斷句子或段落 → 造成語境不完整

2. 依語意單位切割

例如:以段落(paragraph)、句號(.)、換行符號(\n\n)當分界。

優點:

  • 保持語意完整
  • 更接近人類閱讀邏輯

缺點:

  • 有些段落過長,還是可能超過模型的 Token 限制
  • 切割後的長度不均

3. 重疊切割(Sliding Window / Overlap)

例如:每 500 個字切一段,但保留 50 個字重疊。

優點:

  • 減少重要資訊被切掉的機率
  • 提高查詢的上下文一致性

缺點:

  • 會增加向量數量(儲存成本變高)

長度設定的權衡

在實務上,我們需要平衡:

  1. 檢索準確度:切太長,向量過於「平均」;切太短,缺乏上下文。
  2. 效能與成本:切割越短 → 向量數量增加 → Pinecone / 向量庫成本增加。
  3. 模型限制:不同 LLM 有輸入 Token 限制(Gemini、GPT、Claude 都有上限)。

建議:

  • 一般文章:300 ~ 500 tokens
  • 技術文件 / 程式碼:150 ~ 300 tokens
  • 長篇文章:可以 500 ~ 800 tokens + overlap 50~100 tokens

範例程式:文章切割

使用 langchain.text_splitter.RecursiveCharacterTextSplitter

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 假設文章內容
article_content = """
前陣子有版友講到這個詞,倫巴底貸款(Lombard Loan)
台灣的銀行,是用 特定金錢信託受益權自行質借.這個名詞.
白話意思 {債券質押}

最近降息風聲漸起(上周大爆炸的PPI,也只讓降息預期降10%,現在還有84%的水準)
問過幾間銀行,很神奇的是,這個2020年金管會就開放的東西.
不少銀行的理專,不是不知道有這東西,就是不知道自家網頁也有寫
是不是很神奇........

1.永豐銀行:官網有寫.還做的十分精美.但問了信義區兩間分行
嗯....理專通通不知道這是什麼東西...打去總行客服...得到的回應是
北區要問西松分行...接著去問....西松的人也不太清楚

PS:最後的結論是 不能匯撥債券過去 只能自家購買承作 利率2.21%起

2.元大銀行:同上.官網有,但一堆理專不知道這東西.甚至問了全都沒下文.
這家確定有承做,因為我國泰營業員的客戶 有匯撥到這間...利率2.5%起
PS.這間是少數可以匯撥債券過去的銀行 只是理專一問三不知..

3.大樹銀行:老字號銀行..承作時間第二長..理專相對都知道這東西
最近限制越來越多..只能押三層..借款成數50%-80%不等 錯幣打九折
可能之前做太多這東西...有一些客戶出了點問題(前陣子 債券價格加上匯率)
現在審查嚴格許多...利率也幾乎沒競爭力2.95%

PS:不接受匯撥債券...利率看貢獻度 可以調降
   (我使用的銀行之一.由於之前三層以滿.所以後面陸續買的債券.都不能質押)

4.西瓜銀行:理專這方面的相關知識是有的...質借成數也是業界最高85成
利率2.3%起....很遺憾的這間我申請失敗....審核單位說收支比算不過....
這是我唯一碰到說 債券質押借款 要算收支比的.
(理專是說 因為合併 所以審查單位刁難)

PS.可以匯撥債券過去...

5.星X銀行:比大樹還早開始這項業務的銀行..他們會推薦借日幣 利率1.1%起
因為開啟特定質權要專投身分..星展現在有推 要是你是他們私人財富管理
免信用卡年費(飛行世界之極卡等高卡都免年費)

PS:不接受匯撥債券

6.渣渣銀行:今年開始想要推行的業務..懂得承作的理專不多....
甚至後台行政人員也不會弄這些...對於債券匯撥的知識十分匱乏
文件要求蠻嚴格的...利率是裡面最有競爭力的 符合條件下 1.8%

PS:可以接受匯撥債券...也沒有其他銀行 債券面額20萬這條件
缺點是你文件可能會簽到發瘋


其他沒提到的銀行 其實大部分官網都有這項業務...但懂得辦理的人
很遺憾我沒碰到.....

要開槓桿 請小心謹慎 借款只要不進房地產..炒股買債 都沒啥限制

"""

# 建立 Text Splitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,   # 每段 300 字元
    chunk_overlap=50  # 保留 50 字重疊
)

# 切割
chunks = text_splitter.split_text(article_content)

print("切割結果:")
for i, chunk in enumerate(chunks, 1):
    print(f"Chunk {i}: {chunk}\n")

上面的範例會呈現 PTT 文章在經過 chunk_size=300, chunk_overlap=50 切割後的段落。
可以自行調整大小,就可以發現哪個大小的效果可能會比較好。


今天我們討論了 RAG 切割文章長度 的關鍵考量:

  • 太長 → 模糊化,檢索不精準
  • 太短 → 語境不連貫
  • 建議落在 300~500 tokens + 適度 overlap

這樣設計能在「檢索效果」與「系統成本」之間取得平衡。

明天【Day 22】RAG 的文章切割策略 - 決定 PTT 文章切割長度 我會跟大家分享我是如何決定 PTT 文章切割長度的。


上一篇
【Day 20】封裝語意查詢流程 - 讓程式碼更乾淨且可維護
下一篇
【Day 22】RAG 的文章切割策略 - 決定 PTT 文章切割長度
系列文
一起來打造 PTT 文章智慧問答系統!27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言