今天是2024年11月14日,星期四,北京,天气晴。
今天,我们来看看文档多模态RAG的工作,这个在之前的文章中也说过很多。
通常,我们在调研一个工作时,最快的方式就是找一遍综述,如对于多模态RAG而言,对应的综述有: 《Retrieving multimodal information for augmented generation: A survey》(https://arxiv.org/abs/2303.10868);《RetrievalAugmented Generation for AI-Generated Content: A Survey》(https://arxiv.org/abs/2402.19473);《Retrieval-augmented generation for large language models: A survey》(https://arxiv.org/abs/2312.10997)
而针对文档这个场景,如果检索的对象,都是位于文档内部本身,那么就变成文档自身的多模态RAG。
仔细看了很多思路,老刘将文档多模态RAG分为两种路线,一种是解析式文档多模态RAG(将一个文档切分为页面,然后再用版式识别的方式对文档进行各种模态元素进行分割、解析、提取,然后再嵌入、检索);另一种是DocVQA式文档多模态RAG(将文档切分为页面图像,不再细分,然后根据页面图像级别进行检索,类似于docvqa)。
而至于两者到底如何实现,本文来谈谈一些代表思路,供大家一起参考。
一、解析式文档多模态RAG路线和核心步骤
针对场景中,可以采用如下的几种路线进行执行:
第一种路线,对图像和文本直接做Embedding,使用多模态嵌入模型来嵌入图像和文本,然后使用相似性搜索检索两者,最后将原始图像和文本块传递多模态模型以进行答案合成,注意,这个用到的大模型是多模态模型;
第二个路线,使用多模态大模型对图像生成摘要,将非文本模态转化为纯文本模态,并使用textembedding的方案进行嵌入,最后将文本块传递给文本生成模型以进行答案合成,注意,这个用到的大模型是文本语言模型;
第三个路线,是使用多模态大模型对图像生成文本摘要,再对图像文本摘要经过text-embedding进行嵌入表示,但是同时使用参考原始图像嵌入和检索图像摘要,最后将原始图像和文本块传递给多模态模型以进行答案合,注意,这里用到的大模型是多模态模型;
但整个实现过程中,有以下几个核心步骤:
1、文档相关要素的分割解析
针对文档场景中,可以先进行文档相关元素抽取,如https://github.com/Unstructured-IO/unstructured,https://www.modelscope.cn/models/OpenDataLab/PDF-Extract-Kit,https://github.com/360AILABNLP/360LayoutAnalysisden将输入的文档解析为文本、表格、图像等部分,然后分别做处理。
例如,在论文场景中,可以分割成:Text:正文(段落)、Title:标题、Figure:图片、Figure caption:图片标题、Table:表格、Table caption:表格标题、Header:页眉、Footer:页脚、Reference:注释、Equation:公式等不同的模块。
2、Embedding的生成和存储
然后进行embedding的生成和存储,如使用多模态嵌入模型CLIP(也可以直接使用多模态模型进行编码)计算图像和文本向量,并存储到向量数据库中。
其中,CLIP是一个语言-图像预训练模型,通过在图像-文本对上进行训练,核心在于它能够将两种模态数据通过 Embedding投射到同一个向量空间中并保持对齐。
但是,CLIP主要针对短标题(通常少于77个字符)进行了优化,因此处理较长的文本时会面临挑战。
在存储阶段,代表工作《Beyond Text: Optimizing RAG with Multimodal Inputs for Industrial Applications》(https://arxiv.org/pdf/2410.21943)提到的思路,
Multimodal Embeddings and Separate Vector Stores方案,使用CLIP对图像进行嵌入,使用text-embedding-3-small对文本进行嵌入,并将它们存储在分开的向量存储中,对两种模态的查询进行了嵌入,并在每个存储中分别执行了相似性搜索,确保检索到文本和图像结果。
Image Summaries and Combined Vector Store方案,将图像转换成文本摘要,并使用text-embedding-3-small对这些摘要以及从PDF文档中提取的文本块进行潜入,这些单元都被存储在一个单一的向量存储中,然后执行相似性搜索,根据查询嵌入来检索最相关的文档,无论是文本还是图像。
也就是,前者是图片保持不变,建立起图片向量库;另一种是图片会提取出摘要描述用于召回。
3、组合提示送入多模态大模型生成
最后,使用相似性搜索来检索图像和文本,并将召回结果输入到多模态LLM进行答案生成。
例如,对应的prompt:
关于评估,可以参考这个工作:https://mp.weixin.qq.com/s/IIg1hPwhADYb0vs3Hqzfgg,对应评估指标的进一步解析,可看:https://evalscope.readthedocs.io/zh-cn/latest/user_guides/backend/rageval_backend/ragas.html#id5
看下最终的效果:
二、DocVQA式文档多模态RAG实现思路
当然,当前针对领域文档,尤其是pdf的文档,由于页面解析会带来直接损失,然后大模型的长文本能力还在提升,因此当前,直接出现了以多页面多模态检索召回的新方向,我们来看看最近几个代表工作。
先看问题,多模态文档理解流程的比较。单页DocVQA,它无法处理许多长文档,基于文本的RAG,它忽略了视觉信息。。
例如:
1、M3DocRAG
《M3DocRAG: Multi-modal Retrieval is What You Need for Multi-page Multi-document Understanding》(https://arxiv.org/pdf/2411.04952),提出的多模态RAG框架M3DocRAG,用于处理多页文档理解问题,通过多模态检索器和大型语言模型来找到相关文档并回答问题。
其核心思路很简单,三个阶段文档嵌入、页面检索以及问题回答。在文档嵌入阶段,提取视觉嵌入(使用ColPali,这个后面会讲)来表示所有PDF文档中的每一页;在页面检索阶段,使用文本查询检索出高相关性(最大相似度分数)的前K个页面。在开放域设置中,使用近似页面索引以加快搜索速度。问题回答阶段,使用多模态模型(例如Qwen2-VL)进行视觉问题回答,以获得最终答案。
可以看看效果:
在其提供的测试中,并没有太有效【真实应用还很难】:
2、VisRAG
又如,**《VisRAG: Vision-based Retrieval-augmented Generation on Multi-modality Documents》(https://arxiv.org/pdf/2410.10594)**,其直接将文档作为图像嵌入到VLM中,关于这块的细节,我们在RAG总结及前沿之Meta-Chunking切分思路及VisRAG多模态实现机制解读(https://mp.weixin.qq.com/s/CFyea4l6CbX39k2139u0vQ)已经做了详细介绍
包括两个阶段:
一个是检索阶段,查询和文档分别作为文本和图像输入到VLM中,生成一系列隐藏状态,然后通过位置加权平均池化得到最终的嵌入。相似度得分通过余弦相似度计算,优化使用InfoNCE损失。
另一个是生成阶段: VisRAG-Gen使用VLM生成答案。包括三种模式,页面拼接(PageConcatenation):将检索到的所有页面在DR中拼接成单个图像,以适应大多数只接受单个图像输入的VLM。这通常通过水平拼接实现;加权选择(WeightedSelection):对于从top-k页面中生成的每个页面的答案,选择置信度最高的答案作为最终答案。最终置信度定义为生成答案的概率的加权和;接受多个图像的VLM: 一些最新的VLM,如MiniCPM-V2.6和Qwen-VL2,被设计和训练为接受多个图像输入以执行跨图像推理。这对于生成可能是有益的,因为所需信息可能位于检索文档集DR的单个页面上,或者对于多跳问题,信息可能分布在多个页面上。
但同样也很现实的是,效果依旧不太好。
其中,标记为蓝色的是真实文档中送达大模型回答的准确性(也就是纯生成的性能),与此相比,性能并不高;
3、ColPali
而其中,最为核心的,我觉得,其实是文档的召回,需要对文档进行准确的嵌入以及高效检索,因此,这就需要专门针对文档做优化,所以,就不得不要看一个工作 **《ColPali: Efficient Document Retrieval with Vision Language Models》(https://arxiv.org/pdf/2407.01449,https://huggingface.co/vidore.)**,其是 PaliGemma-3B的扩展,可生成ColBERT风格的文本和图像多向量表示。
注意,这里是一个多向量表示!!!!。这个点,俊晖的文章解读的不错,(https://blog.csdn.net/Code1994/article/details/143201281):与ColBERT相比,ColPali仍然使用文本作为查询,文档则是图像类型。在视觉encoder,也是利用多模态的视觉大模型来生成图片端的向量,但不仅仅只生成单个向量,而是利用VIT的patch embedding,来生成多个向量。直觉上确实是会有收益,因为一整页的pdf,只压缩在一个固定维度的向量中,那肯定有信息损失,而且以patch为单位生成embedding。
另一个是问题是,选用什么多模态模型会好,应该是对文档布局信息敏感的,有个好的选择,就是PaliGemma-3B,其一个关键特性是其文本模型在前缀(指令文本和图像标记)上进行了全块注意力的微调,而为了生成轻量级的多向量表示,ColPali在PaliGemma-3B模型的基础上添加了一个投影层,将输出的语言建模嵌入映射到一个降低维度的向量空间中。
因此,在获得嵌入之后,可以使用ColPali对所需的输入文档进行编码,然后将生成的多个嵌入结果编入索引并存储在VectorStore中。
然后使用ColPali对用户查询进行编码,并使用由此产生的嵌入从VectorStore中检索可能包含文本和图像的类似文档块,注意,这里使用同样使用的是colbert方式的交互计算。
这种交互式对各个token之间计算之后,做一个最大总和,所以看到,如上图中,query对于文档中不同部位的注意力分布情况。
最后,RAG系统将检索到的文档块作为输入,用用户查询来增强上下文,以让VLM响应用户查询。
最后可看看如下效果对比:
初步来看,对于传统文本OCR的方式,是有一定提高,但精度依旧无法上线。
总结
本文将文档多模态RAG分为两种路线,一种是解析式文档多模态RAG(将一个文档切分为页面,然后再用版式识别的方式对文档进行各种模态元素进行分割、解析、提取,然后再嵌入、检索);另一种是DocVQA式文档多模态RAG(将文档切分为页面图像,不再细分,然后根据页面图像级别进行检索,类似于docvqa)。
当然,后者其实更偏向于前沿,前者则更为落地,所以大家对于技术,要有区分能力,选择最为合适的才能从根上解决问题。
参考文献
1、https://mp.weixin.qq.com/s/IIg1hPwhADYb0vs3Hqzfgg
2、https://blog.csdn.net/Code1994/article/details/143201281
3、https://arxiv.org/pdf/2407.01449
4、https://arxiv.org/pdf/2410.10594
5、https://arxiv.org/pdf/2411.04952
关于我们
老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入