多模态RAG | LocalGPT-Vision多模态检索系统理论&实战

向量数据库大模型数据库
  • 引言
  • 简介
  • 架构
  • 实战
  • 总结
  1. 引言 ========

随着人工智能技术的快速发展,多模态检索增强生成(RAG)系统正在彻底改变传统基于文本的RAG方式。本文深入探讨了LocalGPT Vision这一创新技术,它不仅能处理文本信息,还能理解和分析图像内容。通过结合计算机视觉与自然语言处理技术,LocalGPT Vision为用户提供了更直观、更全面的信息检索和处理能力,开创了AI应用的新范式。

  1. 简介 ========

长期以来,RAG系统主要依赖于从大型知识库中检索文本片段,并通过生成模型扩展响应。具体可以参考之前的RAG实战: RAG实战 | 基于LlamaIndex的文档问答系统 。然而,这种方法在处理复杂文档,尤其是包含大量视觉信息的文档时,存在明显局限性。LocalGPT-Vision引入了视觉语言模型(Vision Language Models, VLM)的强大功能,克服了这一障碍,使得系统不仅能处理文本,还能对完整文档的视觉内容进行分析。

LocalGPT-Vision的核心技术结合了 视觉文档检索视觉语言模型(VLM) 的优势,用于回答用户提出的查询。该系统不仅依赖文本信息,还能分析文档中的图像、图表等视觉元素。通过使用诸如Google Gemini或GPT-4等先进模型,LocalGPT-Vision可以处理图像,生成嵌入向量,并检索最相关的内容,从而提供全面而精准的答案。

  1. 架构 ========

LocalGPT-Vision是一个端到端、基于视觉的检索增强生成(RAG)系统。通过支持文档(如PDF或图片)的上传,用户可以基于文档内容进行问答。系统采用Colqwen或ColPali模型执行检索,并将检索到的页面交由视觉语言模型(VLM)生成最终响应。目前支持的VLM包括:Qwen2-VL-7B-Instruct、LLAMA-3.2-11B-Vision、Pixtral-12B-2409、Molmo-7B-O-0924、Google Gemini、OpenAI GPT-4、LLAMA-3.2 with Ollama。

GitHub地址:https://github.com/PromtEngineer/localGPT-Vision

picture.image

系统特点

  1. 端到端视觉化RAG :同时结合视觉文档检索和语言模型,提供全面答案。
  2. 文档上传与索引 :支持上传PDF和图片文件,使用ColPali模型进行索引以便后续检索。
  3. 聊天界面 :通过交互界面对已上传文档进行提问。
  4. 会话管理 :支持创建、重命名、切换和删除聊天会话。
  5. 模型选择 :用户可选用不同的视觉语言模型(如Qwen2-VL-7B-Instruct、Google Gemini、OpenAI GPT-4等)。
  6. 持久化索引 :索引存储于本地磁盘,系统重启后可直接加载。

整体框架

LocalGPT-Vision通过ColPali模型(V-LLM模型,作为视觉编码器)将文档页面转化为嵌入向量,并通过图像嵌入实现高效匹配与检索。整体流程可概述如下:

picture.image

LocalGPT-Vision是一个端到端的基于视觉的RAG系统。该体系结构包括两个主要部分:

  1. 视觉文档检索(Colqwen与ColPali)

    • Colqwen和ColPali为高效文档检索而设计,直接将文档页面视为图像处理。
    • 不依赖OCR或文本提取,而是基于布局、字体、图表等视觉线索生成嵌入。
    • 文档页面在索引环节被转化为图像嵌入向量并存储。
    • 查询环节中,用户的查询与嵌入向量进行匹配,检索出与之最相关的页面。
  2. 响应生成(基于视觉语言模型的生成响应):

    • 检索到的文档图像被传递给视觉语言模型(VLM)。
    • 支持的VLM模型包括Qwen2-VL-7B-Instruct、LLAMA3.2、Pixtral、Molmo、Google Gemini和OpenAI GPT-4等。
    • 这些模型通过理解文档的视觉和文本内容来生成响应。
    • 注意:响应的质量高度依赖于所使用的VLM和文档图像的分辨率。

这种体系结构消除了对复杂文本提取链路的需要,并通过考虑文档的视觉元素,提供了对文档更全面的理解。并且执行时不需要传统RAG系统中使用的任何分块策略或选择Embedding模型或检索策略。如下图2,3所示。

picture.image

图2

picture.image

图3

虽然ColPali在语义模型Query检索阶段的耗时可能会比传统方式稍慢一些,但按总体流程来看,其速度远胜于传统方案。

ColBERT

