返回知识库
0

title: "「NeoMME」:高效的多模态原生与多语言编码器"
source_url: "https://huggingface.co/blog/Hcompany/neomme"
excerpt: "公共早报 Hcompany 推出了 NeoMME,这是一系列紧凑的 260M/800M 多语言多模态编码器,通过单一双向 Transformer 原生处理文本和图像,在 ViDoRe 上实现了顶尖的视觉文档检索性能,同时存储开销大幅降低,吞吐量远超以往模型。"


我们推出 NeoMME,这是一个包含 260M 和 800M 两种规模的多语言多模态编码器系列。与许多生成式视觉语言模型不同,NeoMME 不使用单独的预训练视觉塔(vision tower)或因果语言模型。单一双向 Transformer 同时处理文本标记和原始图像块,我们使用掩码离散扩散目标从头开始训练整个模型。

我们使用 ColPali 的页面图像方法对 NeoMME 进行了视觉文档检索微调。NeoMME-Retriever 在一次前向传播中返回密集嵌入和晚交互(late-interaction)嵌入。两种模型规模在 ViDoRe v3 的 nDCG@10 与模型规模的帕累托前沿上均有一席之地。在 NVIDIA L40S GPU 上以 2048×2048 图像输入尺寸运行时,260M 模型每秒编码约 51 页,约为 ColModernVBERT 吞吐量的两倍。分层标记池化和非对称量化将晚交互索引存储从每页约 1.5 MB 减少到 6 kB(缩小 255 倍),同时保留超过 95% 的基线 nDCG@10。

NeoMME 已在 Hugging Face Transformers 中可用。我们以 Apache 2.0 许可证发布所有模型检查点。

为什么还需要另一个多模态编码器?

许多近期的视觉文档检索器都改编自预训练的生成式视觉语言模型。单独预训练的视觉编码器产生视觉特征,然后由投影层将视觉特征映射到语言模型的输入空间。因果解码器随后处理组合后的图像和文本表示。检索、分类和标记标注并不以自回归方式生成文本,因此它们不需要因果解码器,也不需要这种架构的参数和计算开销。

ModernBERT 为双向编码器带来了高效的架构和训练改进。对于视觉文档检索,ModernVBERT 应用了双向 ModernBERT 风格的文本编码器,同时保留了单独的预训练 SigLIP2 视觉塔。我们希望通过设计和训练一个多模态编码器来进一步推进这一方向,而无需继承 VLM 的参数和计算开销。

NeoMME(发音为 "nee-oh-me",IPA /ˈniː.oʊ.mi/)是一个多语言多模态基础编码器,使用单一 Transformer 编码器为输入文本和/或图像生成向量表示。它不基于任何现有的预训练视觉塔、文本编码器或文本解码器。

双塔、VLM、ModernVBERT 和 NeoMME 输入路径对比 与双塔和 VLM 编码器不同,NeoMME 在一个双向 Transformer 中处理图像块和文本标记,无需预训练视觉塔、预训练文本编码器或预训练文本解码器。

图像和文本使用相同的计算路径,因此 NeoMME 可以更轻松地支持跨两种模态的预训练、微调、并行化和服务。

NeoMME 编码器骨干网

一个处理图像和文本的 Transformer

NeoMME 有两种规模:260M 和 800M。两种变体共享相同的架构:

  • 原生多模态输入: 文本输入使用分解的标记嵌入,图像被分割为非重叠的 32×32 块网格并用小型 MLP 投影。两者进入同一个 Transformer 编码器。

  • 动态图像分辨率: 图像保持其宽高比和尺寸。这允许模型在高分辨率、信息密集的文档页面上使用更多标记,而不是在内容较少的小图像上。

  • 长双向上下文: 两种模型的上下文长度均为 16,384 个标记(足以处理两张标准 3840×2160 4K UHD 图像)。大多数层使用对称滑动窗口注意力,而每隔第六层和最后一层使用全局注意力。

  • 现代编码器栈: NeoMME 使用近期的编码器改进,包括分组查询注意力、查询-键归一化、门控注意力、二维旋转位置嵌入和平方 ReLU MLP 等。

  • 多语言文本: 我们从头开始使用多语言文本、代码、数学和机器生成的图像转录数据训练了一个 131k 词表大小的 BPE 分词器。

NeoMME 编码器栈中交替的滑动窗口注意力和全局注意力层 NeoMME 编码器栈中交替的滑动窗口注意力和全局注意力层。

通过掩码文本从图像中学习

