2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

MiniCPM-V 系列模型在多模态文档 RAG 中的应用

发布日期:2024-08-20 08:54:51 浏览次数: 3243
作者:github

微信搜一搜,关注“github ”

原文链接:https://github.com/RhapsodyAILab/Awesome-MiniCPMV-Projects/tree/main/visrag


在相当长一段时间内,检索增强生成(RAG)需要使用 OCR 技术把文档中的文本抽取出来,接着使用文本嵌入模型获得语义向量,利用语义向量构建知识库进行检索。这种方法,会丢失所有的图像信息、大部分表格信息、图表信息,存在不可避免的信息损失。

是否能够用一种近乎无损的方法来表征复杂图文文档,从而用来信息无损地检索多模态文档?

传统的图文检索方法包括 CLIP 模型和 SigLip 模型,这些模型在对比学习训练中或多或少获得了一些文档表征能力,但由于先天的结构设计问题,这些模型并不能很好地处理信息密度极高、语义极为复杂的文档,进而无法用作文档表示模型。

但以 GPT-4V, QwenVL, MiniCPM-V-2.0 等为代表的支持 OCR 能力的视觉语言模型,能够理解复杂的图文交错的文档,无论是文本密集型还是图像密集型文档,模型均借助视觉编码器的视觉能力和语言模型基座的强大的文本功底,形成良好的复杂文档理解能力。

那么,在这些支持 OCR 能力的模型上训练不需要 OCR 的向量检索模型,用来在大量文档中检索所需要的文档,就成为可能。


现在我们以 OpenBMB 基于 MiniCPM-V-2.0 训练的端到端多模态检索模型 MiniCPM-Visual-Embedding-v0 为例,实现多模态检索。

若不熟悉代码或无GPU,本教程中的代码其实可以忽略,意会即可,笔者在huggingface上搭建了几个免费的demo可以给大家使用。


若不熟悉多模态信息检索也没有关系!本文的小标题非常容易follow。


多模态检索

配置环境

如果你是 Linux+英伟达GPU用户,在开始前,我们需要配置 MiniCPM-V 的运行环境。确保有 8GB 的显存。

首先应该创建一个空的环境,这里用的是 python 自带的 venv 库。

python -m venv visrag

创建一个空的 python 3.10 环境,然后进入这个环境:

source visrag/bin/activate

用 pip 安装下面的包:

PyMuPDF
tqdm
gradio
Pillow==10.1.0
sentencepiece==0.1.99
numpy==1.26.0
transformers==4.40.2
torch==2.1.2
torchvision==0.16.2
timm

然后需要安装 torch 和 torchvision,笔者喜欢从 pytorch 的官方镜像站 https://download.pytorch.org/whl/torch/ 下载,或通过普通的 pip 安装。

这里作者的环境是ubuntu18.04+nvidia a800,这里的安装方法不要求cuda版本匹配,只需要nvidia gpu driver能正常工作即可。 为了兼容大多数gpu driver版本,作者建议下载

  • Torch https://download.pytorch.org/whl/cu118/torch-2.1.2%2Bcu118-cp310-cp310-linux_x86_64.whl#sha256=60396358193f238888540f4a38d78485f161e28ec17fa445f0373b5350ef21f0

  • Torchvision https://download.pytorch.org/whl/cu118/torchvision-0.16.2%2Bcu118-cp310-cp310-linux_x86_64.whl#sha256=18470aef0bbde73f5a6a96135cd457f4d8be31f60be7ceae4ef5174f02f73add

下载完成后,使用

pip install torch-2.1.2+cu118-cp310-cp310-linux_x86_64.whl
pip install torchvision-0.16.2+cu118-cp310-cp310-linux_x86_64.whl

完成torch和torchvision的安装。


下载视觉检索模型

安装完成后,需要下载 MiniCPM-Visual-Embedding-v0 的模型权重。

这里我们从 huggingface 下载权重

pip install huggingface-hub
huggingface-cli download --resume-download RhapsodyAI/minicpm-visual-embedding-v0 --local-dir minicpm-visual-embedding-v0 --local-dir-use-symlinks False

如果是在国内,可以首先执行下面的代码再下载

export HF_ENDPOINT=https://hf-mirror.com

我们也在 modelscope 上提供下载:

pip install modelscope
modelscope download --model RhapsodyAI/MiniCPM-Visual-Embedding-v0

等待几分钟后可以在当前目录下找到 minicpm-visual-embedding-v0 目录,模型已经下载完成。


加载模型

按照 官方readme 里面的代码,这里需要把 model_path 改成刚刚下载的 minicpm-visual-embedding-v0的路径:

model_path = './minicpm-visual-embedding-v0'
from transformers import AutoModelfrom transformers import AutoTokenizerfrom PIL import Imageimport torchdevice = 'cuda:0'# Load model, be sure to substitute `model_path` by your model path model_path = '/local/path/to/model'tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)model = AutoModel.from_pretrained(model_path, trust_remote_code=True)model.to(device)



最简单的例子:提一个问题,找出最相关的图像文档

这里提供了 3 张例子图片,分别是 image1.pngimage2.pngimage3.png,需要把路径分别替换进下面的代码。

这个代码实现的是模型的加载和一个最简单的检索。这里用户的问题是 Who was elected as president of United States in 2020?,同时提供了 3 张候选图片,其中有一张图片里的文档是能够回答这个问题的,其他的不能。

# Load image to PIL.Image objectimage_1 = Image.open('/local/path/to/images/memex.png').convert('RGB')image_2 = Image.open('/local/path/to/images/us2020.png').convert('RGB')image_3 = Image.open('/local/path/to/images/hard_negative.png').convert('RGB')# User queryquery_instruction = 'Represent this query for retrieving relavant document: 'query = 'Who was elected as president of United States in 2020?'query_full = query_instruction + query# Embed image documentswith torch.no_grad():    p_reps = model(text=['', '', ''], image=[image_1, image_2, image_3], tokenizer=tokenizer).reps# Embed text querieswith torch.no_grad():    q_reps = model(text=[query_full], image=[None], tokenizer=tokenizer).reps # [B, s, d]# Calculate similaritiesscores = torch.matmul(q_reps, p_reps.T)print(scores)# tensor([[-0.0112,0.3316,0.2376]], device='cuda:0')

在这个代码中,我们需要首先对问题加上一个 prompt,这会告诉模型这是一个用户的问题:

# User queryquery_instruction = 'Represent this query for retrieving relavant document: 'query = 'Who was elected as president of United States in 2020?'query_full = query_instruction + query

然后我们把文档和问题分别用训练好的视觉文档检索模型编码,如下:

# 编码文档with torch.no_grad():    p_reps = model(text=['', '', ''], image=[image_1, image_2, image_3], tokenizer=tokenizer).reps
# 编码问题with torch.no_grad():    q_reps = model(text=[query_full], image=[None], tokenizer=tokenizer).reps # [B, s, d]

然后需要对问题每一页文档计算向量相似度:

scores = torch.matmul(q_reps, p_reps.T)print(scores)

这之后就能够知道哪个文档与这个问题的相关性最强,根据相似性取出 K 个文档作为检索结果。

可以看到输出的分数是:

tensor([[-0.0112,  0.3316,  0.2376]], device='cuda:0')

这些分数表示了每个图像文档和问题直接的相似性:

Image 1 这是一个完全无关的文档。(得分-0.0112) 

Image 2 这是能解决问题的文档。(得分0.3316) 

Image 3 这是一个混淆项,它确实和 president election of United States 有关,但并不能解答用户的问题 Who was elected as president of United States in 2020?。(得分0.2376)

本地可部署的 Gradio Demo

像上面这样用代码做检索非常麻烦,笔者在 MiniCPM_Visual_Document_Retriever_Demo 的仓库里上传了一个可以本地部署的一个demo,这个demo可以对着一个很长的PDF问问题,检索最相关页面,可以很大程度节省阅读无关页面的时间。

唯一需要改的是 model_path 需要换成刚刚下载的 minicpm-visual-embedding-v0 的路径。然后需要通过 pip 安装 gradio

pip install gradio

然后运行

python app.py

就会打开一个demo,可以对pdf提问题。

只需要在Upload PDF处上传一个PDF文件,点击 Process PDF 等待每一页被模型编码完成后,会得到一个知识库ID,这个ID会存在内存中,可以后续长时间使用。

