AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


ColPali文档页面多模态嵌入模型:实现思路及其实践脚本解读
发布日期:2024-09-29 07:26:50 浏览次数: 1738 来源:老刘说NLP


一、文档页面检索的一些思路

给定一个查询,系统能否检索到正确的文档页面?

传统的文档检索系统在文本匹配方面做得很好,但往往忽视了文档中的视觉元素,如表格、图形、页面布局或字体,这些元素对于文档检索同样重要。

例如,

基于词频的统计方法,如TF-IDF和BM25,由于它们的简单性和效率,仍然被广泛使用。

最近,基于微调大型语言模型的神经嵌入模型在各种文本嵌入任务上显示出很大的潜力

此外,在双编码器模型中,文档独立地映射到一个密集的向量空间。在线时,通过快速余弦距离计算将查询嵌入到文档中。

一个较慢但略高性能的替代方案是交叉编码器,也就是我们常说的rerank方案,它将查询和文档作为单一输入序列连接,并迭代地为每种可能的组合分配匹配分数。这使得可以在查询和文档项之间进行充分的注意力计算,但计算效率较低。

因此,是否能够结合多模态的信息?

答案是可以的,例如通过对比损失将文本内容的潜在表示与视觉内容的对应表示对齐。虽然这些模型中存在一些OCR功能,但视觉组件通常不是为文本理解而优化的。

细粒度交互式语言-图像预训练框架将后期交互机制扩展到跨模态视觉语言模型,依赖于文本标记和图像块之间的最大相似度操作。

为了超越文本,一些以文档为中心的模型联合编码文本标记以及视觉或文档布局特征。例如,最近,具有强大推理能力的大模型(LLMs)与视觉变换器(ViTs)结合,创建了视觉语言模型(VLMs),其中来自对比训练的ViT模型的图像块向量被用作语言模型的输入嵌入,并与文本标记嵌入连接。

典型的一种代表是,PaliGemma-3B模型,其扩展Pali3的概念,并将SigLIP-So400m/14的图像块嵌入投射到Gemma-2B的文本向量空间。

所以,当前也有一些视觉embedding模型,例如Jina CLIP、Nomic Embed Vision和SigLIP-So400m/14,这些可以将文档页面进行视觉编码,然后用于检索任务。

二、再看ColPali文档页面多模态嵌入模型

我们再来看看最近的工作,《ColPali: Efficient Document Retrieval with Vision Language Models》 ,https://arxiv.org/abs/2407.01449,https://huggingface.co/blog/manu/Fcolpali,其利用视觉语言模型(VLMs)来理解文档,直接从文档页面的图像中生成上下文嵌入向量。它使用一种称为“后期交互”的匹配机制来提高检索质量。

1、实现思路

从本质上来说,ColPali是一个PaliGemma-3B的扩展模型,能够生成文本和图像的ColBERT风格的多向量表示,在传统的检索系统中,文档首先需要经过解析(例如PDF解析或OCR)、文本提取、可能的布局分析、以及将文本块编码成向量。相比之下,ColPali直接从文档页面的图像生成嵌入向量,跳过了这些预处理步骤,如下图所示:

使用的后期交互(Late Interaction)机制。在这种机制中,文档的图像首先被分割成多个小块,每个小块被模型独立地编码成一个向量。在检索时,查询也被编码成一个向量,并且与文档的每个小块向量进行比较,以找到最匹配的小块。

也就是说,其给定一个查询q和一个文档d,模型会分别为它们生成多向量表示(Eq和Ed)。然后,通过计算查询向量和文档向量之间的最大点积来实现交互,从而得到一个综合的相似度分数。

在训练过程中,使用对比损失来强化模型对于正样本(相关的查询-文档对)和负样本(不相关的查询-文档对)的区分能力。

在训练数据集上,ColPali的训练数据集由公开可用的学术数据集(63%)和由网络爬虫获取的PDF文档页面及VLM生成的伪问题组成的合成数据集(37%)构成。训练集完全使用英语,以研究模型在非英语语言上的零样本泛化能力。

2、使用例子

为了更好的理解,我们可以从地址:https://github.com/weaviate/recipes/blob/main/weaviate-features/named-vectors/NamedVectors-ColPali-POC.ipynb中来看,

1)首先加载模型

device = "cuda:0" if torch.cuda.is_available() else "cpu"

model_path = "google/paligemma-3b-mix-448" # can also try smaller models
lora_path = "vidore/colpali"

model = ColPali.from_pretrained(model_path) # torch_dtype = torch.bfloat16 # there is also a `bitsandbytes` setup for 8-bit / 4-bit
model.load_adapter(lora_path, adapter_name="colpali")
model.to(device);

执行后可以看到加载进度:

2)对文档进行切分,获取embedding

其中,关键的是对文档pdf进行切分,转为图片后,送入模型进行编码。

3)给定query,找到最相似的文档页面



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询