How ColPali Models Work
TL;DR · AI 摘要
How ColPali Models Work - Qdrant Module 2 How ColPali Models Work ColPali extends the late interaction paradigm from tex...
核心要点
- 主题聚焦:How ColPali Models Work
- 来源:Qdrant,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
ColPali 模型原理 - Qdrant
模块 2
ColPali 模型原理
ColPali 将文本领域的晚期交互范式扩展到视觉文档领域。它能够处理 PDF、图像和扫描文档,生成同时包含文本和视觉信息的多向量表示。
理解 ColPali 的架构有助于充分发挥其在多模态文档检索中的潜力。
在 Colab 中跟随学习:
从文本到视觉文档
对于非纯文本的文档该如何处理?PDF 中通常包含图表、表格、公式和复杂布局,其中视觉呈现与文本本身具有同等的重要性。
传统视觉文档检索方法通常分为两个步骤:首先使用 OCR(光学字符识别)提取文本,然后在提取的文本中进行搜索。这种流程存在显著局限性:
- 布局信息丢失:OCR 将文档转换为纯文本,丢弃了空间关系和视觉结构
- 图表盲区:图表、图形和示意图要么被忽略,要么表现不佳
- 格式脆弱性:表格、数学公式和多列布局在文本提取过程中经常被破坏
ColPali 采用根本不同的方法:它将文档图像本身作为主要表示形式。ColPali 将图像"分词"为空间块。每个块成为带有自身嵌入的视觉标记,实现无需文本提取的标记级匹配。
这意味着 ColPali 可以直接将查询匹配到文档页面的视觉区域 - 完全不需要 OCR。
视觉语言模型基础
在深入探讨 ColPali 如何处理图像之前,让我们先理解其架构基础。ColPali 并非从零构建,而是基于已理解视觉与文本信息关系的先进视觉语言模型(VLM)。
基于 PaliGemma 的架构
ColPali v1.3 基于 PaliGemma-3B,这是一个结合两个强大组件的视觉语言模型:
- SigLIP-So400m(视觉编码器):将图像转换为视觉特征
- Gemma-2B(语言模型):使用 transformer 层对这些特征进行上下文处理
为什么使用 VLM 而不是从头训练视觉模型?VLM 在大规模图像-文本对数据集上进行了预训练,因此它们已经"理解"视觉内容与语言的关系。这使它们成为文档检索的理想选择:它们可以自然地将文本查询连接到对应的视觉内容。
PaliGemma 特别设计用于需要视觉理解和语言处理的任务 - 完美适用于搜索融合文本、图表、表格和公式的文档。
针对文档检索的微调:使用 LoRA(低秩适应)技术对基础 PaliGemma 模型进行调整,这是一种参数高效的微调方法,可以在不重新训练所有参数的情况下专门化模型。视觉编码器保持冻结状态,而注意力层经过微调以优化文档搜索。
双组件架构
可以将 ColPali 的架构视为具有"眼睛"和"大脑":
视觉编码器(SigLIP) - 眼睛:
- 接收文档图像并将其分割为块(我们接下来将探讨的 32×32 网格)
- 通过视觉 transformer 处理每个块
- 输出捕捉每个块内容的视觉特征:文本字符、图表元素、表格单元格等
语言模型(Gemma-2B) - 大脑:
- 从 SigLIP 接收视觉特征
- 通过 Transformer 层进行处理,以增加上下文和语义理解
- 每个补丁的特征通过理解相邻补丁得到增强
- 输出能够理解文档中跨区域关系的上下文表示
流程:图像补丁首先通过 SigLIP 编码器进行处理以生成视觉特征。这些视觉特征随后通过 Gemma-2B Transformer,生成上下文感知表示。最后,这些上下文感知表示通过投影层生成 128 维嵌入。该流程确保每个 128 维嵌入不仅捕捉单个补丁的内容,还能在整篇文档的上下文中理解该补丁。
对于文本输入,没有额外的预处理步骤,但会进行分词并传递给语言模型。这种架构可以使用相同的“大脑”来处理不同模态的数据。
基于补丁的图像处理
ColPali 所依赖的视觉 Transformer 并不会一次性处理整张图像。相反,它们将图像分割成固定大小的补丁网格——可以想象成在文档上覆盖的棋盘格。
ColPali 的流程从文档开始。通常这是一个单页 PDF 的截图,或者任何你想要编码的内容。虽然你可能会将 PDF 页面转换为高分辨率截图以保留视觉细节,但 ColPali 的预处理本身会在处理前将图像调整为固定分辨率 448×448 像素。
这个固定大小的输入随后被分割成补丁:
- 补丁大小:每个补丁 14×14 像素
- 补丁网格:32×32 补丁(448 / 14 = 每边 32 个补丁)
- 总补丁数:每张图像 1024 个补丁(32 × 32 = 1024)
每个补丁都成为代表文档空间区域的视觉“标记”。一个补丁可能包含图表的一部分、几行文字、方程的一部分,甚至只是空白区域——每个部分都会获得自己的嵌入。这种一致的结构确保了嵌入大小的可预测性,并简化了搜索流程。
标记结构与嵌入
现在你已经了解了 ColPali 的 VLM 基础——SigLIP 处理补丁、Gemma-2B 上下文化特征、投影层生成嵌入。现在让我们看看这个架构如何将图像处理为最终的多向量表示。
当 ColPali 处理图像时,PaliGemma 模型不会直接生成补丁嵌入。它创建了一个通过整个架构的标记序列。这个序列包括图像补丁和额外的指令标记,这些标记有助于指导模型的行为。
对于单个文档图像,标记序列包含:
- 1024 个特殊 <image> 标记——32×32 网格中每个补丁一个
- 指令标记——帮助模型理解任务的额外标记
<image><image>...<image><bos>Describe the image.\n
最终的嵌入输出包含 1030 个 128 维向量:1024 个用于图像补丁,加上 6 个额外的指令标记。为了搜索目的,所有向量都会参与 MaxSim 计算——每个查询标记会在所有 1030 个向量中找到最佳匹配。
通过这种多向量表示,每个查询词会使用晚期交互机制在所有1030个视觉向量中找到最佳匹配。查询术语会匹配到语义上最相似的图像块——无论这些图像块包含图表、文本、表格还是公式——这正是我们在模块1中学习的MaxSim评分机制,但已扩展到视觉文档场景。
使用FastEmbed和Qdrant实现多模态搜索
现在你已经理解了ColPali的架构——从其VLM基础到基于图像块的处理再到多向量嵌入——让我们构建一个实用的多模态搜索系统。我们将再次使用FastEmbed,因为它也为ColPali这样的多模态晚期交互模型提供了统一的接口。
使用FastEmbed加载ColPali
让我们首先加载一个ColPali模型。FastEmbed支持多种ColPali变体,但在这节课中我们将使用ColPali v1.3:
from
fastembed
import
LateInteractionMultimodalEmbedding
# 从HF hub加载Qdrant/colpali-v1.3-fp16模型
colpali_model
=
LateInteractionMultimodalEmbedding
(
model_name
=
"Qdrant/colpali-v1.3-fp16"
)这单次初始化加载了我们讨论的完整ColPali架构:SigLIP视觉编码器、Gemma-2B语言模型以及投影层。LateInteractionMultimodalEmbedding类通过统一接口处理图像和文本编码,封装了图像和文本处理逻辑,你只需传递图像路径或查询即可。
处理图像并理解嵌入
现在让我们通过ColPali处理文档图像,看看多向量嵌入的实际效果:
from
PIL
import
Image
image
=
Image
.
open
(
"images/einstein-newspaper.jpg"
)
image现在让我们生成嵌入:
# 创建图像的表示
colpali_generator
=
colpali_model
.
embed_image
([
"images/einstein-newspaper.jpg"
])
document_vectors
=
next
(
colpali_generator
)
document_vectors
.
shape输出形状显示有1030个128维向量。这1030个向量包含来自32×32网格的1024个图像块嵌入,加上模型使用的6个额外指令标记。
处理查询文本:
ColPali还将文本查询编码为多向量表示:
# 创建查询的表示
query
=
"When did dr. Einstein die?"
query_vectors
=
next
(
colpali_model
.
embed_text
(
query
))
query_vectors
.
shape让我们定义一个辅助函数来计算MaxSim分数:
import
numpy
as
np
def
maxsim
(
Q
,
D
):
sims
=
np
.
dot
(
Q
,
D
.
T
)
max_sims
=
sims
.
max
(
axis
=
1
)
return
max_sims
.
sum
()现在最终计算分数:
maxsim
(
query_vectors
,
document_vectors
)在搜索过程中,每个查询词会使用MaxSim在所有1030个文档向量中找到最佳匹配——这正是我们在模块1中学习的晚期交互评分机制。更高的分数表示查询与视觉文档之间有更好的语义重叠。
为多向量搜索设置Qdrant
要存储和搜索这些多向量嵌入,我们需要配置一个支持晚期交互的Qdrant集合:
from
qdrant_client
import
QdrantClient
,
models
client
=
QdrantClient
(
"http://localhost:6333"
)
client
.
create_collection
(
collection_name
=
"colpali"
,
vectors_config
=
{
"colpali-v1.3"
:
models
.
VectorParams
(
size
=
128
,
distance
=
models
.
Distance
.
DOT
,
multivector_config
=
models
.
MultiVectorConfig
(
comparator
=
models
.
MultiVectorComparator
.
MAX_SIM
,
),
hnsw_config
=
models
.
HnswConfigDiff
(
m
=
0
),
),
},
)此配置与模块1中学习的多向量配置一致,使用MAX_SIM比较器、点积距离计算方式,并禁用HNSW。
索引视觉文档
现在让我们使用Qdrant的本地推理功能来索引视觉文档。这种方法通过models.Image()让Qdrant自动处理嵌入向量生成,使用FastEmbed实现:
import
uuid
documents
=
[
"images/einstein-newspaper.jpg"
,
"images/titanic-newspaper.jpg"
,
"images/men-walk-on-moon-newspaper.jpg"
,
]
client
.
upsert
(
collection_name
=
"colpali"
,
points
=
[
models
.
PointStruct
(
id
=
uuid
.
uuid4
()
.
hex
,
vector
=
{
"colpali-v1.3"
:
models
.
Image
(
image
=
doc
,
model
=
"Qdrant/colpali-v1.3-fp16"
,
)
},
payload
=
{
"image"
:
doc
,
}
)
for
doc
in
documents
]
)这使用了本地推理功能,与模块1中看到的models.Document()处理文本的方式类似。Qdrant的FastEmbed集成在本地处理图像(不在远程服务器),自动生成多向量嵌入。这比手动使用FastEmbed生成嵌入再进行插入操作要简单得多。
索引完成后,每个文档图像由1030个向量表示(1024个图像块 + 6个指令标记),准备进行晚期交互搜索。当查询到来时,Qdrant会计算查询标记与这些向量之间的MaxSim得分。
使用晚期交互查询
在搜索时ColPali的优势变得明显。使用本地推理功能,你可以用文本查询并匹配视觉文档:
client
.
query_points
(
collection_name
=
"colpali"
,
query
=
models
.
Document
(
text
=
"Who was the first man on the moon?"
,
model
=
"Qdrant/colpali-v1.3-fp16"
,
),
using
=
"colpali-v1.3"
,
limit
=
2
,
)这使用了与模块1中通过models.Document()看到的相同本地推理模式。Qdrant会自动处理查询标记化、嵌入生成和MaxSim计算。
让我们尝试不同查询:
client
.
query_points
(
collection_name
=
"colpali"
,
query
=
models
.
Document
(
text
=
"Why did Titanic sink?"
,
model
=
"Qdrant/colpali-v1.3-fp16"
,
),
using
=
"colpali-v1.3"
,
limit
=
2
,
)视觉搜索中晚期交互的工作原理:
- 你的查询被标记化为查询嵌入(例如,“Who was the first man on the moon?”的6-8个标记)
- 对于每个查询标记,Qdrant会在每个文档图像的1030个视觉向量中找到最大相似度
- 最大相似度被相加(MaxSim)以对每个图像进行评分
- 与查询内容匹配的图像得分最高
这是一种无需OCR的文本到图像搜索。你直接将文本查询的语义含义与视觉内容进行匹配 - 标题、照片、说明文字以及原始布局中的文本。晚期交互范式实现了在标记级别上的精细匹配,就像ColBERT对文本的处理方式,但扩展到了视觉文档。
下一步
现在你已经了解了ColPali的工作原理并能够构建基本的多模态搜索系统,一些问题自然浮现:
- 应该选择哪个 ColPali 模型?ColPali 系列包含针对不同硬件限制和精度要求优化的多个变体。
- 如何理解模型的匹配结果?与黑盒嵌入不同,ColPali 提供强大的可视化功能,可精确显示图像中与查询词匹配的区域。
- 如何实现生产环境优化?大规模的多向量搜索可能消耗大量资源,需要借助量化、池化和多阶段检索等技术手段。
下一课中,我们将深入探索 ColPali 系列,学习不同模型变体的使用场景。随后,我们将通过可视化可解释性分析,全面理解 ColPali 是如何解析文档内容的。
Continue to Next Step