在RAG應用開發中,第一步就是對于文檔進行chunking,chunk質量會直接決定整個RAG檢索的質量。
過去,行業通常會采用先chunking再embedding,最后檢索、生成的思路進行。
但這個思路中,在chunking環節,無論是固定長度分塊,還是遞歸分塊,其實都解決不了精度和上下文的平衡的問題。
在此背景下,先embedding再chunking的思路逐漸被更多人接受。
典型代表是Jina AI提出的Late Chunking策略,以及Max–Min semantic chunking。Late Chunking詳見Late Chunking×Milvus:如何提高RAG準確率
本文將對Max–Min semantic chunking進行重點解讀。
01
常見chunk思路解讀
一個典型的RAG流程是這樣的:
第一步,數據清洗與處理:對元數據去除無關內容(如頁眉頁腳、亂碼),統一格式,并將長文本分割成短片段(如 500 字 / 段),避免向量表示時丟失細節。
第二步,向量生成與存儲:用embedding模型(如 OpenAI 的 text-embedding-3-small、LangChain 的 BAAI embedding)將每個文本片段轉換成向量(Embedding)然后將其存儲到向量數據庫(如 Milvus、Zilliz Cloud),數據庫會通過不同索引方式優化語義檢索效率。
第三步,查詢:將用戶的自然語言查詢(如 “RAG 如何解決大模型幻覺問題”)通過相同的embedding模型轉換成向量后,向量數據庫根據查詢向量,快速找到語義最相似的Top-K 個文本片段。
第四步,生成回答:將檢索到的 Top-K 文本片段作為上下文,和用戶的原始查詢一起拼接成提示詞(Prompt),傳給大模型,大模型據此生成回答。
在這個過程中,高效的文檔分塊是整個流程中的第一步,它將文檔拆成小塊(一個段落、一節或一組句子),可以有效的提高后續召回內容的準確性與細節豐富度。
但做好一個高質量的chunking并不容易。
目前行業有兩種常見的分塊方法:
固定大小分塊:簡單粗暴,按固定的字符數或token數來切分。優點是效率高,但沒有語法和語義意識,隨便切割,容易讓句子甚至單詞斷裂,直接導致不連貫。
遞歸字符分塊:這個思路比固定大小聰明些,按優先級比如段落、換行符、句子等逐步切分。它會先按段落切分,如果段落太大,就會遞歸地按換行符、句子等切分。優點是簡單且有語義感,能保證塊內的一定連貫性,但可能仍然存在斷層。但是部分文檔可能缺乏清晰結構,或章節、段落長度差異過大,這會影響檢索算法向 LLM 提供最優相關文本的能力;此外,該方法還可能生成超出 LLM 上下文窗口的分塊。
以這兩種方式進行分塊的時候,我們經常要考慮兩個問題:精度和上下文的平衡。
越小的塊,精度越高,但上下文可能不全;越大的塊,語境更完整,但可能包含太多無關信息。
2025年Bhat等人的研究發現,分塊大小這個問題沒有標準答案,但整體上,事實類問題適合小塊(64-128 token),而敘事類問題則適合大塊(512-1024 token)。
有沒有更聰明一點的辦法?不要完全被長度限制的分塊思路?
答案是有的——Max–Min semantic chunking。
論文鏈接:https://link.springer.com/article/10.1007/s10791-025-09638-7?utm_source=chatgpt.com
02
Max–Min semantic chunking 解讀
Max–Min semantic chunking的核心是通過動態語義評估來實現分塊優化。
相比傳統RAG流程,先chunking再embedding,Max–Min semantic chunking會先對所有句子進行embedding,然后在此基礎上進行分塊。
Max–Min semantic chunking會將分塊任務視為動態 / 時序聚類問題:基于句向量的相似度,將不同句子組合成新的分塊。
但與傳統聚類方法不同,該方法需尊重文檔中句子的時序性—— 即同一聚類內的句子必須連續。算法會按順序逐句處理文檔,決定每個句子是加入當前分塊,還是開啟新分塊。
具體步驟如下:
生成embedding并初步聚類:首先使用文本嵌入模型,將所有句子映射到高維空間。設文檔包含 n 個句子,通過計算,已將前n-k個句子歸入當前分塊 C。此時需決策:n-k+1個句子,是加入分塊 C,還是創建新分塊。
計算分塊內最小相似度:計算當前分塊 C 內所有句子向量間的最小 pairwise 余弦相似度,識別分塊內語義最不相似的句子對,衡量分塊內句子的關聯緊密程度,進而判斷新句子是否與分塊內句子足夠相似。
計算新句子與分塊的最大相似度:計算當前分塊 C 內所有句子的最大余弦相似度,對比新句子與現有分塊的最高語義相似度。
分塊決策依據:核心決策邏輯為:若分塊 C 內的最小相似度小于新句子與分塊 C 的最大相似度,則新句子加入分塊 C,否則開啟新分塊。
閾值調整(分塊大小優化):對于如何調整塊內語義相關度,我們可以動態調整分塊大小、相似度閾值等等參數。
初始化處理(分塊中僅有單個句子時):當當前分塊僅包含 1 個句子時,需特殊處理初始化問題,直接對比第一句與第二句相似度與我們設置的閾值常數,高于常數就算入同一個分塊,低于這個常數就開啟新的分塊。
03
Max–Min semantic chunking的優劣勢
Max–Min semantic chunking的創新點一共有三:
動態分塊邏輯:摒棄固定尺寸或結構依賴的靜態規則,以 “句子語義相似度” 為核心決策依據。具體流程為:先計算當前分塊內句子的最小語義相似度(衡量分塊內語義關聯的下限),再計算新句子與當前分塊的最大語義相似度(衡量新句子與分塊的適配度);若最大相似度高于最小相似度,則將新句子納入當前分塊,否則啟動新分塊。
輕量化參數設計:僅需調整 3 個核心超參數(最大分塊大小、一二句之間的最低語義相似度需求、新句子與塊內句子最大相似度的最低門檻),且超參數邏輯與分塊大小自適應 —— 分塊規模越大,新句子納入的閾值越高。
計算資源復用:復用 RAG 系統原生所需的 “句子嵌入向量”(無需額外計算嵌入),僅在分塊階段增加輕量化的余弦相似度計算,整體計算開銷低于傳統語義分塊方法。
但Max–Min semantic chunking方法也有其不足,因為是依據時序聚類,因此處理長文檔時可能會丟失文檔中長距離的上下文依賴關系。
如果關鍵信息散落在多個文本塊中,脫離上下文的文本分塊片段很可能失去其原有的意義,導致后續的召回效果比較差。
以Milvus 2.4.13 release note為例,假如分為如下兩個文檔塊,如果我們要查詢Milvus 2.4.13有哪些新功能?,直接相關內容在分塊2里,而Milvus版本信息在分塊1里,此時,Embedding 模型很難將這些指代正確鏈接到實體,從而產生質量不高的Embedding。
原文鏈接:https://blog.csdn.net/weixin_44839084/article/details/154050365