Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
經過前面 20 天的努力,我們已經完成了一個完整的 PTT RAG 智慧文章檢索系統,從資料爬取、向量化、到基礎的問答流程都跑得起來。雖然系統已經能夠回答基本問題,但裡面還有很多細節值得深入探討。
因此,接下來的最後幾天,我會帶大家一起更仔細地拆解這套系統,包含設計上的取捨、模組間的串接方式,以及一些在實務中遇到的坑與最佳實踐。希望能讓大家不只是「跑得動」,更能理解背後的設計邏輯,方便未來自行延伸或優化。
在 RAG(Retrieval-Augmented Generation) 系統中,文章內容需要先轉換成向量,存放到向量資料庫裡。
但是:
因此,如何切割文章內容,是影響 RAG 檢索效果的重要關鍵。
例如:每 500 個字或 500 個 Token 就切一段。
例如:以段落(paragraph)、句號(.)、換行符號(\n\n)當分界。
例如:每 500 個字切一段,但保留 50 個字重疊。
在實務上,我們需要平衡:
使用 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 切割文章長度 的關鍵考量:
這樣設計能在「檢索效果」與「系統成本」之間取得平衡。
明天【Day 22】RAG 的文章切割策略 - 決定 PTT 文章切割長度 我會跟大家分享我是如何決定 PTT 文章切割長度的。