- 引言
- 简介
- 架构
- 实战
- 总结
- 引言 ========
随着人工智能技术的快速发展,多模态检索增强生成(RAG)系统正在彻底改变传统基于文本的RAG方式。本文深入探讨了LocalGPT Vision这一创新技术,它不仅能处理文本信息,还能理解和分析图像内容。通过结合计算机视觉与自然语言处理技术,LocalGPT Vision为用户提供了更直观、更全面的信息检索和处理能力,开创了AI应用的新范式。
- 简介 ========
长期以来,RAG系统主要依赖于从大型知识库中检索文本片段,并通过生成模型扩展响应。具体可以参考之前的RAG实战: RAG实战 | 基于LlamaIndex的文档问答系统 。然而,这种方法在处理复杂文档,尤其是包含大量视觉信息的文档时,存在明显局限性。LocalGPT-Vision引入了视觉语言模型(Vision Language Models, VLM)的强大功能,克服了这一障碍,使得系统不仅能处理文本,还能对完整文档的视觉内容进行分析。
LocalGPT-Vision的核心技术结合了 视觉文档检索 和 视觉语言模型(VLM) 的优势,用于回答用户提出的查询。该系统不仅依赖文本信息,还能分析文档中的图像、图表等视觉元素。通过使用诸如Google Gemini或GPT-4等先进模型,LocalGPT-Vision可以处理图像,生成嵌入向量,并检索最相关的内容,从而提供全面而精准的答案。
- 架构 ========
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
系统特点
- 端到端视觉化RAG :同时结合视觉文档检索和语言模型,提供全面答案。
- 文档上传与索引 :支持上传PDF和图片文件,使用ColPali模型进行索引以便后续检索。
- 聊天界面 :通过交互界面对已上传文档进行提问。
- 会话管理 :支持创建、重命名、切换和删除聊天会话。
- 模型选择 :用户可选用不同的视觉语言模型(如Qwen2-VL-7B-Instruct、Google Gemini、OpenAI GPT-4等)。
- 持久化索引 :索引存储于本地磁盘,系统重启后可直接加载。
整体框架
LocalGPT-Vision通过ColPali模型(V-LLM模型,作为视觉编码器)将文档页面转化为嵌入向量,并通过图像嵌入实现高效匹配与检索。整体流程可概述如下:
LocalGPT-Vision是一个端到端的基于视觉的RAG系统。该体系结构包括两个主要部分:
-
视觉文档检索(Colqwen与ColPali)
- Colqwen和ColPali为高效文档检索而设计,直接将文档页面视为图像处理。
- 不依赖OCR或文本提取,而是基于布局、字体、图表等视觉线索生成嵌入。
- 文档页面在索引环节被转化为图像嵌入向量并存储。
- 查询环节中,用户的查询与嵌入向量进行匹配,检索出与之最相关的页面。
-
响应生成(基于视觉语言模型的生成响应):
- 检索到的文档图像被传递给视觉语言模型(VLM)。
- 支持的VLM模型包括Qwen2-VL-7B-Instruct、LLAMA3.2、Pixtral、Molmo、Google Gemini和OpenAI GPT-4等。
- 这些模型通过理解文档的视觉和文本内容来生成响应。
- 注意:响应的质量高度依赖于所使用的VLM和文档图像的分辨率。
这种体系结构消除了对复杂文本提取链路的需要,并通过考虑文档的视觉元素,提供了对文档更全面的理解。并且执行时不需要传统RAG系统中使用的任何分块策略或选择Embedding模型或检索策略。如下图2,3所示。
图2
图3
虽然ColPali在语义模型Query检索阶段的耗时可能会比传统方式稍慢一些,但按总体流程来看,其速度远胜于传统方案。
ColBERT
由于ColPali涉及ColBERT,所以先简要介绍ColBERT。下图展示了ColBERT的架构,包括:
-
查询编码器
-
文档编码器
-
后期交互机制
在处理查询 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 方法,生成多个向量表示图像内容。
具体而言,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。
- 实战 ========
准备工作
- 克隆仓库。
git
clone
https://github.com/PromtEngineer/localGPT-Vision.git
cd
localGPT-Vision
- 创建Conda环境。
conda create -n localgpt-vision python=3.10
conda activate localgpt-vision
- 安装依赖。
pip install -r requirements.txt
- 安装Huggingface-Dev版本的Transformers
pip uninstall transformers
pip install git+https://github.com/huggingface/transformers
- 设置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'
- 运行LocalGPT
python app.py
- 你可以在本地打开web浏览器并链接找到应用
http://localhost:5050/
使用本地模型
- 先从huggingface下载用以建立索引的模型,如何从huggingface下载模型可以 参考这里 。官方提供了ColPali和ColQwen版。比如ColQwen的huggingface下载链接:https://huggingface.co/vidore/colqwen2-v0.1-merged/tree/main
- 进入
models/indexer.py
文件修改embedding索引模型的路径,搜索Index\_documents
函数,修改里面调用indexer\_model
的路径,此处直接指定已经下载的本地colqwen2模型路径,在调用RAG模型之前定义index\_model
路径
indexer\_model =
"your local index model path"
实战-图1
- 修改读取V-LM路径,修改为本地。进入
models/model\_loader.py
将其修改为Qwen2模型路径,此处可以添加一个变量声明。
local\_model\_path =
"you local Vision LM path"
然后,再修改QWen2-VL模型读取函数的路径和 processor的载入路径,都修改为刚刚声明的变量路径。
实战-图2
- 回到web网页端,创建一个对话session,点击“回形针”的按钮,上传pdf文件构建本地文档索引库,此处上传的是著名的Attention is all you need, Bert模型的论文,indexing过程需需要一些时间。
实战-图3
当文档索引完成后,web端将会提示 Files indexed successfully.
实战-图4
- 随后可以开始按自己的想法搜索,比如尝试询问一下Transformer模型的意思,Vision-LM根据文档内容页面截图+图文理解给出了相应的解释:
实战-图5
- 再试验一下用中文query的结果,结果也算差强人意(因小编本地GPU能力限制,故最终推理的模型选用的是Qwen2-2B-VL-Instruct模型,结果预期可能不如Qwen2-7B-Instruct的好):
实战-图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调用接口编写替换即可。
- 总结 ========
本文探讨了从基于文本的检索增强生成(RAG)到视觉人工智能(Vision AI)的转变,重点介绍多模态RAG系统:LocalGPT Vision的创新。该系统结合视觉文档检索和视觉语言模型(VLM),可同时处理文本和图像,突破传统RAG的局限,广泛适用于科学研究、法律分析和医疗等领域。通过更全面的多模态分析,LocalGPT Vision为AI理解信息开辟了新可能,标志着AI从文本时代迈向多模态未来的关键一步。
LocalGPT Vision优点:
-
- 大幅度提高了文档检索的效率,减小了传统文档检索长链路的各项工程成本。
-
- 提供了较友好的本地文档检索系统,提供了一套现成的端到端检索演示。
-
- 提供了多个V-LLM推理的选项,便于比较不同视觉模型的语义替换效果。
LocalGPT Vision缺点:
-
- 询问一些文档内的数字细节时存在数据丢失的情况。
-
- embedding模型训练的数据只包含英文,其他语种支持不足。
-
- 最终输出结果的强依赖于V-LLM的能