我们从头开始将 NeoMME 预训练为离散掩码扩散文本去噪器。对于每个纯文本示例,我们从 0 到 1 之间均匀采样一个腐败率。然后以该概率独立地对每个符合条件的文本标记进行掩码。

多模态示例使用的腐败率在 0.3 到 1 之间。图像块保持可见,而 NeoMME 重建被掩码的文本。在轻度掩码下,模型通常可以从周围文本中恢复丢失的词。例如,"cat" 可以是"The [MASK] sat on the mat"的合理补全,即使没有图像也是如此。但在高掩码率下,模型被迫学习基于图像的描述,从非掩码输入文本标记中获得的信号很少或没有。

文本腐败对 NeoMME 可用的文本和视觉证据的影响 更高的文本腐败率消除了纯语言捷径,并鼓励 NeoMME 利用可见的图像证据。

预训练混合了多语言文本、代码、数学、自然图像和文档图像。每个模型处理约 5240 亿个打包输入标记,其中包括 2900 亿个来自纯文本示例的标记。与 ModernBERT 的 2 万亿训练标记预算相比,这个文本预算相对较小。因此,我们选择了 NorMuon 优化器来提高训练期间的数据效率。

NeoMME-Retriever

为了对骨干网进行有意义的下游评估,我们使用 ColPali 引入的页面图像方法对 NeoMME 进行了视觉文档检索微调。虽然传统的基于文本的检索是检索文本块,但 NeoMME-Retriever 对文档页面截图进行排名,并绕过了从 PDF 提取文本所需的所有预处理 OCR 步骤。将页面作为图像处理可以保留布局、图表、表格、字体类型和大小以及其他视觉线索,这些是即使完美的 OCR 模型也无法捕捉的。

用于密集检索和晚交互检索的双头设计

NeoMME-Retriever 重用了 NeoMME 骨干网,但在其之上添加了两个联合训练的检索头:

  • 密集头(dense head)将骨干网的隐藏状态向量平均为一个归一化向量(均值池化)。密集嵌入在当今最为常见:它们紧凑且可与近似最近邻(ANN)技术自然配合,实现快速检索。

  • 晚交互头(late-interaction head)将每个文本标记或图像块从骨干网的输出隐藏状态投影到 128 维归一化向量。与密集嵌入相比,更细的粒度保留了单个查询标记与图像区域之间的局部匹配。

NeoMME 的晚交互和密集检索头 两种 NeoMME 模型规模的晚交互和密集检索头。Omar Khattab(在 ColBERT 中引入晚交互的作者)解释了为什么这个术语比"多向量"更精确。它描述了评分函数的粒度和可学习性,而不是简单地存储向量的数量。 >

要了解更多关于晚交互的信息,我们推荐阅读 Amélie Chatelain 的这门速成课。

一次 NeoMME-Retriever 前向传播返回两种表示,无论您的用例和基础设施如何,都能提供灵活性。我们建议一般使用晚交互嵌入,因为它们更强大,可以与 NextPlaid 等开源库轻松配合使用。然而,如果您有非常大的语料库,您可以运行一次 NeoMME-Retriever 前向传播来获取密集嵌入,通过 ANN 索引检索少量文档,然后使用晚交互对检索到的候选进行重排。

紧凑模型规模下的竞争性检索性能

我们在 ViDoRe v3 上报告 nDCG@10。NeoMME-Retriever-260M 达到 0.523,在参数量严格低于 8 亿的评估模型中得分最高。与 ColQwen2.5 相比,nDCG@10 仅差 0.002,但参数量减少约 14 倍。NeoMME-Retriever-800M 达到 0.556,与同等规模的 Vultron Retriever Flash (0.8B) 仅差 0.009 nDCG@10。两种 NeoMME-Retriever 模型都位于模型规模的帕累托前沿。

ViDoRe v3 nDCG@10 与模型规模的关系 ViDoRe v3 nDCG@10 与模型规模的关系。

ViDoRe v1 和 v2 使用 nDCG@5。在这两个基准上,NeoMME-Retriever-260M 的表现优于 ColModernVBERT 和两倍大小的 ColSmol-500M。NeoMME-Retriever-800M 的表现优于 ColPali v1.3,而参数量减少 3.6 倍。

| 模型详情 ||| ViDoRe(nDCG@k) ||| | 模型 | 参数量 | v3(@10) | v2(@5) | v1(@5) |

<300M
ColModernVBERT250M0.261†0.407‡0.806‡
ColSmol-256M†256M0.2070.3480.797
NeoMME-260M‡260M0.5230.5220.860
ColSmol-500M500M0.340‡0.455†0.825†
Vultron Flash†850M0.5650.6040.882
NeoMME-800M‡800M0.5560.5590.874
ColQwen2.5-v0.2†3.75B0.5240.6010.895
ColPali v1.3†2.92B0.4300.5470.848