由于ColPali涉及ColBERT,所以先简要介绍ColBERT。下图展示了ColBERT的架构,包括:

  • 查询编码器

  • 文档编码器

  • 后期交互机制

picture.image

在处理查询 Q 和文档 D 时,ColBERT 首先通过查询编码器将 Q 转换为一组固定大小的嵌入向量(Eq),同时使用文档编码器将 D 转换为另一组嵌入向量(Ed)。Eq 和 Ed 中的每个向量都携带了 Q 和 D 中对应词语的上下文信息。

基于 Eq 和 Ed,ColBERT 采用后期交互机制计算 Q 与 D 之间的相关性分数,这一分数通过最大相似性(MaxSim)方法获得。具体来说,该机制识别 Eq 中每个向量与 Ed 中向量之间的最大内积,并将这些最大值累加,从而得出最终的相关性分数。

从原理上看,这种后期交互方式将查询中的每个 token 嵌入向量 tq 与文档的向量列表进行比较,评估其匹配程度。通过计算 tq 与文档中词向量 td 的最高相似度分数,ColBERT 可以量化查询与文档之间的匹配强度。最终,通过聚合所有查询 token 的最大匹配分数,ColBERT 对文档的整体相关性进行评估。

ColPali

ColPali 是一种创新的视觉语言模型(VLM)架构及训练策略,能够通过视觉特征高效地为文档编制索引。作为 PaliGemma-3B 的扩展,ColPali 可生成类似 ColBERT 风格的文本与图像多向量表示。与 ColBERT 不同的是,ColPali 以文本作为查询,文档则以图像形式存在。其视觉编码器通过多模态视觉大模型生成图像的多向量表示,而非单一向量。这一过程采用视觉变换器(ViT)的 patch embedding 方法,生成多个向量表示图像内容。

picture.image

具体而言,ColPali 使用视觉-语言模型(PaliGemma-3B)对图像进行编码,将图像分割为多个 patches,并将这些 patches 输入视觉变换器(SigLIP-So400m)。通过线性投影,这些 patch embeddings 被转化为“软”tokens,输入到语言模型(Gemma 2B)中,从而生成高质量的上下文 patch embedding。这些 embedding 位于语言模型的嵌入空间内,之后被投影到更低维度(D=128),以优化存储效率。最终,每页图像都被构建为一个多向量文档表示,并以紧凑形式存储。

在查询运行时,用户的查询将通过语言模型生成 token embedding。ColPali 支持 ColBERT 风格的后期交互(Late Interaction, LI)操作,将查询 token 与文档 patches 进行匹配。具体来说,LI 操作通过为查询中的每个术语搜索最相似的文档 patch 表示,并将所有查询术语的最相似 patch 分数累加,计算出最终的查询-文档匹配分数。这种后期交互机制允许查询中的所有术语与文档的多个 patches 充分交互,同时保留了标准双编码器嵌入模型快速匹配和离线计算的优势。通过 ColPali,不仅实现了快速索引,还确保了查询延迟几乎不受影响,从而在效率与性能之间达成平衡。

Colqwen

最新版的Colqwen是colqwen2,地址:https://huggingface.co/vidore/colqwen2-v1.0。 ColQwen2是基于Qwen2-VL-2B-Instruct和ColBERT策略的视觉检索器(Visual Retriever)。ColQwen是基于一种新颖的模型架构和训练策略的模型,该策略基于视觉语言模型(VLMs),可高效地根据视觉特征对文档进行索引。它是Qwen2-VL-2B的扩展版本,可生成文本和图像的ColBERT风格的多向量表示。可以简单理解Colqwen是将ColPali中的PaliGemma-3B替换为Qwen2-VL-2B-Instruct。

  1. 实战 ========

准备工作

  1. 克隆仓库。

        
        
            

          git 
          
 clone
 
           https://github.com/PromtEngineer/localGPT-Vision.git
          
   

 
          
 cd
 
           localGPT-Vision
          
   

 
        
      
  1. 创建Conda环境。

        
        
            

          conda create -n localgpt-vision python=3.10
          
   

 
          conda activate localgpt-vision 
          
   

 
        
      
  1. 安装依赖。

        
        
            

          pip install -r requirements.txt
          
   

 
        
      
  1. 安装Huggingface-Dev版本的Transformers

        
        
            

           pip uninstall transformers
          
   

 
           pip install git+https://github.com/huggingface/transformers
          
   

 
        
      
  1. 设置VLLM的APIkey,如果想新增国内的api配置,也可以设置国内其他V-LLM,比如Qwen-VL的API key。

        
        
            

          
 export
 
           GENAI\_API\_KEY=
          
 'your\_genai\_api\_key'
 
          
   

 
          
 export
 
           OPENAI\_API\_KEY=
          
 'your\_openai\_api\_key'
 
          
   

 
          
 export
 
           GROQ\_API\_KEY=
          
 'your\_groq\_api\_key'
 
          
   

 
        
      

