什么是RAG
什么是RAG: Retrieval Augmented Generation,检索增强生成。是一种结合了信息检索技术和大型语言模型提示功能的框架。它通过从数据源检索信息来辅助LLM生成答案,提高了模型在知识密集型任务中的准确性和可信度。
我们为什么需要RAG: 大型语言模型通常基于固定的历史数据集进行训练,这意味着它们的知识是过时的,无法涵盖最新的信息或特定领域的专业知识。RAG的目的是通过引入额外知识库,检索其中的相关信息,并根据检索结果给予用户回答。这也可以显著减少大模型因为并不具备相关知识,而出现的“幻觉”现象。当然我们也可以直接把整个数据库作为LLM的prompt输入,但由于transformer架构O(N2)复杂度的限制,LLM支持的最长输入长度通常有限,多数支持到128k token已经是极限,使得在面临更长知识库输入时,RAG依然是当下唯一可行的解决方案。
如何实现RAG: 在实际应用时,我们常需要给定一系列文档,并使用RAG方法,让LLM针对这些文档进行检索与交互。RAG的实现主要包含以下几个步骤:
走向多模态RAG
从RAG的应用可以看出,多数时候,我们需要把一些文档作为RAG的输入,用于检索和生成。而现实应用中,文档通常是以图文交错的形式存在的,比如网页、PDF、PPT文件等等。
通常的做法是,只保留文档中的文本信息。对于PDF文档,则进行OCR文字识别,读取其中的文本。但这样会导致大量图片中至关重要的信息被丢失,以及很多结构化内容的错乱,比如标题、表格、页眉页脚等格式错乱。
改进的做法是,把所有模态信息都转换为纯文本,再进行RAG。我们可以使用多种计算机视觉模型,比如检测模型对文档结构进行识别,然后对文档中不同的模块,使用不同的“广义OCR模型”进行解析。比如对于文本段落,使用OCR模型进行文本识别;对于表格,可以用表格模型进行识别转换为Markdown或LaTeX文本;对于公式,则套用公式识别转换为LaTeX;对于图片,则可使用多模态大模型如GPT-4o进行文本解读(caption),保存为文本描述。有很多开源的工具可以完成这些事情,比如MinerU等。通过解析算法,多模态数据就被完全转换为纯文本的格式了,也就可以照葫芦画瓢套用纯文本的RAG方法了。
我们注意到,使用上述的方法,信息不可避免会存在丢失,而且依赖过多的解析模型。而时间来到2024年,多模态大模型实现了爆发式的技术突破,高分辨率的视觉输入已经取得了巨大突破,使用单一的多模态大模型做广义OCR也变得非常容易。比如QWen2-VL以及InternVL-2等开源多模态大模型,在文档的广义OCR上都有非常好的效果。
多模态大模型成功,让端到端(end-to-end)的算法已经成为了主流。原生多模态的RAG算法也成为了可能:既然多模态大模型有能力理解文本,那我们其实即无需再把图像转换为文本,而可以直接使用图像,提取embedding去做RAG。
即从图(a)转变为图(b)的模式
DSE,即Document Screenshot Embedding,是一个不使用广义OCR的多模态RAG方法,直接把原始文档的扫描图片,切片后,使用视觉语言模型的编码器编码。其对query和docunment使用了双编码的架构。验证了这一想法的可行性。
ColPali架构也是利用视觉语言模型来从文档页面的图像中产生高质量的上下文化嵌入。ColPali使用了延迟交互(late interaction)技术,大大提高了检索效率,同时在检索性能上超越了现有的文档检索系统,并且具有更快的处理速度和可端到端训练的特点。上图对比了传统的文档RAG与多模态RAG的区别。因为减少了广义OCR的解析过程,使得处理速度也有了质的提升。
延迟交互编码结合了双编码器和交叉编码器的优点。在这种架构中,query和文档被分别编码成独立的embedding集合,然后通过一个高效的交互机制来计算它们之间的相似度。
延迟交互编码的核心思想是将查询和文档的编码过程分开,这样文档的编码可以离线完成,而查询的编码则在在线阶段进行。这种方法的优点是可以在查询时仅对查询进行编码,从而大大提高了处理速度。此外,由于文档的编码是预先完成的,可以将其存储在数据库中,这样就可以对更多的文档进行排序,从而提高查询的精度。
在延迟交互编码中,一个关键的计算是最大相似性(MaxSim)函数,它计算每个查询Token向量与所有文档Token向量之间的相似度,并跟踪每个查询Token的最大得分。查询和文档的总相似度分数是这些最大余弦相似度分数的总和。这种方法允许模型在保持较高排序质量的同时,也具备较高的性能。
随着多模态大语言模型能力的增强,以它为基础的多模态RAG,也早已突破了传统的图像检索的应用方式,而是真正具备大规模非结构化多模态数据深度理解的能力,将会有更多toB的商业应用价值。
原文链接: