腾讯WeMM-Embedding:统一多模态嵌入模型,开启跨模态检索新范式
> WeMM-Embedding:腾讯微信视觉团队开源的通用多模态嵌入模型家族,支持图文跨模态理解与检索。
## 一、项目背景与痛点
在当前的AI应用生态中,文本嵌入模型(如OpenAI的text-embedding-3、BGE等)已经非常成熟,广泛应用于搜索、推荐、RAG(检索增强生成)等场景。然而,现实世界的数据并非单一模态——商品图片、视频帧、语音片段、文档截图等非文本信息在互联网中占据绝对主流。传统做法是先将视觉内容转成文字描述(如通过VLM生成caption),再走文本检索链路,但这带来了几个致命问题:
1. **信息丢失**:文字描述永远无法完整表达图片中的颜色、纹理、空间关系、物体属性等细节。
2. **延迟与成本**:每次索引或查询都要调用大模型生成描述,工程链路过长。
3. **模态割裂**:用户可能用一张图去搜相似图,或者用一段文字去搜特定视觉内容,传统单模态模型无法直接对齐。
4. **领域适配差**:通用CLIP模型在特定领域(如电商、医疗影像、工业质检)效果不佳,需要大量微调数据。
腾讯微信视觉团队开源的**WeMM-Embedding**正是为了解决上述痛点而设计——它是一组**通用多模态嵌入模型**,能够将图像和文本映射到同一个向量空间,直接计算跨模态相似度,支持图文双向检索、多模态RAG、零样本分类等任务。
## 二、项目快速上手
### 2.1 安装
项目基于Python,推荐使用`transformers`库直接加载(支持HuggingFace Hub)。首先安装依赖:
bash
pip install transformers torch pillow
### 2.2 基础用法:图文嵌入与相似度计算
python
from transformers import AutoModel, AutoTokenizer, AutoProcessor
import torch
from PIL import Image
import requests
# 加载模型(以WeMM-Embedding-Base为例)
model_name = "Tencent/WeMM-Embedding-Base"
model = AutoModel.from_pretrained(model_name, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_name, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 准备输入
text = "一只在草地上奔跑的金毛犬"
image_url = "https://example.com/dog.jpg"
image = Image.open(requests.get(image_url, stream=True).raw)
# 编码
text_input = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
image_input = processor(images=image, return_tensors="pt")
# 获取嵌入向量
with torch.no_grad():
text_emb = model.encode_text(**text_input)
image_emb = model.encode_image(**image_input)
# 归一化后计算余弦相似度
text_emb = torch.nn.functional.normalize(text_emb, p=2, dim=-1)
image_emb = torch.nn.functional.normalize(image_emb, p=2, dim=-1)
similarity = (text_emb @ image_emb.T).item()
print(f"图文相似度: {similarity:.4f}")
### 2.3 批量检索示例(图文互搜)
python
# 假设有一个图片库,用文本查询最匹配的图片
image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"]
images = [Image.open(p) for p in image_paths]
image_inputs = processor(images=images, return_tensors="pt")
with torch.no_grad():
image_embs = model.encode_image(**image_inputs)
image_embs = torch.nn.functional.normalize(image_embs, p=2, dim=-1)
query = "一个红色的跑车"
query_input = tokenizer(query, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
query_emb = model.encode_text(**query_input)
query_emb = torch.nn.functional.normalize(query_emb, p=2, dim=-1)
scores = (query_emb @ image_embs.T).squeeze(0)
best_idx = scores.argmax().item()
print(f"最匹配的图片: {image_paths[best_idx]}, 得分: {scores[best_idx]:.4f}")
### 2.4 模型家族与规模
WeMM-Embedding提供了多个规格,适应不同场景:
| 模型名称 | 参数量 | 嵌入维度 | 适用场景 |
|---------|--------|---------|---------|
| WeMM-Embedding-Small | ~100M | 768 | 移动端、实时检索 |
| WeMM-Embedding-Base | ~300M | 1024 | 通用服务端检索 |
| WeMM-Embedding-Large | ~600M | 1280 | 高精度离线索引 |
所有模型均支持文本-图像双向编码,并且可以通过`model.encode_text()`和`model.encode_image()`分别调用,也可以使用`model.encode()`统一处理多模态输入。
## 三、核心亮点深度解析
### 3.1 真正的统一多模态对齐
不同于CLIP只做对比学习,WeMM-Embedding在训练中融合了多种任务:
- **图文对比学习**(ITC):拉近匹配图文对,推远不匹配对。
- **图文匹配任务**(ITM):判断图文是否匹配,增强细粒度理解。
- **掩码语言建模**(MLM):在图文上下文中预测被掩码的文本,提升语义理解。
这种多任务联合训练使得模型不仅知道“图中有猫”,还理解“猫在沙发上”这种空间关系,以及“橘猫”和“黑猫”的视觉差异。
### 3.2 强领域泛化能力
微信团队在训练数据上做了大量工作,覆盖电商、社交、新闻、医疗、工业等数十个领域。官方评测显示,在零样本情况下,WeMM-Embedding在Flickr30K、MSCOCO、Fashion200K、CIRR(组合图像检索)等基准上均达到SOTA或接近SOTA水平。尤其在**跨域检索**(例如用医学文字描述检索X光片)上,明显优于同规模CLIP变体。
### 3.3 高效推理与工程友好
- **支持动态分辨率**:图像输入不需要固定尺寸,模型内部会自适应处理,避免裁剪导致的信息丢失。
- **量化友好**:官方提供了int8量化示例,在保持95%以上性能的同时,推理速度提升3倍。
- **兼容HuggingFace生态**:可以无缝接入`datasets`、`faiss`、`milvus`等向量数据库,快速搭建生产级检索系统。
### 3.4 长文本与多图理解
WeMM-Embedding支持最长512 token的文本输入,并且可以同时编码多张图片(通过拼接token序列),这在多图对比、视频帧聚合等场景非常实用。例如,可以用它做“用一组参考图检索目标图”的任务。
## 四、适用场景详解
### 4.1 多模态RAG(检索增强生成)
传统RAG只能检索文本,WeMM-Embedding将知识库扩展到图片、截图、图表。例如:
- 用户问“去年Q3的销售柱状图是什么趋势”,系统直接检索到相关图表图片,并交给多模态大模型生成回答。
- 企业文档中大量包含流程图、架构图,这些都可以作为检索对象。
### 4.2 电商搜索与推荐
- 用户上传一张衣服照片,搜索同款或相似款。
- 用户输入“蓝色碎花连衣裙”,返回视觉上匹配的商品图片,而不是仅靠标签匹配。
- 跨模态推荐:基于用户浏览过的图片,推荐文字描述相似的商品。
### 4.3 内容安全与审核
通过嵌入向量计算,可以快速找出与已知违规图片相似的变体(如盗版图、敏感图),即使图片经过裁剪、调色、加滤镜等修改,依然能有效命中。
### 4.4 智能相册与媒体管理
个人或企业相册中,支持“找一张去年冬天在北海道拍的照片”这类语义搜索,或者“找出所有包含红色气球照片”的视觉搜索。
### 4.5 工业质检与医疗辅助
- 工业场景:用正常品图片作为查询,检索出所有缺陷品图片的相似度排序。
- 医疗场景:用文字描述“肺部有磨玻璃影”,检索CT影像库中的相关病例。
## 五、与其他同类项目的对比
### 5.1 对比 OpenAI CLIP
| 维度 | WeMM-Embedding | OpenAI CLIP |
|------|---------------|-------------|
| 训练数据 | 微信生态+多领域精选数据 | WebImageText(4亿图文对) |
| 文本长度 | 最长512 token | 最长77 token |
| 多任务 | ITC+ITM+MLM | 仅ITC |
| 领域泛化 | 强,尤其中文场景 | 英文为主,中文较弱 |
| 工程支持 | 动态分辨率、量化 | 固定分辨率,量化支持差 |
**结论**:CLIP是通用特征提取的标杆,但WeMM-Embedding在中文场景、长文本、细粒度理解上明显胜出,且工程化更完善。
### 5.2 对比 Chinese-CLIP
Chinese-CLIP是CLIP的中文适配版,但本质还是单任务对比学习。WeMM-Embedding在训练策略上更丰富,且在微信实际业务中经过了大规模验证,鲁棒性更好。
### 5.3 对比 BLIP-2 / InstructBLIP
这些是生成式多模态模型,擅长生成描述或回答问题,但**不适合直接作为嵌入模型**用于大规模检索,因为它们的推理成本高、输出不是固定维度向量。WeMM-Embedding专注于嵌入表示,更适合构建索引和向量检索系统。
### 5.4 对比 SigLIP / EVA-CLIP
这些是视觉编码器的改进版,但只做视觉特征提取,不提供文本编码器。WeMM-Embedding是完整的双塔结构,开箱即用。
## 六、技术细节与训练策略(进阶)
### 6.1 模型架构
WeMM-Embedding采用双塔架构:
- **视觉塔**:基于ViT(Vision Transformer),使用动态patch embedding,支持任意分辨率输入。
- **文本塔**:基于BERT架构,但经过领域自适应预训练,对中文分词和电商术语有更好的处理。
两个塔的输出通过一个共享的投影层映射到同一向量空间。
### 6.2 训练数据
微信团队构建了约10亿规模的图文对数据集,包括:
- 微信生态内的公众号文章配图、朋友圈图片与文字描述。
- 电商平台的商品图与标题/详情。
- 公开数据集(CC3M、CC12M、LAION-5B的子集)。
- 合成数据:使用大模型生成的图文对,用于覆盖长尾场景。
### 6.3 损失函数
- 对比损失(InfoNCE):用于全局对齐。
- 硬负样本挖掘:在batch内在线挖掘难负样本,提升判别力。
- 辅助损失:ITM + MLM,增强细粒度语义。
### 6.4 评估指标
官方在多个基准上进行了评测,例如:
- **Flickr30K**:Recall@1达到78.5(文本检索图像),图像检索文本为88.2。
- **MSCOCO**:图文双向Recall@5均超过95%。
- **CIRR**(组合图像检索):在“用参考图+修改文本”场景下,Recall@1比CLIP高12个百分点。
## 七、局限性与未来展望
任何模型都有边界,WeMM-Embedding也存在一些不足:
1. **视频支持有限**:目前主要针对静态图像,视频需要抽帧处理,无法直接编码时空特征。
2. **多语言支持**:虽然中文表现优秀,但英文和其他语言的支持不如专门的国际模型(如OpenCLIP)。
3. **模型体积**:Large版本有600M参数,在边缘设备上部署仍有压力。
但微信团队表示将持续迭代,未来可能推出:
- 视频嵌入模型(WeMM-Video)。
- 轻量级移动端版本(预计<50M参数)。
- 支持语音-文本-图像三模态对齐。
## 八、总结与推荐
**WeMM-Embedding是一个成熟、实用、开箱即用的多模态嵌入模型**,尤其适合中文场景和国内业务环境。它的最大价值在于:
- 解决了图文检索的工程痛点,无需再走“图转文”的间接链路。
- 在微信生态中经过大规模业务验证,稳定性有保障。
- 支持HuggingFace生态,集成成本极低。
如果你是以下角色,强烈推荐尝试:
- **后端工程师**:需要为搜索或推荐系统增加多模态能力。
- **AI应用开发者**:正在构建多模态RAG或智能相册。
- **算法研究员**:需要一个强大的多模态嵌入baseline进行对比实验。
项目已开源,遵循MIT协议,可以免费商用。建议从Base版本开始体验,再根据业务规模选择Small或Large。
**项目链接**:https://github.com/Tencent/WeMM-Embedding