ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用VLM2Vec构建多模态检索应用:从嵌入向量到图像/文本搜索实战完整指南

用VLM2Vec构建多模态检索应用:从嵌入向量到图像/文本搜索实战完整指南
  • 人工智能
  • 多模态
  • Embedding
  • 微调
  • 计算机视觉
  • 深度学习
  • 机器学习
  • 模型评测

【免费下载链接】VLM2Vec

This repo contains the code for "VLM2Vec / MMEB" [ICLR 2025], "VLM2Vec-V2 / MMEB-V2" [TMLR 2026], and "MMEB-V3" [COLM 2026]

项目地址:https://gitcode.com/gh_mirrors/vl/VLM2Vec
点击查看免费下载

VLM2Vec 是一个开源的多模态检索工具包(ICLR 2025 论文项目),它把现成的视觉-语言模型(VLM)改造成统一的多模态嵌入模型,让你可以用同一个模型完成图像搜索、文本搜索、图文匹配、视觉问答等任务。本文带你从零跑通第一次图像/文本相似度搜索,并了解模型训练与评估的完整流程。

一、VLM2Vec 是什么?为什么适合做多模态检索?

传统的 CLIP 类模型往往只能做"图搜图"或"文搜文",而实际业务中,检索的输入输出可能是任意模态组合:

  • 用一段文字描述找图片
  • 用一张图片找相似的描述
  • 用"图片 + 问题"找正确的答案

VLM2Vec 的核心思路是:取 VLM 序列最后一个 token 的隐状态,作为整段多模态输入的统一向量表示。这样一来,无论输入是纯文本、纯图片还是图文混合,都能编码到同一个向量空间里,通过计算余弦相似度即可完成检索。

上图展示了 VLM2Vec 支持的四大任务族(分类、VQA、视觉定位、检索):每个任务只需给出一句不同的指令(Instruction),同一模型即可输出对应任务的嵌入向量,并在 MMEB 基准上统一评估。

二、原理速览:如何把 VLM 变成嵌入模型

VLM2Vec 采用双编码器 + 对比学习的经典结构:

  1. 查询侧(Query):把图片、指令等输入送入 VLM,取 LAST token 得到查询向量;
  2. 目标侧(Target):把正样本(如正确描述、正确图片)用同样方式编码为目标向量;
  3. 对比损失(Contrastive Loss):拉近正样本对、推开负样本对,使向量空间中"语义相近 = 距离相近"。

该框架对骨干模型没有特殊要求,仓库已内置 Phi-3.5V、LLaVA-Next、Qwen 等主流开源 VLM 的适配代码(见 src/vlm_backbone/),因此你可以选择任意熟悉的 VLM 作为检索底座。

三、快速上手:跑通第一次图文相似度搜索 🚀

仓库提供了开箱即用的演示脚本 scripts/llava_next/demo.py,它加载 LLaVA-Next 版本的 VLM2Vec,完成"图片 + 文本查询 → 与候选文本算相似度"的完整流程:

# 图片 + 文本作为查询 qry_output = model(qry=inputs)["qry_reps"] # 纯文本作为检索目标 tgt_output = model(tgt=inputs)["tgt_reps"] model.compute_similarity(qry_output, tgt_output)

演示中使用了一张小狗和小猫互动的示例图片 figures/example.jpg:

运行结果示例:

检索文本相似度
A cat and a dog(一只猫和一只狗)0.44
A cat and a tiger(一只猫和一只老虎)0.36

可以看到,与图片内容更匹配的文本得分更高——这就是构建图像/文本搜索引擎的最小闭环。相似度计算逻辑位于 src/model.py 的compute_similarity方法。

💡 提示:构建真实检索应用时,只需把目标库中所有候选(图片/文本)预先编码并向量化存储(如存入向量数据库),查询时编码一次并取 Top-K 即可。

四、训练你自己的多模态嵌入模型

如果你想在自己的数据上训练或微调,train.py 提供了完整的训练入口,几个关键参数:

参数作用建议
--model_nameVLM 骨干模型如microsoft/Phi-3.5-vision-instruct
--lora --lora_r 16启用 LoRA 低秩微调显存有限时首选,可省大量显存
--grad_cache True启用 GradCache 优化对比学习显存过大的救星
--gc_q_chunk_size/--gc_p_chunk_sizeGradCache 分块大小显存越小设越小
--temperature 0.02对比损失温度默认值即可
--pooling last取最后一个 token 作为向量与官方模型保持一致

多卡训练示例(完整参数见 README.md 的 Training 章节):

torchrun --nproc_per_node=2 train.py \ --model_name microsoft/Phi-3.5-vision-instruct \ --model_backbone phi3_v \ --dataset_name TIGER-Lab/MMEB-train \ --grad_cache True --lora --lora_r 16

其中 GradCache(梯度缓存)的完整实现放在 grad_cache/ 目录下,其命令行用法说明见 grad_cache/minigc_cmd.md。训练数据采用官方 MMEB-train 数据集(20 个子任务,涵盖分类、VQA、检索、定位等多种指令风格),指令多样性显著提升模型对未见任务的泛化能力。

五、评估:用 MMEB 基准检验检索效果

VLM2Vec 配套提出了MMEB(Massive Multimodal Embedding Benchmark)基准,包含 20 个域内(IND)+ 16 个域外(OOD)任务,覆盖分类、VQA、检索、视觉定位四大元任务。

评估入口是 eval.py,流程分三步:

  1. 编码查询集(query)得到qry_reps向量;
  2. 编码目标集(target)得到tgt_reps向量;
  3. 计算相似度并输出各任务的检索/分类得分(打分逻辑在 evaluation/eval_utils.py)。
python eval.py --model_name TIGER-Lab/VLM2Vec-Full \ --model_backbone phi3_v \ --dataset_name TIGER-Lab/MMEB-eval \ --subset_name N24News HatefulMemes CIRR \ --normalize True --image_dir eval_images/

从官方结果看,基于 LLaVA-Next 的 LoRA 微调版本整体得分62.9,比最强无微调基线高+18.2,比最强微调基线高+15.7——在多模态检索任务上优势明显。

六、实践建议清单 ✅

  • 显存紧张:优先--lora+--grad_cache True,并调小--gc_q_chunk_size;
  • 图像输入:通过--num_crops控制图像裁剪数量,越多越精细但越耗时(演示脚本用 4 个 crop);
  • 向量归一化:检索场景建议开启--normalize True,配合余弦相似度使用;
  • 指令工程:给查询配上与目标任务匹配的 Instruction 文本,检索效果会更稳定;
  • 选择底座:追求最高性能选 LLaVA-Next 版本,追求轻量可试 Phi-3.5V 版本。

现在,你已经掌握了用 VLM2Vec 从嵌入向量构建图像/文本搜索应用的全链路:跑通 demo → 按需训练微调 → 用 MMEB 评估效果。动手试试吧!

  • 人工智能
  • 多模态
  • Embedding
  • 微调
  • 计算机视觉
  • 深度学习
  • 机器学习
  • 模型评测

【免费下载链接】VLM2Vec

This repo contains the code for "VLM2Vec / MMEB" [ICLR 2025], "VLM2Vec-V2 / MMEB-V2" [TMLR 2026], and "MMEB-V3" [COLM 2026]

项目地址:https://gitcode.com/gh_mirrors/vl/VLM2Vec
点击查看免费下载
上一篇:Better Enums扩展功能揭秘:位集操作、特殊值处理等高级特性
下一篇:开放科学实践指南:Genos-10B-v2开源协议与全球基因组学社区协作终极教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进