宅中地 - 每日更新
宅中地 - 每日更新

贊助商廣告

X

一份文檔存下來,到底要花多少錢

2026年10月01日 首頁 » 熱門科技

先問你一個問題。你在網上搜索一份技術手冊里的某張表格,系統是怎麼在幾百萬份文檔里瞬間找到它的?

答案是:把每一頁都拆成一千多個小向量,存起來,搜索的時候拿查詢詞去和這些向量逐一比對,取最匹配的那個分數。這套辦法叫「後期交互一份文檔存下來到底要花多少錢」,是目前視覺文檔檢索里公認最準的方案。但它有個致命的副作用,儲存成本高得嚇人。

一份用ColPali一份文檔存下來到底要花多少錢模型處理過的頁面,會被拆成1031個向量,每個向量128維,光是這一頁存下來就要258KB。如果你有一百萬份文檔,光儲存就要占掉四分之一個TB,這還沒算上索引結構的開銷。這篇來自沙特阿卜杜拉國王科技大學(KAUST一份文檔存下來到底要花多少錢)團隊的論文,標題叫《Generative Late-Interaction Embeddings for Visual Document Retrieval》,講的就是怎麼把這個儲存成本打下來,同時不怎麼犧牲檢索精度。

**儲存壓縮這件事,之前的方法都卡在了同一堵牆上**

現有的壓縮方法思路都差不多:要麼把相似的向量合併成一個平均值(叫token pooling一份文檔存下來到底要花多少錢),要麼直接砍掉一部分不那麼重要的向量(叫剪枝一份文檔存下來到底要花多少錢),要麼把向量量化成更省空間的編碼。這些方法有個共同前提,壓縮後的表示,說到底就是原始向量集合的一個子集,或者是局部平均值。

問題是,這類方法有一個共同的天花板。幾乎沒有一個方法能在每頁儲存量低於16個向量的情況下還保持體面的精度,一旦硬要往下壓,效果就斷崖式下跌。想突破這個floor(下限)的辦法也有,但代價是要重新訓練整個編碼器模型,這意味著你之前存好的所有向量全部作廢,得重新跑一遍編碼流程。像MetaEmbed一份文檔存下來到底要花多少錢這類方法,訓練成本高達192個GPU小時。

這就像你家裡搬家,本來只想把沙發換個位置騰出空間,結果發現唯一的辦法是把整棟房子拆了重建。代價和收益完全不成比例。如果編碼器是免費的公開模型,你卻要為了省點儲存空間去重新訓練它,那省下來的錢可能還不夠訓練花的。

研究團隊沒有跟著這條路走,而是先問了一個更根本的問題:這些被存下來的向量,到底長什麼樣?

**被存下來的東西,其實是一張揉皺的紙**

研究者做了個幾何測量,測了三種不同的編碼器(ColPali、ColQwen2一份文檔存下來到底要花多少錢、Nemotron v2一份文檔存下來到底要花多少錢),跨越十個測試數據集,結果發現了兩個非常一致的規律。

第一,所有向量都精確地落在單位球面一份文檔存下來到底要花多少錢上。

嵌入向量一份文檔存下來到底要花多少錢:把一段文字或一張圖片轉換成的一串數字,這串數字在高維空間裡代表這段內容的「位置」。單位球面:所有長度(也就是向量的模)都等於1的向量所構成的空間,就像地球儀的表面,每個點到球心的距離都一樣遠。

這是因為編碼器在輸出時做了L2歸一化處理,所以所有向量的長度都被強制拉成1,它們只能分布在這個球面上,不能跑到球內部或球外面去。

第二個發現更關鍵:雖然每頁有1031個向量,理論上活動空間是128維(對Nemotron v2來說是3072維),但這些向量實際上只擠在一個五到六維的小角落裡。