之后,有了这个知识库ID就可以对PDF提问题了,这里的问题可以是陈述句也可以是问题,系统会返回最匹配的 K 个文档。

笔者以自己的一篇文章手稿为例,上传文章PDF并提了一个问题:

笔者认为,这个结果是相当不错的,笔者当时画这两张图确实是为了探究 semantic stitching 不是 trivial 的,看来模型对于图像的理解还是可以的。

Huggingface 在线 Demo

即使没有GPU,也可以在 huggingface 的 space 上免费用这个 demo,不用本地部署,解放双手。Huggingface Demo。这个demo是笔者开的,用户可以免费用。


进阶:全流程多模态 RAG

至此,我们已经拿到了检索的最相关页面,但是阅读这些页面并回答也需要时间,这个情况在 MiniCPM-V-2.6 发布之前,要用 GPT-4V 的 api 来实现生成,但现在有了 MiniCPM-V-2.6 的强大的多图综合理解能力(其实笔者恰好参与了 MiniCPM-V-2.6 多图理解的训练,所以,笔者觉得是时候实现一下 RAG 的生成部分了!)

MiniCPM-V-2.6 将会根据这些文档图片来生成一个问题的答案。

下载 MiniCPM-V-2.6

我们可以用类似的方式下载 MiniCPM-V-2.6。

这里我们从 huggingface 下载权重:

huggingface-cli download --resume-download openbmb/MiniCPM-V-2_6 --local-dir MiniCPM-V-2_6 --local-dir-use-symlinks False

如果是在国内,可以首先执行下面的代码再下载

export HF_ENDPOINT=https://hf-mirror.com

等待几分钟后可以在当前目录下找到 MiniCPM-V-2_6 目录,模型已经下载完成。


加载 MiniCPM-V-2.6

按照官方给出的readme,把path替换为本地下载好的 MiniCPM-V-2.6 即可。

import torchfrom PIL import Imagefrom transformers import AutoModel, AutoTokenizermodel = AutoModel.from_pretrained('/path/to/MiniCPM-V-2_6', trust_remote_code=True,    attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eagermodel = model.eval().cuda()tokenizer = AutoTokenizer.from_pretrained('/path/to/MiniCPM-V-2_6', trust_remote_code=True)


把检索结果传给 MiniCPM-V-2.6 生成解答

这里是个例子:

image1 = Image.open('image1.jpg').convert('RGB')image2 = Image.open('image2.jpg').convert('RGB')question = 'Compare image 1 and image 2, tell me about the differences between image 1 and image 2.'msgs = [{'role': 'user', 'content': [question, image1, image2]}]answer = model.chat(    image=None,    msgs=msgs,    tokenizer=tokenizer)print(answer)

然后笔者搭建了一个huggingface demo,把这一套流程集成到了多模态检索流程中,就是说,在召回了多个候选图片文档后,会传给生成模型生成解答。这里笔者发现一个有趣的现象,可能也是必然,就是 这里用户的问题 question 最好能放在所有图片之前,这样我觉得模型能够有更多的「时间」来理解这个问题。实际试下来,发现问题在后的话,回答质量一般,但放在图片之前,就会好很多!


下面是笔者用自己搭建的 hf demo 检索-生成答案的一个例子:

在这个case中,笔者上传了一篇之前看过的paper,https://arxiv.org/abs/2402.09906 笔者把pdf上传到demo上,进行编码,笔者想考验一下这个系统能否正常工作,于是笔者就问了一下「如果对比学习中把文档的梯度停掉,不反向传播会怎样」,检索出的第一个页面就是笔者脑海中的那个,并且生成模型 MiniCPM-V-2.6 也很给力的把笔者想说的给说了,见生成的最后一句话。


好了,现在放上笔者的hf demo链接,有兴趣的小伙伴可以去试一下,和上面一样都是免费用的,如果想自己部署的话,把space里面的代码clone下来就可以在本地跑起来了,快去试试吧!

python app.py

demo链接奉上:https://huggingface.co/spaces/bokesyo/MiniCPMV-RAG-PDFQA

demo源代码:https://huggingface.co/spaces/bokesyo/MiniCPMV-RAG-PDFQA/tree/main


希望笔者可以给大家使用 MiniCPM-V 系列做多模态RAG带来一定的启发。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