LLM多模态嵌入 - 图片嵌入
摘要: 多模态嵌入技术(如CLIP模型)将文本、图像等不同模态数据映射到统一向量空间,实现跨模态语义关联。本文以OpenAI的CLIP模型为例,演示了其图像-文本嵌入能力:通过处理猫、狗、儿童等图片及对应文本描述,模型输出的相似度矩阵准确匹配图文内容(如猫图与"a photo of a cat"相似度达97%)。实验进一步验证CLIP对歧义图像(如鸭嘴兔、半人马)的强判别力。多
前言
多模态嵌入(Multimodal Embedding)是指将来自不同模态(如文本、图像、音频、视频等)的数据映射到一个统一的向量空间的技术。 其核心概念在于,通过这种映射,不同模态的数据可以在同一个语义空间中进行比较、关联和融合,从而实现对多模态信息的联合理解和处理。例如,可以将一张猫的图片和一段描述“一只可爱的小猫”的文本映射到向量空间中相近的位置,即使它们的数据类型完全不同。这种技术的目标是让机器能够像人类一样,综合运用多种感官信息来理解世界。
图片的嵌入
我们先来了解一下最常用的 Clip 模型。
Clip
openai/CLIP 是 OpenAI 开源的一个跨模态模型代码库,全名是 Contrastive Language–Image Pre-training。它的主要功能是将图像和文本映射到同一个特征空间,从而实现图文之间的相似度计算。
CLIP 通过大规模训练,让模型可以:
- 将一张图片和一段描述该图片的文字编码成向量表示。
- 在这个向量空间中,相似的图像和文本会靠得很近。
- 支持图文检索、零样本图像分类、文本引导的图像搜索与排序等任务。
模型名称
这里再说一下 Clip 模型名称的释义,OpenAI 在 GitHub 和 HuggingFace 都提供了使用模型的示例,但是两边提供的模型名称却又有差异,在 GitHub 上是 ViT-B/32 而在 HuggingFace 是 openai/clip-vit-base-patch16 之类的,其实二者是相似的。
| 名称 | 说明 |
|---|---|
ViT |
Vision Transformer 模型架构 |
B |
Base 规模(通常表示 12 层 Transformer) |
/32 或 -32 |
图像 patch size = 32,即图像被切成 32×32 的小块处理 |
openai/clip-vit-base-patch16 是 HuggingFace 上的模型名称,对应的含义如下:
| 名称部分 | 含义 |
|---|---|
openai/clip |
表示来源是 OpenAI 的 CLIP 模型 |
vit-base |
表示使用 Vision Transformer Base 架构 |
patch16 |
表示图像被切成 16×16 的小 patch(分辨率更高,模型也更大) |
总的来说如下
| 模型名称 | 来源 | patch size | 等价写法 | 是否等价模型 |
|---|---|---|---|---|
ViT-B/32 |
OpenAI 官方论文 | 32×32 | ViT-B-32 |
✅ 同结构 |
ViT-B-32 |
open_clip / HuggingFace | 32×32 | ViT-B/32 |
✅ 同结构 |
clip-vit-base-patch16 |
HuggingFace | 16×16 | ViT-B/16 |
❌ 不同结构(更精细) |
因此,使用 clip 时,如果更在意速度和模型大小,那么可以使用 patch size= 32 的模型,如果更在意精度就需要选择 patch size = 16 的模型
在 HuggingFace 是 OpenAI 提供了以下四种 clip 模型,large 系列的模型参数更大,自然也是更加的精确。