內在維度:數據看起來占據了很大的空間,但實際上真正「有效」的自由度只有很小一部分,這個有效自由度的數量就叫內在維度。就像一張紙原本是二維的平面,但被揉成團之後,你在三維空間裡看它,它依然只是一張紙的自由度,不會因為揉皺就獲得第三個維度。

研究者用TwoNN算法測出來,ColPali的內在維度中位數是4.9,ColQwen2是5.1,Nemotron v2是6.1。三個編碼器的原始維度差了24倍(128對3072),內在維度卻幾乎一致。這說明這個數字不是測量方法帶來的假象,而是文檔頁面本身的屬性。作為對照,如果給頁面擬合一個高斯分布(數據形狀相同但沒有彎曲結構),維度會讀出32.2;如果是純隨機噪聲,讀出來是61.4。真實數據比這兩者都緊湊得多。

這就好比你拿到一份1031頁的會議記錄,本以為資訊量極其龐大,結果發現所有內容其實都能被壓縮成一份五六頁的提綱,剩下的一千頁說的都是提綱里那幾個點的變體和細節。如果你死記硬背全部1031頁,你浪費的是儲存空間;但如果你只記住了提綱,你丟掉的是那些具體的細節,而檢索恰恰需要這些細節里的某個表格單元格或某句圖注文字。這就是壓縮方法一直卡在16個向量以下的真正原因,傳統方法要麼記全部,要麼記提綱,沒有中間地帶。

**一個免費的修正:把球心裡的點拉回球面**

在講GLIE這個新方法之前,研究者先發現了一個順手就能改的bug。

傳統的聚類方法(k-means)會把一堆向量分組,每組用一個「質心」(centroid,也就是這組向量的平均位置)來代表。但問題來了:如果一堆點都精確地分布在球面上,它們的平均值會落在球的內部,而不是球面上。

論文給出了一個數學證明(Proposition 1):質心離球心的距離,恰好記錄了這一簇向量的分散程度。簇里的點越分散,質心就越往球心縮。這意味著,用這些質心去計算相似度分數時,會系統性地低估真實的匹配程度,因為質心的「長度」比真實向量短。

修正的辦法極其簡單:把質心重新投影回球面上就行了,除以自己的長度,讓它歸一化到1。這個操作幾乎不花任何計算代價,卻能帶來最高0.093的nDCG@5提升(這是檢索質量的評分指標,數值越高說明前幾個檢索結果越准)。

想像你要給一群站在圓形跑道上的人拍集體照,代表他們的「平均位置」。如果你直接把所有人的坐標取平均,算出來的點會落在跑道內側的草坪上,而不是跑道線上。如果不做任何修正,你後續所有基於這個「平均點」做的判斷,都會系統性地偏差,因為這個點根本不在跑道這個允許的範圍內。把它拉回跑道線上,是唯一符合物理約束的做法,而且這個修正的成本幾乎是零,不需要重新訓練模型。

**GLIE:不存全部細節,而是存一份能重新生成細節的說明書**

搞清楚了幾何結構之後,研究團隊提出了正題:GLIE(Generative Late-Interaction Embeddings,生成式後期交互嵌入)。

它的核心思路和之前所有壓縮方法完全不同。之前的方法是「抽樣」,也就是從1031個向量里挑出一部分或者取平均值存下來。GLIE換了個邏輯:既然一頁文檔的真實自由度只有五六維,那就只存少量幾個向量(比如4個)作為「描述」,但同時訓練一個小網路,讓它能在需要的時候把這幾個向量重新展開成全部1031個向量。

這個過程分兩步。第一步是訓練一個精煉器(refiner),它是一個只有一層的交叉注意力模組,初始化時權重為零。

零初始化:網路的某個輸出層參數一開始設為0,這樣網路在沒訓練之前完全不會改變輸入,相當於什麼都沒做。訓練開始後,這個層的參數才逐漸學習調整。

