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

将视觉-语言智能引入-RAG-的-ColPali

将视觉-语言智能引入 RAG 的 ColPali

原文:towardsdatascience.com/bringing-vision-language-intelligence-to-rag-with-colpali/

如果你曾经尝试构建一个 RAG(检索增强生成)应用程序,你很可能熟悉表格和图片带来的挑战。本文探讨了如何使用视觉语言模型,特别是 ColPali 模型,来处理这些格式。

但首先,RAG 到底是什么——为什么表格和图片会使其变得如此困难?

RAG 和解析

想象一下,你面临着一个类似的问题:

我们公司处理退款的政策是什么?

一个基础的大型语言模型(LLM)可能无法回答这个问题,因为这种信息是公司特定的,通常不包括在模型的训练数据中。

因此,一种常见的方法是将 LLM 连接到知识库——例如包含各种内部文档的 SharePoint 文件夹。这使得模型能够检索和整合相关上下文,使其能够回答需要专业知识的问题。这种技术被称为检索增强生成(RAG),通常涉及处理 PDF 等文档。

然而,从大量且多样化的知识库中提取正确信息需要广泛的文档预处理。常见的步骤包括:

  1. 解析:将文档解析为文本和图像,通常辅以 Tesseract 等光学字符识别(OCR)工具。表格最常被转换为文本

  2. 结构保留:保持文档的结构,包括标题、段落,通过将提取的文本转换为保留上下文的格式,例如 Markdown

  3. 分块:分割或合并文本段落,以便在没有使段落显得不连贯的情况下将它们输入上下文窗口

  4. 丰富:提供额外的元数据,例如提取关键词或提供摘要以简化发现。可选地,通过多模态 LLM 为图片添加描述性文本,使图片可搜索

  5. 嵌入:将文本(以及可能的多模态嵌入的图片)嵌入,并将它们存储到向量数据库中

如你所想,这个过程非常复杂,涉及大量的实验,并且非常脆弱。更糟糕的是,即使我们尽力去做,这种解析最终可能仍然不起作用。

为什么解析经常不够用

表格和图片通常存在于 PDF 中。下面的图片显示了它们通常是如何被解析以供 LLM(大型语言模型)使用的:

来源:图片由作者提供。

  • 文本被分块

  • 表格被转换为文本,无论包含什么内容都被复制,但不保留表格边界

  • 图像被输入到多模态 LLM 以生成文本摘要,或者,原始图像被输入到多模态嵌入模型,而不需要生成文本摘要

然而,这种传统方法有两个固有的问题。

#1. 复杂表格不能简单地被解释为文本

以这个表格为例,我们作为人类会解释>2˚C 至 2.5˚C的温度变化对健康的影响是到 2080 年,温度上升 2.3˚C 将使高达 2700 万人面临疟疾风险

来源:气候变化的影响和成本

然而,如果我们把这个表格转换成文本,它看起来会是这样:温度变化 在 EC 目标内 <(2˚C) >2˚C 至 2.5˚C >3C 健康全球估计到 2080 年,温度上升 2.3˚C 将使 2700 万人面临风险,而温度上升 3.3˚C 将使高达 330...

结果是一块混乱的文本,没有明显的意义。即使是人类读者,也无法从中提取任何有意义的见解。当这种文本被输入到大型语言模型(LLM)时,它也无法产生准确的解释。

#2. 文本和图像之间的解耦

图片的描述通常包含在文本中,它们彼此不可分割。以下是一个例子,我们知道这个图表表示的是“不同纯时间偏好率和递减折现率方案的气候变化模拟成本”

来源:气候变化的影响和成本

然而,当这种描述被解析时,图像描述(解析文本)将与图像(解析图表)分离。因此,我们可以预期,在 RAG 过程中,当我们提出像“气候变化成本是多少?”这样的问题时,图像不会被作为输入检索。

