当前位置: 首页 > article >正文

【RAG多模态】多模态RAG-ColPali:使用视觉语言模型实现高效的文档检索

前面文章提到,文档智能解析能够有效的增强RAG系统的准确性。【文档智能 & RAG】RAG增强之路:增强PDF解析并结构化技术路线方案及思路

文档智能解析RAG一般流程

可以看到基于PDF的RAG,需要先对pdf进行解析,生成文本chunk,然后再基于文本建索引。这种pipline的方式,每个解析模块都需要放置对应的解析模型,存在着错误传播的问题。因此,笔者看到ColPali时,这种端到端的方案挺有意思,本文来看一看这个思路。

ColBERT

在此之前,先看一下ColBERT的架构,该架构包括:查询编码器、文档编码器和后期交互机制

查询编码器

ColBERT的架构

假设有一个查询 Q Q Q,其标记(token)为$ q1, q2, …, ql$,处理步骤如下:

  • Q Q Q转换为 BERT 使用的 WordPiece 标记 (一种子词分词方法)。
  • 在序列开头添加一个特殊的[Q]标记,紧随 BERT 的[CLS]标记之后,用于标识查询的开始。
  • 如果查询长度不足预设的$ N_q$个标记,用[mask]标记填充;若超过则截断。
  • 将处理后的序列输入 BERT,然后通过CNN处理,最后进行归一化。

最终输出的查询嵌入向量集合 $E_q $可表示为:

E q : = N o r m a l i z e ( B E R T ( [ Q ] , q 0 , q 1 , … , q l , [ m a s k ] , [ m a s k ] , … , [ m a s k ] ) ) E_q:=Normalize(BERT([Q],q_0,q_1,\ldots,q_l,[mask],[mask],\ldots,[mask])) Eq:=Normalize(BERT([Q],q0,q1,,ql,[mask],[mask],,[mask]))

文档编码器

对于包含标记 d 1 , d 2 , . . . , d n d_1, d_2, ..., d_n d1,d2,...,dn 的文档$ D $,处理步骤类似:

  • 在序列开头添加[D]标记,标识文档开始。
  • 无需填充,直接输入 BERT 进行处理。

文档嵌入向量集合 Ed 可表示为:

E d : = F i l t e r ( N o r m a l i z e ( B E R T ( [ D ] , d 0 , d 1 , … , d n ) ) ) E_d:=Filter(Normalize(BERT([D],d_0,d_1,\ldots,d_n))) Ed:=Filter(Normalize(BERT([D],d0,d1,,dn)))

Filter用于去除与标点符号对应的嵌入,从而提升分析速度。这里的查询填充策略(论文中称为"查询增强")确保了所有查询长度一致,有利于批量处理。而[Q]和[D]标记则帮助模型区分输入类型,提高了处理效率。

后期交互机制

“交互”是指通过比较查询和文档的向量表示来评估它们之间的相关性。“后期交互”表示这种比较发生在查询和文档已经被独立编码之后。这种方法与BERT之类的“早期交互”模型不同——早期交互中查询和文档的Embedding在较早的阶段相互作用,通常是在编码之前或期间。

ColBERT采用了一种后期交互机制,使得查询和文档的表示可以用于预计算。然后,在末尾使用简化的交互步骤来计算已编码的向量列表之间的相似性。与早期交互方法相比,后期交互可以加快检索时间和降低计算需求,适用于需要高效处理大量文档的场景。

编码器将查询和文档转换为token级别的embedding列表 E q E_q Eq 和$ E_d 。然后,后期交互阶段使用针对每个 。然后,后期交互阶段使用针对每个 。然后,后期交互阶段使用针对每个E_q 中的向量,找与其产生最大内积的 中的向量,找与其产生最大内积的 中的向量,找与其产生最大内积的E_d$中的向量(即为向量之间的相似性),并将所有分数求和的最大相似性 (MaxSim) 计算。MaxSim的计算结果就反映了查询与文档之间的相关性分数,表示为 S q , d S_{q,d} Sq,d

S q , d : = ∑ i ∈ [ ∣ E q ∣ ] max ⁡ j ∈ [ ∣ E d ∣ ] E q i ⋅ E d j T S_{q,d}:=\sum_{i\in[|E_q|]}\max_{j\in[|E_d|]}E_{q_i}\cdot E_{d_j}^T Sq,d:=i[Eq]j[Ed]maxEqiEdjT

这种方法的独特价值在于能够对查询与文档token embedding之间进行详细、细粒度的比较,有效捕捉查询和文档中长度不同的短语或句子之间的相似性。这尤其适合需要精确匹配文本片段的应用场景,可以提高搜索或匹配过程的整体准确性

ColPali

与 ColBERT 相比,ColPali 仍然使用文本作为查询,文档则是图像类型。在视觉encoder,也是利用多模态的视觉大模型来生成图片端的向量,但不仅仅只生成单个向量。而是利用VIT的patch embedding,来生成多个向量。直觉上确实是会有收益,因为一整页的pdf,只压缩在一个固定维度的向量中,那肯定有信息损失,而且以patch为单位生成embedding。

上面是传统的建索引和检索过程,可以看出要进行一系列的pdf parse过程。最后得到文本chunking,然后送入文本向量模型中,得到向量;下面是ColPali的建索引和检索过程,直接输入整个页面的截图进入Vision LLM中,得到多个向量。