這意味著GLIE的起點,就是前面提到的球面修正後的質心,一分不差。訓練只會讓它變得更好,不會比這個起點更差,因為如果訓練沒有找到更好的方向,零初始化的輸出項就是零,代碼還是原來那個質心。這個設計保證了下限,GLIE不可能比免費的球面修正更差。

第二步更有意思:訓練一個解碼器(decoder),讓它能把這k個壓縮後的向量,重新展開生成全部1031個向量。這個解碼器有三個結構性保證。第一,每個簇分配的輸出槽位數量和真實簇的大小成比例,不是固定死的布局。第二,每個簇的0號槽位直接原樣輸出精煉後的向量,這保證了解碼後的向量集合一定包含壓縮前的向量集合,所以展開的過程只能新增證據,不可能丟失已有的證據。第三,生成的「孩子」向量離它的「錨點」最多偏移37度,防止它們亂飄到球面上完全不相關的位置。

這套系統聽起來複雜,但用一個類比就容易懂了。假設你是個建築師,客戶要一份能存進隨身碟、體積極小的設計圖紙,但施工的時候又需要完整的詳細圖紙。你的做法不是畫一份粗糙的草圖(那樣施工時細節全丟了),而是提煉出這棟樓的幾個關鍵參數,比如層高、開間尺寸、結構類型,再配一套「生成規則」,工地上真正要蓋某一層的時候,規則會根據這幾個參數把這一層的詳細圖紙重新畫出來。存下來的是參數加規則,不是整棟樓的每一根鋼筋位置,但需要的時候能精確地把鋼筋位置算出來。

**查詢的時候怎麼用:先粗篩,再精細復原**

GLIE的檢索流程也分兩步,這個設計是整篇論文裡「性價比」最高的地方。

第一步(Stage 1,檢索):拿查詢詞去和每一頁存下來的k個向量做匹配,給所有頁面評分排序,這一步的計算成本和其他壓縮方法差不多。

第二步(Stage 2,精細重排):只對排名前20的候選頁面(L=20),用解碼器把它們的k個向量展開回全部1031個向量,重新精確評分,重新排序。剩下沒進入前20的頁面,排名保持第一步的結果不變。

這個不對稱設計的關鍵在於,便宜的操作作用在所有頁面上,昂貴的操作只作用在極少數候選上。這就像醫院的分診流程,急診科不會讓每個病人都直接做核磁共振,那樣醫院會被拖垮,而是先做一輪快速問診篩掉大部分情況明確的病人,只有少數需要精細診斷的才進一步做昂貴的檢查。如果反過來,對所有病人都做核磁,準確率或許更高,但系統根本運轉不起來;如果只做問診不做精細檢查,一部分疑難病例就會被誤判。GLIE的兩階段設計正是在準確率和成本之間找到了這個平衡點。

**成績單:4個向量存一頁,能拿回近八成的精度**

論文在ViDoRe v1和v2兩個基準測試集上做了完整評估,v1包含十個子集,共3943條查詢。

在每頁只存4個向量(相當於1040字節,也就是1KB多一點)的極端壓縮條件下,GLIE的nDCG@5達到0.657,是未壓縮系統精度0.836的79%。同等條件下,此前最好的訓練無關方法(cluster merging,也就是不重新訓練模型的聚類合併方案)只能達到70%左右。

拉長到每頁64個向量時,GLIE達到0.811,是未壓縮精度的97%。整個壓縮梯度上,GLIE在每一個儲存預算下都超過所有基線方法。論文裡專門測了一個高查詢量的子集TAT-DQA(1663條查詢),存4個向量時GLIE領先第二名0.039到0.054分,這在資訊檢索的評分尺度里不是個小數字。

在ViDoRe v2上,規律略有不同。v1里有些子集精度已經接近飽和(0.94到0.98),所以高預算下GLIE的優勢逐漸變得不明顯,這是天花板效應,不是方法失效。但v2沒有哪個子集是飽和的,所以GLIE的優勢能一直保持到64個向量的預算。這說明GLIE帶來的收益到底能維持多遠,取決於任務本身還有多少提升空間,這是理解這篇論文結果時容易被忽略的一點。

