上下文多模态文档检索开源思路-CMDR模型架构实现方法
现有多模态文档检索的两大缺陷:

-
Benchmark 层面:现有的多模态文档检索基准(如 SlideVQA、MMLongBench、ColPali/ViDoRe、VisR-Bench 等)都是【直接检索】——query 和目标 page 之间存在明显的词汇或语义匹配。忽略了真实文档中存在的:跨页依赖、文档全局结构。
-
模型层面:ColPali、VisRAG、DSE、UniSE 等主流方法都是独立编码每一页,隐式假设”上下文对 embedding 无益”。但实际中:一个代词、一个缩写、一个表格续行的 header,可能只在别的页出现。
CMDR(Contextual Multimodal Document Retrieval)是一个新的多模态文档检索任务,要求系统在利用文档上下文的前提下,从多页文档(即一组有序的文档图像)中检索出相关页面。
-
输入:query + 多页文档 -
输出:top- 页 ,且 -
关键约束:识别 必须依赖上下文页面推理,而不是仅看 自身内容
下面主要看一下模型架构设计
模型架构:CMDR-Embed

总体思想是Chunk-then-Split(先联合编码,后拆分)
与 ColPali 最本质的区别: ColPali 等 是每页独立过 LVLM,得到独立 embedding;CMDR-Embed是连续多页当成一个 chunk 一起过 LVLM,token-level 表示自然带上跨页上下文;再按页边界切开,得到每页的 contextualized embedding。
Contextualized Multimodal Encoding(滑动窗口机制)
给定 页的文档 :
-
stride 、window 的滑动窗口 -
第 个 chunk 是 -
每个 chunk 送进 LVLM → 得 token-level 表示 → 按页拆成 -
当 chunks 重叠()时,同一页可能出现在多个 chunk:取更早那个 chunk 的表示(避免重复计算) -
最优配置:(每个 chunk 4 页,每次滑 2 页,相邻 chunk 有 2 页重叠)
Q:为什么滑动窗口而不是全文档一次编码?A:显存/算力限制 + 提高实用性;重叠又保证了 chunk 之间的信息交互。
Multimodal Late Interaction(LI,多向量检索)
沿用 ColBERT/ColPali 的多向量匹配方式(不用单向量 mean pooling):
即:query 的每个 token 找 page 中最相似的 token,取内积,再对所有 query token 求和。保留了 token 级细粒度,对文档检索(有图表、小文字、表格)尤其重要。
去掉 LI 改用 mean pooling + cosine,CMDR-Embed-Pali 直接掉 26.5 分(49.8 → 23.3)。
训练目标:CMCL(Contextual Multimodal Contrastive Learning)
问题:联合编码带来的”信息泄漏”,Chunk-then-split 会让**同 chunk 内不同页的表示互相”污染”**(因为它们过了同一次 attention),页级判别性下降 —— 邻近页面 embedding 变得太像,反而检索不出目标页。
解法:两种”上下文感知硬负例”,
在标准 InfoNCE 基础上引入两类 hard negative:
|
|
|
|
|---|---|---|
| In-Chunk Negatives |
|
|
| In-Document Negatives |
|
|
短距离靠 in-chunk、长距离靠 in-doc。
CMCL Loss函数:

其中:

实验



参考文献
-
CMDR: Contextual Multimodal Document Retrieval,https://arxiv.org/abs/2607.05927v1 -
https://github.com/nttmdlab-nlp/CMDR-Bench
夜雨聆风