[ViDoRe 基准上的视觉文档检索性能。]

† 来自 MTEB 的分数。‡ 来自我们自己的评估结果。

使高分辨率检索对晚交互更加实用

晚交互存储与输出嵌入中向量的数量成线性比例。高分辨率图像包含更多块,因此产生更大的嵌入。例如,一个 2048×2048 的方形页面产生包含 4,200 个向量的嵌入,在 NeoMME-Retriever 中约 2.1 MB(float32)。在整个 ViDoRe v3 基准上,测量平均约为每文档 1.5 MB。

为了减小晚交互索引的存储占用,我们结合了两种互补的压缩方法:

  1. 分层标记池化 将给定多向量嵌入中相似的文档向量聚类,并用每个聚类的均值替换,从而减少每个页面存储的向量数量。

  2. 非对称量化 将文档嵌入量化为 int8 或二进制。因为查询嵌入不存储,只有在运行时才生成,它们可以保持更高的精度。

我们在 ViDoRe v3 上测试了这个设置。使用池化因子 10 和 int8 查询与文档,存储从每页约 1.5 MB 减少到 39 kB,减少了 39 倍,同时保留了超过 99% 的基线 nDCG@10。更激进的配置使用池化因子 8、int8 查询和二进制文档。该版本每页使用 6 kB(缩小 255 倍),同时保留了超过 95% 的原始检索质量。

NeoMME-260M 晚交互索引的质量和存储前沿 NeoMME-260M 晚交互索引在 ViDoRe v3 上的质量和存储前沿。标签显示了池化因子、保留质量、压缩比和存储量。

用户可以根据存储预算和所需检索质量从前沿中选择压缩设置。

用于降低多模态语料库索引成本的高速推理

在搜索语料库之前,检索模型必须将文档转换为嵌入,然后存储在 Qdrant、Weaviate 或 Milvus 等向量存储中。更快的编码使构建和向索引添加新文档更快,从而减少了所需的 GPU 运行时间和计算成本。

因此,我们测量了 NeoMME-Retriever 与其他多模态文档检索器的图像编码速度。我们使用预处理后的图像张量,并为每个模型和图像尺寸分别校准了批大小。在 NVIDIA L40S 上以 2048×2048 匹配输入尺寸运行时,NeoMME-Retriever-260M 每秒编码约 51 页,几乎是 ColModernVBERT 每秒 26 页的两倍。260M 和 800M 两种 NeoMME-Retriever 模型在我们比较的较小输入图像的其他模型上也更快。

NVIDIA L40S 上跨图像分辨率的文档编码吞吐量 在 NVIDIA L40S 上各检索器和输入分辨率的文档编码吞吐量。