論文還做了個「oracle」(理論上限)對照實驗:如果解碼器能完美重建向量,效果會是多少?在k=4時,oracle能拿到0.782,而GLIE實際拿到的是0.657,中間差了0.125分。這個差距被稱為「解碼保真度」的缺口,屬於未來改進解碼器還能挖出來的潛力。另外從oracle(0.782)到理論天花板(0.836)還有0.054的差距,這部分和候選池大小L有關,擴大候選池能縮小它,但論文測試發現擴大候選池到100時,oracle能漲到0.822,而GLIE的實際表現幾乎不動(只從0.658漲到0.660),說明當前解碼器並沒有充分利用擴大候選池帶來的資訊,這是留給後續研究的一個明確方向。

**和真的去重新訓練模型比,誰更划算**

論文專門做了個對照實驗,用同樣的訓練數據量(4000個查詢-頁面對)和相近的時間預算,一邊微調編碼器本身(復現了Light-ColPali的方法),一邊訓練GLIE的小網路。

結果相當出人意料:在同等預算下,微調編碼器的效果,甚至比不訓練、只做免費球面修正的效果還差。以k=4為例,微調方案得分0.544,免費球面修正得分0.605,GLIE得分0.657。

這個結果背後的原因並不複雜。微調方案訓練的是一個1330萬參數的LoRA適配器,要去調整一個30億參數的大模型,訓練預算只有1.5個GPU小時,這點數據量和時間,還不足以讓模型學到有效的改進,反而可能擾亂了原本訓練好的表示。而GLIE只有41.5萬參數,專門針對儲存和檢索這個具體目標去優化,訓練時間不到3個GPU分鐘,反而學得又快又穩。

這就像找一個剛入職的實習生去重新設計一整套公司財務系統(對應微調整個大模型),還是找一個資深會計去優化報銷單的填寫流程(對應訓練GLIE這樣一個小模組)。前者理論上權限更大、能改的東西更多,但如果只給他幾天時間和很少的培訓資料,他大概率會把系統弄得更亂;後者雖然只能改一個具體流程,但因為目標明確、範圍可控,反而能在有限時間裡做出實實在在的改進。

論文裡也提到,正版的Light-ColPali方法用13萬條查詢訓練了大約72個GPU小時,效果肯定比這裡復現的差版本好,這個對比不是否定原方法,而是說明在預算有限的情況下,凍結主幹模型、只訓練小型附加模組,是更實際的選擇。

**這個方法要多少訓練數據才夠**

一個容易被忽視但很重要的細節:GLIE的訓練數據需求極小。

研究者用1250、2500、5000頁訓練數據分別重新擬合了一遍模型,結果發現效果幾乎沒有變化(k=4時分別是0.048、0.052、0.049的提升)。這說明大約一千頁訓練數據就已經足夠,這個量級只有原始編碼器訓練數據的百分之一。

原因也回到了前面講的幾何發現:GLIE學的不是某個特定語料庫的內容規律,而是編碼器輸出向量的幾何結構,這個結構在不同語料庫之間是穩定的(論文表2里三個編碼器在十個不同類型的語料庫上,內在維度都穩定在同一個範圍)。既然學的是模型本身的「幾何脾氣」,用少量樣本就能摸清楚,餵更多數據並不會帶來額外收益。

**這套辦法換個模型還靈不靈**

研究團隊沒有隻在一個編碼器上驗證,還在ColQwen2這個更強的編碼器上重複了整個實驗流程。結果顯示,在k=4時,GLIE保留了未壓縮精度的82%,在十個子集裡的十個都比基線方法好(除了k=2時是7/10)。

