昨天我們學會了用 Embedding 和 Faiss 來進行語意檢索。但實務上,如果我們把整份 10 萬字的文件直接算成一個向量,那搜尋出來的結果會極度失真,AI 依然找不到重點。
因此,在進行向量化之前,我們必須像廚師備料一樣,把龐大的文件切碎。這個過程就叫做 Chunking(文本切塊)。
1. 考驗演算法邏輯的 Chunking 策略
把字串切開聽起來很簡單,實作起來卻非常考驗工程師對字串處理與邊界條件(Boundary Conditions)的掌握,這就像是在解一題進階的字串操作演算法:
固定長度切塊 (Fixed-size Chunking): 最直觀的做法,每 500 個字元切一刀。缺點是極容易把一句完整的話或一個專有名詞從中間硬生生切斷,導致語意碎裂。
重疊策略 (Overlap): 為了解決上述斷句問題,我們會在切塊時保留 10%~20% 的重疊字數(例如 Chunk 1 包含字元 0-500,Chunk 2 包含 450-950)。這能確保上下文語意的連貫性。
語意切塊 (Semantic Chunking): 更進階的做法是寫 Regular Expression (正規表達式),根據 Markdown 的 ## 標題、段落換行符號 \n\n,或是句號來進行切分,確保每一個 Chunk 都是一個完整的邏輯單元。
2. Java 開發者的最強後盾:LangChain4j
看到這裡你可能會想:「這些切塊邏輯、呼叫 Embedding API、存入 Faiss 的流程,難道都要我自己用 Java 的 String.substring 從頭手刻嗎?」
千萬不要重複造輪子!在 Python 圈有著名的 LangChain,而在我們熟悉的 Java 生態系中,則有極度活躍的開源框架 LangChain4j。
LangChain4j 完美融合了 Java 的強型別與物件導向特性。它內建了多種 DocumentSplitter,只要短短幾行程式碼,就能幫你優雅地處理繁瑣的重疊與換行切塊邏輯,並直接封裝成完整的 Document 物件供後續操作。
掌握了資料的刀工與好用的框架,第一與第二階段的底層技術已經完備。接下來,我們將要跨出純程式碼的世界,進入視覺化的開發戰場!