Windows系统请输入下方指令


        
        
            

          
 set
 
           GENAI\_API\_KEY=your\_genai\_api\_key
          
   

 
          
 set
 
           OPENAI\_API\_KEY=your\_openai\_api\_key
          
   

 
          
 set
 
           GROQ\_API\_KEY=
          
 'your\_groq\_api\_key'
 
          
   

 
        
      
  1. 运行LocalGPT

        
        
            

          python app.py
          
   

 
        
      
  1. 你可以在本地打开web浏览器并链接找到应用

        
        
            

          http://localhost:5050/
          
   

 
        
      

使用本地模型

  1. 先从huggingface下载用以建立索引的模型,如何从huggingface下载模型可以 参考这里 。官方提供了ColPali和ColQwen版。比如ColQwen的huggingface下载链接:https://huggingface.co/vidore/colqwen2-v0.1-merged/tree/main
  2. 进入 models/indexer.py 文件修改embedding索引模型的路径,搜索 Index\_documents 函数,修改里面调用 indexer\_model 的路径,此处直接指定已经下载的本地colqwen2模型路径,在调用RAG模型之前定义 index\_model 路径

        
        
            

          indexer\_model = 
          
 "your local index model path"
 
          
   

 
        
      

picture.image

实战-图1

  1. 修改读取V-LM路径,修改为本地。进入 models/model\_loader.py 将其修改为Qwen2模型路径,此处可以添加一个变量声明。

        
        
            

          local\_model\_path = 
          
 "you local Vision LM path"
 
          
   

 
        
      

然后,再修改QWen2-VL模型读取函数的路径和 processor的载入路径,都修改为刚刚声明的变量路径。

picture.image

实战-图2

  1. 回到web网页端,创建一个对话session,点击“回形针”的按钮,上传pdf文件构建本地文档索引库,此处上传的是著名的Attention is all you need, Bert模型的论文,indexing过程需需要一些时间。

picture.image

实战-图3

当文档索引完成后,web端将会提示 Files indexed successfully.

picture.image

实战-图4

  1. 随后可以开始按自己的想法搜索,比如尝试询问一下Transformer模型的意思,Vision-LM根据文档内容页面截图+图文理解给出了相应的解释:
  2. picture.image

实战-图5

  1. 再试验一下用中文query的结果,结果也算差强人意(因小编本地GPU能力限制,故最终推理的模型选用的是Qwen2-2B-VL-Instruct模型,结果预期可能不如Qwen2-7B-Instruct的好):
  2. picture.image

实战-图6

踩坑记录

Q:文档索引化失败,为什么日志中报"Error indexing files: Error indexing files: Unable to get page count. Is poppler installed and in PATH?"的错误

A:在Linux环境下请先安装poppler工具来解析pdf文档,执行以下代码安装poppler工具


        
        
            

          sudo apt-get update
          
   

 
          sudo apt-get install poppler-utils
          
   

 
        
      

Q:本地没有GPU环境怎么办,可以通过云端API方式调用Qwen的VL大模型?

A:可以,只需要修改Qwen函数内的调用方式,根据阿里官方提供的Qwen-VL-MAX的api调用接口编写替换即可。

  1. 总结 ========

本文探讨了从基于文本的检索增强生成(RAG)到视觉人工智能(Vision AI)的转变,重点介绍多模态RAG系统:LocalGPT Vision的创新。该系统结合视觉文档检索和视觉语言模型(VLM),可同时处理文本和图像,突破传统RAG的局限,广泛适用于科学研究、法律分析和医疗等领域。通过更全面的多模态分析,LocalGPT Vision为AI理解信息开辟了新可能,标志着AI从文本时代迈向多模态未来的关键一步。

LocalGPT Vision优点:

    • 大幅度提高了文档检索的效率,减小了传统文档检索长链路的各项工程成本。
    • 提供了较友好的本地文档检索系统,提供了一套现成的端到端检索演示。
    • 提供了多个V-LLM推理的选项,便于比较不同视觉模型的语义替换效果。

LocalGPT Vision缺点:

    • 询问一些文档内的数字细节时存在数据丢失的情况。
    • embedding模型训练的数据只包含英文,其他语种支持不足。
    • 最终输出结果的强依赖于V-LLM的能
0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论