腾讯WeMM-Embedding:重新定义多模态检索的通用嵌入模型
> WeMM-Embedding 是腾讯微信视觉团队推出的通用多模态嵌入模型家族,支持图文统一表征与跨模态检索。
## 一、项目背景与痛点
在大模型与多模态应用爆发式增长的今天,文本、图像、视频、音频等异构数据之间的语义对齐成为检索、推荐、问答等场景的核心瓶颈。传统做法通常依赖两套独立的编码器(如CLIP),将文本和图像映射到同一向量空间,但存在以下明显痛点:
1. **模态覆盖不全**:多数模型仅支持图文对,对视频、音频、长文档等多模态输入支持薄弱。
2. **细粒度语义丢失**:CLIP类模型擅长粗粒度匹配(图-文整体),但在细粒度物体、属性、关系、OCR文本等局部语义上表现不佳。
3. **检索精度不足**:在复杂查询(如“穿红色裙子的女孩在跑步”或“包含‘2024年报’字样的PPT截图”)中,现有嵌入模型易产生误匹配。
4. **部署与微调成本高**:很多多模态模型参数量巨大,难以在业务侧快速落地。
WeMM-Embedding 正是针对上述问题,由腾讯微信视觉团队(WeChat Vision Team)开源的一套**通用多模态嵌入模型家族**,旨在提供高精度、多模态、可扩展的语义表征能力。
## 二、项目核心特性与技术亮点
### 1. 真正的“多模态”而非“双模态”
WeMM-Embedding 不仅支持文本-图像,还支持**视频帧、OCR文本、物体框、属性标签、关系三元组**等多种输入形式。其训练数据覆盖了:
- 图文对(Web图像-描述)
- 视觉问答(VQA)样本
- 检测/分割任务中的区域-文本对
- 视频-字幕对
这使得模型能够理解“图中有猫,猫旁边有沙发,沙发是蓝色的”这种细粒度空间关系,而非仅仅“图中有猫”。
### 2. 统一向量空间,支持跨模态检索
所有模态(图像、文本、区域、视频帧)被映射到同一个高维向量空间。这意味着你可以:
- 用文本检索图像(文搜图)
- 用图像检索文本(图搜文)
- 用区域图像检索对应描述(区域-文本匹配)
- 用视频帧检索相关文本片段
### 3. 基于LLM的视觉编码器改进
WeMM-Embedding 采用**视觉编码器 + 大语言模型(LLM)投影层**的结构。与CLIP的简单线性投影不同,它利用LLM的强语义理解能力对视觉特征进行“再解释”,从而提升对复杂查询的鲁棒性。具体来说,视觉token经过视觉编码器后,与文本token一起送入LLM,LLM的输出经过池化得到最终嵌入向量。
### 4. 多尺寸模型家族,按需选择
项目提供多个规格的模型(如base、large等),用户可根据计算资源与精度需求灵活选择。小模型适合移动端/边缘部署,大模型适合高精度离线索引。
### 5. 训练策略:对比学习 + 难负样本挖掘
训练过程中采用**InfoNCE对比损失**,并特别设计了难负样本(hard negatives)挖掘策略——例如将同一图像的不同描述作为负样本,或使用OCR文本作为干扰项,迫使模型学习更细致的判别特征。
## 三、安装与快速上手
### 环境要求
- Python 3.8+
- PyTorch 1.13+(推荐2.0+)
- CUDA 11.7+(GPU训练/推理)
### 安装
bash
# 克隆仓库
git clone https://github.com/Tencent/WeMM-Embedding.git
cd WeMM-Embedding
# 创建虚拟环境(建议)
python -m venv wemm_env
source wemm_env/bin/activate
# 安装依赖
pip install -r requirements.txt
### 模型加载与推理示例
python
import torch
from PIL import Image
from wemm import WeMMModel, load_transform
# 加载模型(自动下载权重)
model = WeMMModel.from_pretrained("Tencent/wemm-embedding-base")
model.eval()
# 加载预处理
transform = load_transform(model.config)
# 准备数据
image = Image.open("example.jpg").convert("RGB")
texts = ["一只橘猫坐在蓝色沙发上", "一个男孩在踢足球", "2024年财务报告图表"]
# 编码图像和文本
with torch.no_grad():
image_emb = model.encode_image(image, transform)
text_embs = model.encode_text(texts)
# 计算相似度
similarities = torch.matmul(text_embs, image_emb.T)
print("最匹配的文本:", texts[similarities.argmax()])
### 批量检索与索引构建
python
# 构建文本索引
all_texts = [...] # 你的文本库
with torch.no_grad():
all_text_embs = model.encode_text(all_texts, batch_size=64)
# 查询图像
query_image = Image.open("query.jpg")
with torch.no_grad():
query_emb = model.encode_image(query_image)
# 使用faiss或numpy进行相似度检索
import numpy as np
scores = np.dot(all_text_embs.numpy(), query_emb.numpy())
topk = np.argsort(scores)[::-1][:10]
### 微调自定义数据
python
# 训练脚本示例(简化版)
from wemm import WeMMModel, WeMMTrainer
model = WeMMModel.from_pretrained("Tencent/wemm-embedding-base")
trainer = WeMMTrainer(model, train_dataset, batch_size=32, lr=1e-5)
trainer.train(epochs=3)
## 四、适用场景详解
### 1. 电商搜索与推荐
- **场景**:用户输入“白色运动鞋,带红色条纹”
- **传统模型**:可能匹配到“白鞋”或“红条纹T恤”
- **WeMM**:能准确理解颜色+物体+位置关系,返回精准结果
### 2. 视频内容理解与检索
- 提取视频关键帧,使用WeMM编码帧与字幕,实现“用文字搜索视频片段”
- 支持“一个男人在厨房煎蛋”这种动作+场景的查询
### 3. 多模态RAG(检索增强生成)
- 在RAG系统中,将文档中的图像、表格、文字段落统一编码,实现多模态知识库检索
- 大模型生成回答时,可引用相关图像证据
### 4. 图像-文本跨模态相似度计算
- 用于图片去重、版权检测、内容审核(判断图像是否包含违规文本)
### 5. 视觉问答与对话系统
- 在客服机器人中,用户发送截图,机器人理解截图内容并回答问题
## 五、与其他同类项目对比
| 模型 | 模态支持 | 细粒度语义 | 参数量 | 开源程度 | 特色 |
|------|---------|-----------|--------|----------|------|
| **CLIP (OpenAI)** | 图文 | 弱 | 400M | 权重开源 | 经典双塔,粗粒度匹配 |
| **SigLIP (Google)** | 图文 | 中 | 400M-2B | 权重开源 | 改进损失函数,更稳定 |
| **BLIP-2 (Salesforce)** | 图文 | 中 | 1.2B+ | 权重开源 | 引入Q-Former,多任务 |
| **ImageBind (Meta)** | 6种模态 | 中 | 1.3B | 权重开源 | 模态对齐,但非检索优化 |
| **Jina CLIP v2** | 图文+OCR | 较强 | 约500M | 权重开源 | 支持多语言,但区域级弱 |
| **WeMM-Embedding** | 图文+区域+视频帧 | **强** | 300M-1B | 权重+代码全开源 | 区域级细粒度,LLM增强 |
### 对比分析
- **vs CLIP**:WeMM在细粒度(如“红车旁边的白狗”)上显著优于CLIP,CLIP容易将“红车”和“白狗”分别匹配到单独图像。
- **vs BLIP-2**:BLIP-2更侧重于生成任务,其嵌入表征并非专门为检索优化;WeMM的训练目标就是检索(对比损失)。
- **vs ImageBind**:ImageBind支持模态多,但每种模态的编码器相对独立,跨模态对齐精度不如WeMM在图文细粒度上的表现。
- **vs Jina CLIP v2**:Jina支持OCR文本,但WeMM进一步支持区域级(bounding box)输入,这是Jina不具备的。
## 六、技术深度解析
### 模型架构细节
图像输入 → ViT编码器 → 视觉token序列
文本输入 → 文本嵌入层 → 文本token序列
两者拼接 → 送入LLM(如Qwen-1.5B或LLaMA-2)→ 输出联合表示
对LLM输出做池化(mean/CLS)→ 得到最终嵌入向量
关键设计:**视觉token不直接池化,而是先经过LLM的交叉注意力层**。这样LLM可以“理解”图像中的上下文关系,再生成语义向量。
### 训练数据规模与配方
根据官方技术报告,训练数据约**1亿条多模态样本**,包括:
- 公开数据集(CC3M, CC12M, LAION-400M的子集)
- 微信业务侧的脱敏图文数据(去除隐私信息)
- 自动生成的区域-文本对(使用检测模型+OCR)
训练分两阶段:
1. 预训练:大规模图文对比学习
2. 微调:难负样本+区域级任务(如指代理解)
### 性能评测
在MSCOCO、Flickr30K、Zero-shot分类等基准上,WeMM-Embedding-base在**图像-文本检索**的R@1指标上,比CLIP ViT-L/14高出约**8-12个百分点**(具体数值见官方README)。在**区域-文本检索**任务(如RefCOCO)上,优势更为明显。
## 七、局限与未来展望
### 已知局限
1. **语言支持**:目前主要支持中英文,其他语言需额外微调。
2. **视频处理**:虽然支持视频帧,但未提供端到端的视频时序建模(如时间注意力)。
3. **音频模态**:暂不支持音频输入(与ImageBind相比)。
4. **推理速度**:由于使用LLM作为融合器,推理延迟高于纯双塔模型(大约慢2-3倍)。
### 改进方向
- 引入时序建模,支持真正的视频嵌入
- 支持音频、3D点云等更多模态
- 蒸馏小模型,降低推理成本
- 开放更多语言版本
## 八、总结与推荐
**WeMM-Embedding 是目前开源社区中少有的、在细粒度多模态检索上做到“工程可用”级别的模型**。它解决了CLIP系模型“看得见但看不清”的痛点,特别适合需要理解图像中物体关系、属性、OCR文字的业务场景。
如果你正在做以下事情,强烈建议尝试:
- 电商图片搜索(带属性/颜色/位置描述)
- 多模态知识库RAG(图文混合文档)
- 视频内容检索(基于帧+字幕)
- 视觉问答系统(需要精确理解截图)
项目代码质量高,文档清晰,且由腾讯微信视觉团队持续维护,值得信赖。
> 项目地址:https://github.com/Tencent/WeMM-Embedding