因此,即使我们试图在解析过程中尽可能保留尽可能多的信息,但在面对现实场景时,它们通常都做得不够。

考虑到解析在 RAG 应用中的关键作用,这难道意味着 RAG 代理在处理复杂文档时注定要失败吗?绝对不是。有了 ColPali,我们有一个更精细、更有效的方法来处理这些问题。

什么是 ColPali?

ColPali 的核心前提很简单:人类阅读 PDF 是按页面的,而不是“块”,因此将 PDF 视为这样是有意义的:而不是通过解析的混乱过程,我们只是将 PDF 页面转换为图像,并使用这些图像作为 LLM 提供答案的上下文。

现在,使用多模态模型嵌入图像的想法并不新颖——它是一种常见的技术。那么,ColPali 有什么独特之处?关键在于它从 ColBERT 中汲取灵感,ColBERT 是一种将输入嵌入到多向量的模型,这使得搜索更加精确和高效。

在深入探讨 ColPali 的功能之前,让我简要地介绍一下 ColBERT 是什么。

ColBERT:为文本提供细粒度、上下文感知嵌入

ColBERT 是一种利用多向量增强文本搜索准确性的文本嵌入和重排序技术。

让我们考虑这个案例:我们有一个问题:“保罗是素食主义者吗?”,我们需要确定哪个文本块包含相关信息。

黄色高亮显示的文本包含有关保罗的信息

理想情况下,我们应该将Text Chunk A识别为最相关的部分。但如果我们使用单向量嵌入模型(text-ada-002),它将返回Text Chunk B

原因在于单向量双编码器——如 text-ada-002——的工作方式。它们试图将整个句子压缩成一个向量,而不以上下文感知的方式编码单个单词。相比之下,ColBERT以上下文感知的方式嵌入每个单词,从而产生更丰富、多向量的表示,能够捕捉更多细微的信息。

向量中的数字仅用于说明,并不代表实际值

ColPali:处理类似文档图像的 ColBERT 的兄弟

ColPali 遵循类似的哲学,但将其应用于类似文档的图像。正如 ColBERT 将文本分解并单独嵌入每个单词一样,ColPali 将图像分割成块,并为每个块生成嵌入。这种方法保留了更多图像的上下文细节,从而实现了更准确和有意义的解释。

除了更高的检索准确性之外,ColPali 的好处还包括:

  1. 可解释性:ColPali 允许在查询词和文档的各个图像块之间进行词级比较。这使得我们能够清楚地理解和证明为什么某个文档被认为更相关。

  2. 减少开发工作量与提高鲁棒性:通过消除对复杂预处理管道的需求——例如分块、OCR 和布局解析——ColPali 显著减少了开发时间并最小化了潜在故障点。

  3. 性能提升:嵌入和检索过程更快,从而提高了整体系统的响应速度。

现在你已经了解了 ColPali,让我们深入代码,看看 ColPali 是否可以解决我们之前提到的挑战!

示意图

我的代码可以在我的GitHub上找到。关于它的一些话:

  • 实例:运行代码需要一个配备 A100 GPU 的机器

  • 嵌入模型:ColPali 有多种变体,我在演示中使用vidore/colqwen2-v0.1。你可以在此排行榜上查看并切换到其他模型

  • 代理

    LLM:我正在使用 OpenRouter 来消费 LLM,代理由GPT-4o驱动。你可以用任何可以接受图像作为输入的多模态 LLM 来替换它

    编排:使用LangGraph来开发代理

  • 用于将 PDF 转换为图像的库pdf2image,这是一个poppler的包装器。所以请确保你也安装了poppler

  • 样本数据:由 Paul Watkiss 等人撰写的“气候变化的影响和成本”,该文档公开可在此获取

结果

代码相当直接,所以我将直接进入结论:ColPali 如何处理我们在“为什么解析经常不足?”部分看到的问题?

#1. 复杂表格不能简单地被解释为文本