不過這裡有個值得琢磨的細節:ColQwen2本身更強,它的原始聚類效果已經比較接近天花板了,所以GLIE能挖出來的提升空間自然更小更平緩。這說明GLIE帶來的收益大小,一定程度上取決於基礎編碼器本身還留有多少「沒被榨乾」的空間,一個已經很優秀的模型,留給後處理方法的舞台自然會小一些。

**消融實驗:到底是哪個部件在起作用**

論文把整個系統拆開,一塊一塊地測試貢獻。球面修正這個免費操作貢獻最大,從+0.093(k=4時)到+0.030(k=64時)。學習到的編碼本身再疊加+0.044到+0.016的提升,但在k=16以上就不再有額外貢獻了。生成式解碼器在極端壓縮預算下貢獻最突出,k=4時能加0.016分。

有意思的是,研究者還測試了解碼器的網路規模,從18.4萬參數到1300萬參數,橫跨70倍的差距,結果發現精度波動最多不超過0.009分,而且沒有隨參數增多而單調提升的趨勢。這說明目前的性能瓶頸根本不在於網路夠不夠大,而在於設計思路本身是否恰當。花更多算力堆參數量,在這個階段是無效投入。

**寫在後面**

讀完這篇論文,最觸動我的其實不是那個壓縮比數字本身,而是研究團隊解決問題的路徑:他們沒有一上來就設計一個更複雜的壓縮算法,而是先花時間去測量「被壓縮的東西到底長什麼樣」。這是一種很樸素但常被忽略的科研直覺,遇到工程瓶頸,先別急著優化,先搞清楚問題的物理結構。

論文裡那個質心偏離球面的證明(Proposition 1)也讓我意外,這是一個純數學的小發現,卻直接解釋了為什麼之前那麼多聚類壓縮方法都存在系統性偏差,而修正它幾乎不需要任何計算成本。這種「免費的午餐」在工程領域並不常見,多數時候免費的東西早就被別人拿走了,能找到這樣一個被忽視的角落,說明大家可能太習慣把k-means當成理所當然的工具,很少有人去問它在球面數據上是否依然成立。

還有一點值得琢磨:論文最後坦承,擴大候選池能讓oracle的效果繼續漲,但GLIE實際上沒能把這些額外資訊用起來,解碼器沒有跟上。這種誠實地展示局限、把問題留給讀者的做法,比強行把所有指標都吹成完美,更讓人願意相信這項工作。

一份文檔能被壓縮到多小,取決於它本身到底藏了多少資訊。當你發現一千多個向量原來只是五六個自由度的不同投影時,你大概會重新思考,我們平時存下來的那些看似龐大的數據,究竟有多少是真正的資訊,又有多少只是同一個骨架的不同摺疊方式。

Q&A

Q1:GLIE是什麼,它解決了什麼問題?

A:GLIE(生成式後期交互嵌入)是KAUST團隊提出的一種視覺文檔檢索壓縮方法,它不再像傳統方法那樣直接儲存或平均文檔的向量子集,而是只存幾個向量作為「說明書」,需要時用解碼器重新生成完整的向量集合,從而在極端壓縮比下仍保持較高檢索精度。

Q2:GLIE需要重新訓練大模型嗎,成本高不高?

A:不需要。GLIE的編碼器全程凍結,只訓練一個41.5萬參數的小型網路,用一千頁數據、不到3個GPU分鐘就能完成擬合,比重新微調整個大模型(通常要幾十上百GPU小時)便宜得多,效果反而更好。

Q3:每頁只存4個向量,檢索效果還能有多好?

A:在ViDoRe v1基準上,GLIE每頁只存4個向量時,nDCG@5達到未壓縮系統的79%,明顯超過此前最好的免訓練壓縮方法(約70%);存到64個向量時能恢復到97%。

宅中地 - Facebook 分享 宅中地 - Twitter 分享 宅中地 - Whatsapp 分享 宅中地 - Line 分享
相關內容
Copyright ©2026 | 服務條款 | DMCA | 聯絡我們
宅中地 - 每日更新