亲自体验 NeoMME-Retriever!{#try-neomme-retriever-yourself}

NeoMME-Retriever(260M 和 800M)同时返回密集和多向量嵌入。下面的示例使用 MeanMaxSim 晚交互和密集余弦相似度对两个文本查询和两个文档页面图像进行评分。 点击查看完整的 🤗 transformers 示例代码片段

# accelerate 是一个可选依赖,仅在使用 device_map="auto" 时需要。
pip install -U accelerate "transformers @ git+https://github.com/huggingface/transformers.git@main" "sentence-transformers>=6.0.0"
from typing import Any, Literal

import requests
import torch
from PIL import Image
from sentence_transformers.util import cos_sim, mean_maxsim

from transformers import BatchFeature, NeoMMEForRetrieval, NeoMMEProcessor


def encode(
    messages: list[list[dict[str, Any]]],
    task: Literal["query", "document"],
) -> BatchFeature:
    return processor.apply_chat_template(
        messages,
        task=task,
        tokenize=True,
        return_dict=True,
        return_tensors="pt",
        processor_kwargs={"padding": "longest"},
    )


model_name = "Hcompany/NeoMME-260M-Retriever"
processor = NeoMMEProcessor.from_pretrained(model_name)
model = NeoMMEForRetrieval.from_pretrained(model_name, device_map="auto")

# 文档图像(我们的语料库)
image_urls = [
    "https://github.com/tonywu71/colpali-cookbooks/blob/6ef1332da6bcb48c7ef1f19b25bfa555be7031a8/examples/data/shift_kazakhstan.jpg?raw=true",
    "https://github.com/tonywu71/colpali-cookbooks/blob/6ef1332da6bcb48c7ef1f19b25bfa555be7031a8/examples/data/energy_electricity_generation.jpg?raw=true",
]
documents = [Image.open(requests.get(url, stream=True).raw) for url in image_urls]

# 查询
queries = [
    "Quelle partie de la production pétrolière du Kazakhstan provient de champs en mer ?",
    "Which hour of the day had the highest overall electricity generation in 2019?",
]

document_messages = [
    [{"role": "user", "content": [{"type": "image", "image": document}]}] for document in documents
]
query_messages = [[{"role": "user", "content": query}] for query in queries]

inputs_documents = encode(document_messages, "document").to(model.device)
inputs_text = encode(query_messages, "query").to(model.device)

with torch.inference_mode():
    document_outputs = model(**inputs_documents)
    query_outputs = model(**inputs_text)

late_scores = mean_maxsim(
    query_outputs.embeddings,
    document_outputs.embeddings,
    a_mask=inputs_text["attention_mask"],
    b_mask=inputs_documents["attention_mask"],
)
dense_scores = cos_sim(query_outputs.dense_embeddings, document_outputs.dense_embeddings)

# 预期:late_scores[0, 0] > late_scores[0, 1] 且 late_scores[1, 1] > late_scores[1, 0]。
print(late_scores, dense_scores)

使用 Sentence Transformers 微调

我们为使用 Sentence Transformers v6 微调提供了单独的密集头和晚交互头检查点。遵循与 ModernBERT 等文本编码器相同的模式,Sentence Transformers 通过 NeoMMEModel 加载骨干网,而不是双头 NeoMMEForRetrieval 类。Sentence Transformers 目前每个模型支持一个检索头,因此每个检查点允许您独立微调密集头或晚交互头。要同时训练两个头,请将 NeoMMEForRetrieval 与自定义 Trainer 一起使用。

从检索到视觉 RAG

视觉文档检索可以作为视觉检索增强生成(RAG)系统的第一阶段。与检索提取文本块的文本 RAG 不同,视觉 RAG 检索原始页面图像并将它们发送给视觉语言模型。该模型随后可以使用表格、图表、图表和页面布局,而文本提取可能会将其扁平化或遗漏。以下是视觉 RAG 的工作方式:

  1. 索引:将每个 PDF 页面转换为图像,使用检索模型生成嵌入,并将嵌入存储在向量存储中。

  2. 检索:使用同一模型为用户查询生成嵌入,并检索 top-k 个最相关的页面。

  3. 生成:在聊天消息中(例如{query}{img_1}{img_2}...{img_k})将图像附加在查询之后,并将其发送给 VLM 生成答案。

您可以直接在我们的 HF Space 中使用 NeoMME-Retriever 测试视觉 RAG:🤗 tonywu71/neomme-retriever-demo。

结论

NeoMME 用一个长上下文双向 Transformer 取代了单独的预训练图像和文本编码器。我们从头开始训练它来处理多语言文本标记和原始 32×32 图像块。

NeoMME-Retriever 是 NeoMME 用于视觉文档检索的微调版本。一次前向传播同时生成密集和晚交互表示。260M 模型在参数量严格低于 8 亿的评估模型中表现最佳,并且在匹配的 2048×2048 输入尺寸下,编码页面的速度约为 ColModernVBERT 的两倍。为了减小高分辨率文档晚交互嵌入的大存储占用,我们尝试了分层标记池化和非对称量化,成功将晚交互嵌入从每页约 1.5 MB 减少到 6 kB,压缩了 255 倍,同时保留了超过 95% 的基线 nDCG@10。

我们发布所有 NeoMME 模型检查点和零延迟 Hugging Face Transformers 实现,使从业者能够在我们工作的基础上构建高效的多模态和多语言表示模型。

致谢

NeoMME 始于两个好朋友之间的副项目。我们在有限的时间和计算资源下工作,我们决定分享结果,以便社区可以在此基础上构建。感谢 H Company 对这项工作的支持,并提供用于训练 NeoMME 的计算资源。

引用

@misc{lac2026neommesingletowermultimodalnativemultilingual,
      title={NeoMME: A Single-Tower Multimodal-Native Multilingual Foundation Encoder for Efficient Fine-Tuning and Inference},
      author={Aurélien Lac and Tony Wu},
      year={2026},
      eprint={2609.01657},
      archivePrefix={arXiv},
      primaryClass={cs.IR},
      url={https://arxiv.org/abs/2609.01657},
}
AI知识库 / 「NeoMME」:高效的多模态原生与多语言编码器 0 字 0 行 iliuqi
2026-09-04T08:59:38.157168067Z 2026-09-04T09:42:14.075849264Z