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