问题:如果温度比工业化前水平高出 3 度,健康影响会怎样?

答案:如果温度比工业化前水平高出 3 摄氏度,健康影响将是显著的。具体来说,预计到 2080 年,将有高达 3.3 亿人面临疟疾风险。与 20 世纪 20 年代相比,当时面临风险的人数在 5000 万到 1 亿之间,这是一个巨大的增加。

这是从 PDF 中的此表格中正确引用的!

来源:《气候变化的影响和成本》第 3 页

#2. 文本与图像之间的脱节

问题:根据绿色书籍下降模型,气候变化的模型成本是多少?

答案:根据绿色书籍下降模型,气候变化的经济成本模型为 7.2 欧元/吨二氧化碳

正确答案应该是 7.4 欧元/吨二氧化碳,但我们可以看到它非常接近正确值!

来源:《气候变化的影响和成本》第 46 页

结论

传统的 RAG 管道在处理非文本内容时遇到困难。ColPali 将每一页 PDF 视为图像,允许它处理视觉布局、表格、图表和嵌入的图形——这些是标准文本解析器经常扭曲或忽略的格式。

ColPali 将视觉-语言智能引入 RAG,使其能够更好地处理企业文档的混乱的多模态现实。

除非另有说明,所有图像均为作者所有*

http://www.jsqmd.com/news/543524/

相关文章:

  • 嵌入式系统的启动流程与初始化详解
  • GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)
  • STM32 GPIO模式实战:开漏输出与推挽输出的5个常见应用场景解析
  • CasRel模型智能体(Agent)应用:自主进行信息检索与关系归纳
  • 如何用WebPlotDigitizer快速提取论文图表数据?5分钟学会高效科研技巧
  • 如何突破分子观察瓶颈?PyMOL开源版的3大核心优势
  • Claude Code技术架构解析:构建智能代码助手的工程实践路径
  • 将数据转化为解决方案-使用-Python-和-AI-构建智能应用
  • 为什么你的STM32F103工程编译失败?可能是启动文件没选对!
  • STP根桥选举避坑指南:华为交换机优先级设置的那些门道
  • 技能组合玩法:OpenClaw串联百川2-13B-4bits与Stable Diffusion技能
  • 将特征选择整合到模型估计中
  • 拯救你的方块世界:Minecraft存档修复必备工具Minecraft-Region-Fixer完全指南
  • Squareline Studio + LVGL实战:从Figma设计到MCU屏幕的UI开发一条龙(避坑中文显示)
  • GD32 ADC模块的通道切换与转换模式详解
  • 将推荐器-Transformer-扩展到十亿参数
  • lychee-rerank-mm一文详解:如何用lychee-rerank-mm替代Cross-Encoder
  • 开源视觉模型推荐:GLM-4v-9B,高分辨率输入,中文OCR领先
  • Cursor最新版0.44.11配置DeepSeek-R1模型保姆级教程(含报错解决方案)
  • CFD-Post自动化后处理:利用脚本与外部工具高效生成多截面图表
  • 三层架构破解小红书数据采集难题:Appium+MitmProxy双引擎实战
  • ssm+java2026年毕设斯唛健身工作室管理系统【源码+论文】
  • OpenClaw+Qwen3-32B低成本方案:RTX4090D镜像长任务稳定性实测
  • C#当窗体边框设置为None时如何移动窗体
  • ssm+java2026年毕设四川旅游网站【源码+论文】
  • 解决Windows Defender性能困扰:windows-defender-remover的系统优化方案
  • HunyuanVideo-FoleyAPI部署教程:FastAPI服务封装与Swagger文档调用
  • Jetson Orin(Ubuntu20.04)SSH服务启动失败排查:从“Connection refused”到“no hostkeys available”的修复实录
  • OpenClaw+GLM-4.7-Flash成本对比:自建模型比API调用节省30%token消耗
  • Windows VHDX优化:WIM部署、NTFS压缩与启动提速