下面我们选择 HuggingFace 上 clip-vit-base-patch16 进行后续示例的学习,实际生产环境可以选择更大更强或者其他的模型。
image-text 相似度
import time
import numpy as np
import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
model_name = "openai/clip-vit-base-patch16"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)
image = Image.open("cat.jpg")
start = time.time()
def get_image_features():
with torch.no_grad():
# 你也可以在这里对图片进行一些特殊处理,裁切、缩放、超分、重新取样等等
inputs = processor(images=image, return_tensors="pt", padding=True, use_fast=True)
# 使用模型处理图片的 Tensor 数据,获取图片特征向量
image_features = model.get_image_features(inputs.pixel_values)[0]
print(image_features.shape)
# 计算整个处理过程的时间
end = time.time()
print('%s Seconds' % (end - start))
torch.Size([512])
0.21516799926757812 Seconds
可以看到通过 clip 进行嵌入处理后,返回结果是一个 512 大小的向量。
clip 同时支持文本和图片的嵌入,因此我们可以将二者同时嵌入之后,看看物理世界中相似的文本和图片是否有着相似的嵌入。

我们使用以上三张小猫、小狗和小孩的图片,同时定义他们的文字描述,然后对图片和文本同时进行嵌入操作,之后进行相似度的计算。
images = [Image.open("cat.jpg"), Image.open("dog.jpeg"), Image.open("child.jpeg")]
labels = ["a photo of a cat", "a photo of a dog", "a photo of a child"]
def image_text_similarity():
with torch.no_grad():
inputs = processor(text=labels, images=images, return_tensors="pt",
padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the label probabilities
result = np.around(probs.cpu().detach().numpy(), 2)
print('logits_per_image:', result)
相似度结果矩阵
[[0.97 0. 0.03]
[0. 0.99 0.01]
[0. 0. 1. ]]
相似度矩阵的解读方法
- 每行对应一个图像
- 每列对应一个文本标签
- 数值表示图像与文本匹配的概率
从结果来看,可以说 clip 的表现非常出色,对于猫、狗、小孩的嵌入结果和文字描述的嵌入结果几乎完全一致。
下面我们增加一些难度,用一些有些歧义的图片,尝试让 clip 去解读

相似度矩阵如下
[[1. 0. 0. 0. ]
[0. 0.97 0.02 0.01]
[0. 0. 1. 0. ]
[0. 0.02 0.01 0.97]]
从结果来看 clip 认为第一张长着鸭子嘴巴的兔子 100% 就是兔子,第二张图片有 97% 的概率是一匹马,第三张半人马战士的图片效果为 100% (可能训练用的数据集中包含这张著名的图片了),最后一张有女人和马的概率有 97%,其余数值基本也符合预期。
下面我们故意修改图片的描述,使其和图片内容有差异。
labels2 = ["a photo of a duck", "a photo of a cat", "a photo of a woman", "a photo of a horse"]
在这个描述里,我们认为第一张图片是鸭子,第二张图片是猫,第三张图片是一个女人,第四张图片中只有马,再次看看嵌入后返回的相似度矩阵。
[[0.93 0.05 0.02 0.01]
[0. 0. 0. 1. ]
[0. 0. 0.71 0.28]
[0. 0. 0.38 0.62]]
- clip 分析对于第一张图片为鸭子的概率虽然有 93%,但其实低于之前兔子 100% 的概率
- 第二行只有第四列是 100%,其余为 0 ,这张只有马的图片,精确的符合第四列的文本描述
- 第三行,半人马战士的图片没有被识别为鸭子或者猫,被识别为 woman 的概率是 71%,马的概率是 28%
- 第四行,女人和马同时存在的照片同样没有被识别为鸭子或者是猫,被识别为 woman 和 horse 的概率似乎也和整张图片中 woman 和 horse 的占比相当。
再次证明,clip 很强(要知道这里使用的还不是 large 系列的模型)
运用场景
可以看到,支持文本和图像的多模态嵌入非常有用,基于此我们可以做很多事情。
-
图文检索 给定一张图片,找到描述这张图片的文字(或反过来)。 用于搜索引擎、相册搜索等。
-
零样本分类 不需要重新训练,只需给出类别的自然语言描述,就可以对图片进行分类。
-
文本引导的图像生成(配合 DALL·E、Stable Diffusion) CLIP 可以用于打分:文本和图像是否匹配。例如在 Stable Diffusion 里常用作CLIP guidance。
-
图像聚类与搜索 用 CLIP 向量对图像进行聚类或最近邻检索,适用于图像推荐、视觉搜索系统等。
图片文本嵌入的模型
当然除了 openai/clip ,还有其他支持文本、图片嵌入的模型。
| 模型名称 | 机构/团队 | 主要特点 | 支持模态 | 开源链接/平台 |
|---|---|---|---|---|
| CLIP | OpenAI | 对比学习,图文共享嵌入空间,强大的零样本能力,ViT/ResNet 图像编码器,Transformer 文本编码器 | 图像、文本 | GitHub: openai/CLIP |
| OpenCLIP | LAION / mlfoundations | CLIP 的开源实现,更大模型(如 ViT-G/14),更广泛数据集训练 | 图像、文本 | GitHub: mlfoundations/open_clip |
| Chinese-CLIP | 阿里达摩院 / OFA-Sys | 针对中文优化,约2亿中文图文对训练,两阶段预训练策略,RoBERTa 文本编码器 | 图像、文本 | GitHub: OFA-Sys/Chinese-CLIP ; ModelScope |
| GME (General MultiModal Embedding) | 通义实验室 (阿里) | 基于 Qwen2-VL MLLM,统一多模态表征,对比学习,指令调优,支持文本、图像、图文组合等,在 UMRB 基准表现优异,富文本图片检索能力强 | 文本、图像、图文组合 | ModelScope ; Hugging Face: Alibaba-NLP/gme-Qwen2-VL-2B-Instruct, Alibaba-NLP/gme-Qwen2-VL-7B-Instruct |
| ImageBind | Meta AI | 将图像与文本、音频、深度、热成像、IMU 数据等多种模态对齐到统一嵌入空间,利用图像作为“枢纽”模态实现跨模态“涌现对齐” | 图像、文本、音频等六种 | GitHub: facebookresearch/ImageBind |
| Nomic Embed Multimodal | Nomic AI | 处理 PDF、图像、论文、图表等复杂文档,支持交错文本和图像输入,无需 OCR,ColNomic Embed Multimodal 7B 在 Vidore-v2 基准 SOTA | 文本、图像、PDF 等 | Hugging Face 等平台 |
| Jina-CLIP (jina-clip-v1/v2) | Jina AI | 针对原始 CLIP 优化,v1 提升纯文本检索和图像检索性能,v2 支持 89 种语言图像检索,更高分辨率,Matryoshka 表征 | 图像、文本 | Hugging Face: jinaai/jina-clip-v1 |
| BGE-VL | 北京智源人工智能研究院 (BAAI) | 基于 MegaPairs 合成数据集训练,提升多模态检索(组合图像检索、多模态文档检索)多任务能力 | 图像、文本 | Hugging Face: BAAI/BGE-VL-MLLM-S1 等 |
| PreFLMR | 剑桥大学 | 预训练细粒度后期交互多模态检索器,用于构建多模态 RAG,在 M2KR 数据集预训练 | 图像、文本 | Hugging Face: cambridgeltl/PreFLMR_ViT-B/L/G |
| Leopard | 圣母大学、腾讯 AI Lab、UIUC | 处理文本丰富图像,自适应高分辨率编码,像素洗牌技术压缩视觉序列,适用于多页文档理解、数据可视化、网页理解 | 图像、文本 | GitHub 等平台 |
| OFA (One-For-All) | 阿里巴巴达摩院 | 统一序列到序列框架处理多种模态和任务(图像描述、视觉定位、文本生成等),支持中文多模态任务 | 图像、文本 | GitHub: OFA-Sys/OFA |
这些模型有不同的侧重点,有不同的架构,但是他们都非常强大,实际中我们需要结合自身数据的特点,选择合适的模型进行对数据的嵌入处理。
小结
通过 clip 的简单应用,可以看到嵌入技术的运用,使得计算机可以更好的理解人类眼中的世界,建立起图片和文本之间的桥梁,使得我们可以借助这项技术完成很多之前觉得不可思议的事情。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……
不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等
这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等
😝有需要的小伙伴,可以 下方小卡片领取🆓↓↓↓
更多推荐

所有评论(0)