视觉语言模型

ColPali选择PaliGemma-3B作为其视觉语言模型,这是一个相对较小的模型,具有多个针对不同图像分辨率和任务微调的检查点,并且在各种文档理解基准测试中表现出色。PaliGemma-3B的一个关键特性是其文本模型在前缀(指令文本和图像标记)上进行了全块注意力的微调。

为了生成轻量级的多向量表示,ColPali在PaliGemma-3B模型的基础上添加了一个投影层,将输出的语言建模嵌入映射到一个降低维度的向量空间中(D=128),这与ColBERT论文中使用的向量空间大小相同

后期交互机制

ColPali采用了和ColBERT 类似的后期交互机制,这是一种在检索时才进行的交互方式。给定查询 q q q和文档 d d d,它们的多向量表示在共同的嵌入空间RD中分别表示为 E q ∈ R N q × D \mathbf{E_q}\in\mathbb{R}^{N_q\times D} EqRNq×D E d ∈ R N d × D \mathbf{E_d}\in\mathbb{R}^{N_d\times D} EdRNd×D。后期交互操作符 L I ( q , d ) LI(q, d) LI(q,d)定义为查询向量 E q ( j ) \mathbf{E}_{\mathbf{q}}^{(j)} Eq(j)与其在文档嵌入向量 E d ( 1 : N d ) \mathbf{E}_{\mathbf{d}(1{:}N_d)} Ed(1:Nd)中的最大点积⟨·|·⟩的总和。

数学公式表示为:
LI ( q , d ) = ∑ i ∈ [ ∣ 1 , N q ∣ ] max ⁡ j ∈ [ ∣ 1 , N d ∣ ] ⟨ E q ( i ) ∣ E d ( j ) ⟩ \begin{aligned}&\text{LI}\left(q,d\right)=\sum_{i\in[|1,N_q|]}\max_{j\in[|1,N_d|]}\langle\mathbf{E_q}^{(i)}|\mathbf{E_d}^{(j)}\rangle\end{aligned} LI(q,d)=i[∣1,Nq]j[∣1,Nd]maxEq(i)Ed(j)

通过这种方式,ColPali能够在检索时充分利用查询和文档之间的交互,同时保持了离线计算和快速查询匹配的优势

对比损失

对比损失通过对比正样本和负样本之间的差异来训练模型。在ColPali模型中,对比损失用于优化检索任务,使得模型能够学习区分与查询相关的文档和不相关的文档

在ColPali模型的训练过程中,每个批次包含多个查询-文档对。对于每对查询 q k q_k qk和其对应的正样本文档 d k d_k dk,模型会计算一个正样本分数$ s_k^+ ,这是通过后期交互操作 ,这是通过后期交互操作 ,这是通过后期交互操作LI(q_k, d_k) 得到的。同时,模型还会计算一个负样本分数 得到的。同时,模型还会计算一个负样本分数 得到的。同时,模型还会计算一个负样本分数 s_k^- $,这是通过在批次中所有其他文档(即负样本)上执行晚期交互操作,并取最大值得到的。

L = 1 b ∑ k = 1 b softplus ( s k − − s k + ) \mathcal{L}=\frac1b\sum_{k=1}^b\text{softplus}\left(s_k^--s_k^+\right) L=b1k=1bsoftplus(sksk+)

其中:

  • b b b 是批次中查询-文档对的数量。
  • $ s_k^+ $ 是查询q_k与其对应的正样本文档dk之间的正样本分数。
  • $ s_k^- $是查询q_k与所有负样本文档中的最大分数。

实验效果

参考文献

  • ColPali: Efficient Document Retrieval with Vision Language Models
  • https://github.com/illuin-tech/colpali?tab=readme-ov-file

http://www.kler.cn/a/380430.html

相关文章:

  • 全面解析Flutter中的Stream用法及实际应用
  • 细谈 Linux 中的多路复用epoll
  • 【C/C++】【三种方法】模拟实现strlen
  • 基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】
  • 全面解析:容器化技术及其应用
  • 十四届蓝桥杯STEMA考试Python真题试卷第二套第五题
  • Python pyautogui库:自动化操作的强大工具
  • Redis-06 Redis面试高频问题、Redis日常开发规避问题
  • 【LLM-多模态】MM1:多模态大模型预训练的方法、分析与见解
  • mybatis 参数判断报错的问题
  • ML2001-2 机器学习/深度学习 过拟合(overfit)
  • Qt中的Model与View5: QStyledItemDelegate
  • 【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现
  • 【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
  • Hadoop生态系统主要包括哪些组件以及它们的作用
  • 探索 MarsCode:代码练习-AI助你提升编码/算法能力
  • OpenCV图像基础
  • 红队知识学习入门(3)Shodan使用6
  • 算法:图的相关算法
  • CMFCMaskedEdit 类和CIPAddressCtrl 类
  • 论负载均衡技术在Web系统中的应用论文
  • JMeter与大模型融合应用之jmeter.properties配置文件新增配置
  • Rust 力扣 - 1493. 删掉一个元素以后全为 1 的最长子数组
  • 基于卷积神经网络的水稻叶片病害识别系统(pytorch框架,python源码)
  • Typora在ubuntu上通过Picgo-core来进行Github图床上传(超详细)
  • 介绍目标检测中mAP50和mAP50-95的区别