
2024年前后,如果你想做一个能读懂PDF页面、能理解发票和表格的AI检索系统,你几乎绕不开一条路:找一个别人训练好的视觉编码器,比如SigLIP,再找一个别人训练好的语言模型,把两者拼在一起。
这条路走的人太多了,多到大家已经忘了问一句:这样拼出来的东西,真的是最优解吗?
ColPali就是这条路上最有名的例子之一。它把视觉文档检索这件事做得相当漂亮,用图像patch的方式保留了页面的细粒度信息,不再需要OCR提取文字。但它的骨架是一个27亿参数的视觉语言模型,本来是为"生成文字"这种任务设计的因果解码器架构。现在你只是想让它做检索,也就是给一张图片和一段文字打个相似度分数,却依然要背着这么重的计算包袱。
这就好比你只是想量一下体重,却非要开一辆越野车去五公里外的体重秤,因为这辆车里恰好装着一个体重秤模块。车能到,任务能完成,但那台车的油耗和维护成本,你每次用都要付。
H Company的两位研究者Aurélien Lac和Tony Wu决定换一种活法。他们的想法很直接:既然最终要做的是理解和检索,不是生成,那为什么不从零开始训练一个真正为理解设计的双向编码器,让文字和图片patch从第一层开始就共用同一套神经网络,而不是分别处理完再强行拼接?
这就是NeoMME的起点。
图片和文字的婚姻史:为什么"拼接"总是别扭
要理解NeoMME在做什么颠覆,得先看看多模态模型这些年是怎么处理图文关系的。
最早也是最经典的路子是双塔结构,代表是CLIP和SigLIP。
双塔编码器:图片走一条独立的视觉神经网络,文字走一条独立的文本神经网络,两条路互不相干,最后各自输出一个向量,靠计算这两个向量的相似度来判断图文是否匹配。
双塔结构的好处是图片可以提前批量编码好存起来,检索时飞快。但它的代价是图片和文字在整个处理过程中几乎没有交流,只在最后见了一面。如果一张发票图片里"总金额"这个词恰好被文字理解成了别的意思,双塔结构很难纠正,因为两条路径压根没机会互相校对。
第二条路是生成式视觉语言模型,比如Flamingo、LLaVA、Qwen2-VL这些。它们把一个预训练好的视觉编码器的输出,投影后喂给一个因果语言模型的解码器。
因果解码器:这是一种只能从左往右看的神经网络,处理第N个词时只能参考前面的词,看不到后面的内容,这正是生成连贯文字所需要的机制,但也意味着它天生不擅长"回头审视全局"。
ColPali、ColQwen2这些视觉文档检索模型走的就是这条路,它们直接把生成式VLM拿来当编码器用。问题是,检索任务需要的是双向理解,你要判断一段文字和一张图片整体上匹不匹配,理想情况下应该能同时看到全部的文字和全部的图片信息,而不是被因果解码器那种"只能往前看"的机制束缚住。用生成模型做检索,多少有点让短跑运动员去跑马拉松,能跑,但不是他最擅长的姿势,而且体重比专业马拉松选手重了一大圈。
ModernVBERT算是一次折中,它把因果解码器换成了双向编码器,但依然保留了一个预训练好的SigLIP2视觉塔。这一步已经证明250M参数的模型也能做视觉文档检索,是个重要的中间成果。
NeoMME走得更彻底。它没有用任何预训练好的视觉编码器,图片被切成32×32像素的小块之后,直接经过一个简单的两层MLP投影,跟文字token一起,从第一层开始就共享同一个双向Transformer。
单塔架构:图片和文字不再分头处理,而是被投影到同一个空间后,混在一起送进同一套神经网络层,每一层都能同时看到图片信息和文字信息,也能互相调整彼此的表示。
这就好比两个人一起做一道需要配合的菜,双塔模式是各自在自己的厨房把菜做好,最后端到一张桌子上摆盘,生成式VLM模式是一个大厨掌勺,另一个人只能在旁边递东西不能改配方,而NeoMME是两人从切菜那一刻起就站在同一个案板前,随时能互相纠正对方的火候。如果不这样设计会怎样?实验里有个细节能说明问题:研究者最初尝试过用48像素的大patch加线性投影层这种更简化的方案,结果发现在260M规模的实验中,文本阅读能力明显变差了,很可能是因为每个token要压缩的图像区域太大,细节丢失了。这说明patch大小和投影方式的选择不是随便定的,而是关系到模型到底能不能"看清字"。
模型有两种体型:260M参数版和800M参数版。为了保持效率,NeoMME用了不少精巧的工程设计。比如文字词表用了ALBERT风格的因式分解嵌入,先压缩到256维再投影回模型宽度,这样能省下大量参数。再比如两种尺寸的模型都支持16384个token的上下文,足够塞进两张4K UHD分辨率的图片。
一个"看不见图片却要靠图片答题"的训练游戏
光有架构还不够,NeoMME真正巧妙的地方在于它的预训练方式。
传统的BERT用的是掩码语言建模:随机遮住15%的词,让模型猜出被遮住的是什么。NeoMME用的是一种更激进的变体,叫掩码离散扩散。
掩码离散扩散:和BERT固定遮住15%不同,这种方法会随机采样一个"腐蚀率",可能是30%、也可能是90%,然后按这个比例遮住文字,让模型去恢复。腐蚀率越高,模型能依赖的上下文线索就越少。
关键的设计在这里:对于纯文字样本,腐蚀率从0到100%之间随机取;但对于图文混合样本,腐蚀率的下限被提到了30%,也就是说最少也要遮住三成的文字。
为什么要这么做?因为研究者发现一个很现实的问题,如果文字被遮的比例太低,模型很容易只靠剩下的文字上下文就能猜出被遮住的词,根本不需要看图片。这就像考试时如果每道填空题旁边都留了太多提示,学生压根不需要认真读题干里配的那张图表,靠蒙都能蒙对。研究者把腐蚀率下限拉高到30%,相当于把提示大幅减少,逼着模型不得不去看图片才能填对空。
那这套机制到底有没有生效?研究团队专门设计了一个探针实验来验证,办法很朴素:同一段被遮住的文字,跑两遍模型,一遍带着真实的图片patch,另一遍把图片换成全零的空白张量,然后比较两次预测的准确率差多少。
结果显示,两个模型在所有测试的腐蚀率下都表现出正的"图像增益",而且腐蚀率越高,这个增益越大。在90%遮蔽率的极端情况下,260M模型的图像增益达到38.4个百分点,800M模型达到40.5个百分点。这意味着当文字线索几乎被清空时,模型确实会转向依赖图片内容来完成预测,这不是巧合,是训练机制逼出来的行为。
更有意思的是,研究者还顺手测试了这个预训练模型有没有"意外"学会一点生成能力。虽然NeoMME从没被专门训练做图像描述或OCR,但研究者从一张全被遮住的空白文字画布开始,配上一张真实图片,让模型一步步猜出并揭示token,居然真的生成出了合理的图片描述,比如"一个木质庭院里摆着躺椅和摇椅,背景有树木和山脉",这跟图片内容对得上。这算是意外之喜,说明模型在学习"用图片信息填文字空"的过程中,副产品般地积累了一定的图像理解能力,尽管这不是它被设计出来要干的事。
两个脑子共用一个身体:检索时的双头设计
预训练完成之后,接下来要解决的是怎么把NeoMME变成一个能真正干活的检索工具,也就是NeoMME-Retriever。
这里涉及到检索领域一个经典的权衡问题。
密集向量检索:把整个文档压缩成一个固定长度的向量,检索时只需要比较向量间的点积,速度快,能用近似最近邻索引处理十亿级的语料库,但因为是"压缩",细粒度的信息会丢失。
后期交互:又叫Late-Interaction,不把文档压缩成一个向量,而是给每个token都保留一个向量。检索时,查询的每个token都会去文档里找最匹配的那个token,取最大相似度,再把所有查询token的最大值汇总成最终分数。这样能保留token级别的匹配细节,但存储成本和计算成本都更高,因为向量数量和token数量成正比。
ColBERT和ColPali用的都是后期交互,这也是为什么它们在视觉文档检索上表现出色,因为一页发票或合同里,关键信息往往集中在几个词或几个局部区域,压缩成一个向量很容易把这些细节冲淡。
NeoMME的做法是,不做选择,两个都要。同一次骨干网络前向传播,同时产出一个后期交互的多向量表示和一个密集的单向量表示,两个头共享底层计算,只在最后加了一层投影和归一化,几乎不增加额外开销。
这就好比一台相机同时能拍高清原图和自动生成的缩略图,两种输出用的是同一次快门,而不是拍两次。用户可以根据场景选择用哪个:语料库小的时候,直接用后期交互做精细检索;语料库大到十亿级别,先用密集向量在近似索引里快速筛出候选,再用后期交互对候选重排序,这是检索领域常见的多阶段设计思路。
值得一提的是,研究者做了一个消融实验来验证联合训练两个头是不是真的有好处。结果显示,联合训练让后期交互在ViDoRe v3上的nDCG@10提升了1.38个百分点,而且这个提升在统计上是显著的,95%置信区间是1.11到1.67个百分点。但密集检索这边的提升几乎为零,在BEIR-15上甚至有所下降。这说明这不是"1+1=2"的简单叠加,而更像是密集目标单方向地帮助了后期交互的学习,具体机制论文里没有深入解释,留了个值得追问的口子。
Dense width 260M v3 260M v2 260M v1
128 0.3607 0.4063 0.7461
256 0.3761 0.4133 0.7568
512 0.3864 0.4228 0.7668
1,024 0.3907 0.4334 0.7691
数字不会撒谎:小模型也能打赢大块头
说了这么多设计理念,最终还是要看跑分。
在视觉文档检索的核心测试集ViDoRe v3上,NeoMME-260M拿到了0.523的nDCG@10分数,打败了所有参数量严格小于800M的模型。更值得玩味的是,这个分数距离3.75B参数的ColQwen2.5只差0.2个百分点,而ColQwen2.5的体量是NeoMME-260M的14.4倍。
模型 参数量 ViDoRe v3 (nDCG@10) ViDoRe v2 (nDCG@5) ViDoRe v1 (nDCG@5)
ColModernVBERT 250M 0.261 0.407 0.806
ColSmol-256M 256M 0.207 0.348 0.797
NeoMME-260M 260M 0.523 0.522 0.860
Vultron Flash 850M 0.565 0.604 0.882
NeoMME-800M 800M 0.556 0.559 0.874
ColQwen2.5-v0.2 3.75B 0.524 0.601 0.895
ColPali v1.3 2.92B 0.430 0.547 0.848
从表格里能看出一个很清楚的规律,参数量往上堆并不总是带来对应比例的收益。NeoMME-800M比260M版本大了3倍,但nDCG@10只提升了3.3个百分点。这说明架构效率和数据质量,可能比单纯堆参数更值得琢磨。
在编码速度上,NeoMME-260M在NVIDIA L40S上处理2048×2048分辨率的页面时,达到每秒51.3页,是ColModernVBERT的1.97倍。文本检索方面,在BEIR-15基准上,后期交互头比密集头高出18到14个百分点不等,说明多向量表示确实是更强的那一个。
把1.5MB压缩成6KB:检索系统真正落地要过的一关
跑分好看只是第一步,真正决定一个检索系统能不能大规模部署的,是存储成本。
高分辨率图片编码出来的后期交互表示,向量数量会随着图片patch数量线性增长。一个2048×2048的页面能产生超过4000个向量,每个向量128维,用float32存储的话,单个文档能占到1.5MB左右。如果语料库里有几百万份文档,这个存储开销会迅速变得不可承受。
NeoMME用了两招来压缩这个体积。
第一招叫层级化token池化,思路是把相似的文档向量聚类,然后用聚类中心的均值代替原来那一堆向量。比如一个池化因子为8的设置,就是大致把8个相似向量合并成1个。研究发现,在池化因子为10的情况下,260M模型依然能保留99.2%的原始检索质量,800M模型保留98.9%。这个容错空间比原本预期的要宽松得多,论文里推测,可能是因为页面图片里存在大量冗余的patch表示,比如大片空白背景或重复的表格线条,这些区域本来就该被合并。
第二招叫非对称量化,核心逻辑是查询只需要编码一次,而文档要存一辈子,所以把查询保持相对高精度,把文档压到极致低精度。具体做法是把查询压缩成int8整数,文档压缩成二进制的0和1。
配置 nDCG@10 存储大小
float32查询 / float32文档 0.5226 1536.7 kB
int8查询 / int8文档 0.5224 390.2 kB
int8查询 / 二进制文档 0.5068 48.0 kB
把这两招叠加起来用,在池化因子8加上int8查询、二进制文档的组合下,存储从1536.7KB压缩到6.0KB,压缩比高达255.5倍,同时还能保留95.19%的原始检索质量。
这就好比原本要用一整个书架存放的资料,现在压缩进了一个信封,而且信封里的信息依然能回答绝大部分你想问的问题。如果不做这两步压缩会怎样?按照原始存储量估算,一个千万级页面的企业文档库,索引体积会膨胀到数TB,这在很多实际部署场景里是根本无法承受的成本。
一些没被写进摘要的诚实细节
论文里有几处地方,作者没有回避自己的局限性,这点值得单独说说。
比如NeoMME的预训练数据量,总共约524B个打包token,而作为对比的ModernBERT用了大约2T个纯文本token,差了大概七倍。作者坦承,更长的训练周期或许能进一步释放模型的潜力,但这次的研究受限于时间和算力,没能验证这一点。
再比如检索训练的数据规模,NeoMME用了大约430K纯文本查询样本和850K图文查询样本,而对比的mLateOn系统处理了约6.6亿个对比查询-文档样本,外加1600万个多语言难负例样本。这个数量级的差距意味着,NeoMME在BEIR-15文本检索上的成绩,很可能还有相当大的提升空间没被挖掘出来。
还有一个有意思的失败面:NeoMME在自然图像分类任务上表现平平,frozen 16-shot探针在10个自然图像分类任务上平均只有13.2的准确率。这不难理解,因为预训练目标从来没有直接针对图像本身设计任何损失,图片patch全程保持可见,只是被用来辅助预测被遮住的文字,没有像素重建、没有图像分类、也没有图像级对比学习。相比之下,在文档图像的RVL-CDIP任务上,即便只用6000个样本微调,准确率也能冲到81.5%,这说明模型确实更擅长它训练时见过的那种数据类型,文档图像,而不是随手拍的猫猫狗狗照片。
Q&A
Q1:NeoMME是什么?
A:NeoMME是H Company研发的多模态多语言编码器,260M和800M两种参数规模,把图片patch和文字token放进同一个双向Transformer中共同处理,不依赖任何预训练好的视觉编码器,专为高效检索和微调设计。
Q2:NeoMME-Retriever和ColPali相比有什么优势?
A:NeoMME-Retriever参数量更小但性能接近甚至超过更大的模型,260M版本在ViDoRe v3上拿到0.523分,接近3.75B参数的ColQwen2.5,同时在L40S显卡上编码速度是ColModernVBERT的近2倍,且支持后期交互和密集检索双表示。
Q3:NeoMME如何压缩检索存储成本?
A:通过层级化token池化合并相似向量,再结合非对称量化把查询压成int8、文档压成二进制,两者叠加能把单页文档的存储从1.5MB压缩到6KB,压缩比达255倍,同时保留95%以上的检索质量。







