三个前置概念
PaliGemma
Google 2024 年开源的视觉语言模型:SigLIP 视觉编码器 + Gemma 语言模型。把 448×448 的图切成 1024 个 patch,每个 patch 过 SigLIP 输出一个向量,再由 Gemma 对齐。开源许可、多语言、3B 参数易微调——ColPali 的理想底座。
ColBERT 风格 Late Interaction
2020 年 Stanford 提出的文本检索架构:query 和 doc 都编码为多向量(每 token 一条),打分时对每个 query token 在 doc 的所有 token 里找最相似的(MaxSim),求和。召回远优于单向量平均池化。
Patch Embedding
ViT 家族的标准操作:图片切成 N×N 网格,每格压成一个向量。PaliGemma 的 448×448 输入被切成 32×32=1024 个 patch。ColPali 把每个 patch 向量当作"文档的一个 token"。
编码流程(Document 侧)
PDF 页面 → 448×448 图片
│
▼
PaliGemma 视觉编码器(SigLIP)
│ 输出 1024 个 2048 维向量
▼
Gemma 语言模型(加文本 prompt: "Describe the image.")
│ 输出 1024 个 2048 维上下文化向量
▼
线性投影(Linear 2048 → 128)
│
▼
L2 normalize → 1024 × 128 维矩阵 D
也就是说,一页 PDF 变成 1024 个 128 维单位向量。存储 ≈ 1024×128×2(bfloat16) = 256KB / 页。
编码流程(Query 侧)
query 也过同一个 PaliGemma(带特殊 query token "Question: {text}"),输出每 token 的 128 维向量,通常 10–30 个 token。记为 Q = [q1, q2, ..., qn]。
MaxSim 打分
# Q: query tokens,shape (n, 128) # D: doc patches,shape (1024, 128) # 1. 计算相似度矩阵 sim = Q @ D.T # (n, 1024) # 2. 每个 query token 取最大 patch 相似度 max_per_q = sim.max(axis=1) # (n,) # 3. 所有 query token 相加 score = max_per_q.sum() # 标量
直觉:query 里每个词(token)去页面上找"最能解释我"的那块 patch,加总起来就是这页和这 query 的相关度。
为什么不是单向量 + cosine?
单向量是把整页压成 128 维——信息瓶颈。一个页面可能同时讲多个话题、有表格有图,单向量抹平所有细节。Late Interaction 把"是否讲了 X"分散到 patch 级别,query 里不同词自己去找自己关心的区域。
单向量是把整页压成 128 维——信息瓶颈。一个页面可能同时讲多个话题、有表格有图,单向量抹平所有细节。Late Interaction 把"是否讲了 X"分散到 patch 级别,query 里不同词自己去找自己关心的区域。
为什么这招对视觉文档尤其有效
- 图表里的一个子图、表格里的一行、页眉里的一串数字——只需要对应的那几个 patch 命中,不需要整页都相关
- query 里出现的专业术语、数字,会在视觉空间里直接"看见"自己的像素位置
- 多栏布局、弯曲文字、手写体——patch 层面一视同仁
训练目标(对比学习)
# 一个 batch 里 N 个(query, positive_page)对 # 构造 N × N 相似度矩阵,每行正样本在对角线上 scores = maxsim(Q, D) # (N, N) labels = torch.arange(N, device=device) loss = F.cross_entropy(scores, labels)
典型的 in-batch negatives 对比学习:对一条 query,batch 内其他文档的页面都是负样本。数据来自 ViDoRe 的 100K 合成 query-page 对。
PaliGemma 为什么是好选择
优点
- 3B 参数轻量、单 A100 能微调
- SigLIP 视觉 tower 已经 LARGE-scale 预训练
- 原生多语言
- 开源许可商业友好
缺点
- 448×448 输入对超高分辨率文档(A3 财报)信息丢失
- 3B 参数在 edge 设备仍太重
- 2024 年初版不支持动态分辨率——后续 ColQwen2 用 Qwen2-VL 解决
关键超参
| 参数 | 值 | 含义 |
|---|---|---|
| patch 数 | 1024 | 32×32 网格(448/14 = 32) |
| 输出维度 | 128 | 线性投影后,平衡容量与存储 |
| bfloat16 每页 | 256 KB | 128 × 1024 × 2 bytes |
| int8 每页 | 128 KB | 量化后 |
| binary 每页 | 16 KB | Binary Quantization 后 |
模型家族速览
| 模型 | 骨干 | 发布 | 特点 |
|---|---|---|---|
| ColPali v1 | PaliGemma-3B | 2024.7 | 开山之作 |
| ColPali v1.2 | PaliGemma-3B | 2024.10 | 新数据训练,精度提升 |
| ColQwen2 | Qwen2-VL-2B | 2024.11 | 动态分辨率,高分图表更强 |
| ColQwen2.5 | Qwen2.5-VL-3B | 2025.1 | 长文档、多页检索优 |
| ColInternVL2 | InternVL2-2B | 2025 | 中文文档表现突出 |
| ColSmolVLM | SmolVLM-500M | 2025 | 边缘设备可跑 |
本章小结
- ColPali = PaliGemma 出 patch 向量 + 128 维投影 + MaxSim
- 一页 = 1024 个 128 维单位向量 ≈ 256KB
- MaxSim:query 每个 token 在 doc 里找最相似 patch 再求和
- 训练:in-batch negatives 对比学习,ViDoRe 合成 100K 对
- 衍生模型族 ColQwen2 / ColInternVL / ColSmolVLM 各有擅长