多模态 Embeddings 技术实践:不需要 OCR 和图片描述,也能让 AI 搜索图片与视频
摘要: 传统 Embeddings 模型将文本转换为向量,实现语义搜索。但如果知识库中不只有文字,还有图片、截图甚至视频,该怎么办?多模态 Embeddings 模型通过将不同类型的数据映射到统一的语义向量空间,让我们可以直接用自然语言搜索图片、视频,也可以用图片寻找相似内容。本文介绍多模态 Embeddings 的核心原理,并以开源 Qwen3-VL-Embedding 为例,通过图片语义检索和视频片段搜索两个 Python 案例,展示如何构建跨模态检索系统。
一、为什么需要多模态 Embeddings?
先来看一个场景。
假设公司有一个存放了几十万张照片的素材库,现在我们想找:
一张白色运动鞋放在木桌上的照片。
传统方案通常有两种。
第一种是给图片人工打标签,比如“鞋子”“白色”“木桌”,然后通过关键词搜索。
第二种是使用视觉大模型,为所有图片生成文字描述,再使用文本 Embeddings 做语义检索。
第二种方案当然可以实现,但有个问题:
我们明明有原始图片,为什么一定要先把它转换成文字?
如果视觉模型在描述时漏掉了“白色”或“木桌”,后续文本检索也就丢失了这些信息。
多模态 Embeddings 提供了另一条路线:直接对图片编码,让图片和文字能够在同一个向量空间中比较。
1.1 核心原理:跨模态语义对齐
传统文本 Embeddings:
文本 A ──> Embeddings ──> 向量 A
文本 B ──> Embeddings ──> 向量 B
│
▼
相似度计算
多模态 Embeddings:
文字 ──> 文本编码 ──┐
│
图片 ──> 视觉编码 ──┼──> 统一语义向量空间
│ │
视频 ──> 视频编码 ──┘ ▼
跨模态相似度计算
模型训练的目标之一,就是让语义匹配的文字和图片,在向量空间中具有更高的相似度。
例如:
文本:"一只猫趴在沙发上"
图片A:猫趴在沙发上
图片B:狗在草地上奔跑
理想情况下:
[
sim(Text,Image_A)>sim(Text,Image_B)
]
这里的 sim 通常可以使用余弦相似度。
实际上,CLIP 等经典模型就采用了对比学习思路:通过大量图文配对数据,让匹配的图文向量更加接近,不匹配的图文向量相对远离。
不过,“共享向量空间”并不意味着模型真正理解了图片中的一切。它仍然可能忽略细小物体、数字、空间关系或复杂动作。
二、主流多模态 Embeddings 模型有哪些?
目前比较值得研究的模型包括:
| 模型 | 支持的主要模态 | 特点 |
|---|---|---|
| CLIP | 文本、图片 | 经典图文对齐模型,生态成熟 |
| jina-clip-v2 | 多语言文本、图片 | 支持中文,最大 1024 维输出 |
| Qwen3-VL-Embedding-2B | 文本、图片、视频 | 支持中文、视觉文档及混合模态 |
| Qwen3-VL-Embedding-8B | 文本、图片、视频 | 更大模型容量,最高 4096 维 |
| ImageBind | 文本、图像、音频等六类模态 | 研究跨模态对齐,非商业研究许可 |
需要注意:并非所有多模态 Embeddings 模型都能处理音频。
例如 Qwen3-VL-Embedding 支持文本、图片、截图和视频,但并不直接支持音频输入。如果希望根据声音检索相关内容,可以研究 ImageBind 等模型,或先用 ASR 将语音转为文本。
本文选择 Qwen3-VL-Embedding-2B,因为它同时支持中文查询、图片和视频,可以使用同一套模型完成两个实践案例。
该模型于 2026 年 1 月发布,主要参数如下:
| 指标 | Qwen3-VL-Embedding-2B |
|---|---|
| 参数量 | 2B |
| 最大向量维度 | 2048 |
| 可配置维度 | 64~2048 |
| 最大上下文长度 | 32K Token |
| 支持语言 | 33 种,包括中文 |
| 主要用途 | 跨模态检索、语义匹配、聚类 |
相关项目:
- Qwen3-VL-Embedding GitHub
- Qwen3-VL-Embedding-2B Hugging Face
- jina-clip-v2 Hugging Face
- ImageBind GitHub
三、实践案例一:使用自然语言搜索图片
3.1 业务场景
假设我们正在开发一个电商素材管理系统,文件夹中有三张图片:
images/
├── shoes.jpg # 白色运动鞋
├── coffee.jpg # 咖啡杯
└── backpack.jpg # 黑色背包
现在用户搜索:
白色运动鞋放在木桌上的商品展示图片。
我们希望系统直接对这些图片进行语义排序。
整个流程是:
商品图片
│
▼
多模态 Embeddings
│
▼
图片向量(离线计算)
│
│ 用户输入搜索文本
│ │
│ ▼
│ 多模态 Embeddings
│ │
│ ▼
└──────── 向量相似度计算
│
▼
返回 Top-K 图片
3.2 环境准备
使用 Python 3.11 或更高版本,推荐配置 NVIDIA GPU。
按照官方项目进行安装:
git clone https://github.com/QwenLM/Qwen3-VL-Embedding.git
cd Qwen3-VL-Embedding
pip install -e .
这里会安装项目声明的 Python 依赖。PyTorch、CUDA 和显存环境仍需满足模型运行要求,建议在独立虚拟环境中操作。
首次运行会从 Hugging Face 下载模型权重。
3.3 Python 实现
在项目根目录中准备 images 文件夹,然后编写:
from pathlib import Path
from src.models.qwen3_vl_embedding import Qwen3VLEmbedder
# 1. 加载模型
model = Qwen3VLEmbedder(
model_name_or_path="Qwen/Qwen3-VL-Embedding-2B"
)
# 2. 用户查询
query = "白色运动鞋放在木桌上的商品展示图片"
# 3. 图片列表
images = [
"images/shoes.jpg",
"images/coffee.jpg",
"images/backpack.jpg"
]
# 4. 生成查询向量
query_vector = model.process([
{
"text": query,
"instruction": (
"Retrieve images matching the text query."
)
}
])[0]
# 5. 图片向量与相似度
results = []
for path in images:
image_vector = model.process([
{"image": str(Path(path).resolve())}
])[0]
# 默认已经经过L2归一化
similarity = (
query_vector @ image_vector
).float().item()
results.append((path, similarity))
# 6. 排序
results.sort(
key=lambda x: x[1],
reverse=True
)
for path, score in results:
print(f"{path}: {score:.4f}")
模型会为每张图片生成一个 2048 维向量,然后计算图片与查询文字之间的余弦相似度。
对于这组素材,我们希望 shoes.jpg 排名最高,但具体分数取决于真实图片与模型推理结果。
值得注意的是,图片向量可以提前计算并保存。正式部署时,没有必要让用户每搜索一次就重新处理全部图片。
这和文本向量检索的架构几乎一样,区别只是向量的数据来源从文本变成了图片。
四、实践案例二:根据文字描述搜索视频片段
4.1 业务场景
第二个案例更有意思。
假设一家企业积累了大量培训视频,员工想找到:
讲师站在屏幕前讲解数据统计图表的片段。
传统视频搜索一般依赖标题、字幕和人工标签。
如果没有字幕,或者某段动作根本没有被语言描述,就很难检索。
Qwen3-VL-Embedding 支持直接处理视频,它会从视频中采样画面,并生成相应的语义向量。
假设我们准备了三个短视频:
videos/
├── chart.mp4 # 讲师讲解统计图表
├── meeting.mp4 # 员工围桌开会
└── coding.mp4 # 开发人员编写程序
我们的目标是根据自然语言找到最匹配的视频片段。
4.2 Python 实现
沿用前面的 model 对象:
from pathlib import Path
# 用户查询
query = "讲师站在投影屏幕前讲解统计图表"
# 待检索的视频片段
videos = [
"videos/chart.mp4",
"videos/meeting.mp4",
"videos/coding.mp4"
]
# 生成文本查询向量
query_vector = model.process([
{
"text": query,
"instruction": (
"Retrieve videos matching the text query."
)
}
])[0]
results = []
for path in videos:
# 视频输入:每秒采样1帧,最多16帧
video_vector = model.process([
{
"video": str(Path(path).resolve()),
"fps": 1.0,
"max_frames": 16
}
])[0]
similarity = (
query_vector @ video_vector
).float().item()
results.append((path, similarity))
# 按语义相似度排序
results.sort(
key=lambda x: x[1],
reverse=True
)
for path, score in results:
print(f"{path}: {score:.4f}")
这段代码与图片搜索相比,最大的变化只有输入对象:
# 图片
{"image": "图片路径"}
# 视频
{
"video": "视频路径",
"fps": 1.0,
"max_frames": 16
}
模型内部会负责视频画面的处理,将采样得到的视觉信息编码成一个向量。
我们希望讲解统计图表的视频能够排在前面。
需要强调:视频 Embeddings 并不等于模型理解了视频的每一秒。
如果一个视频长达一个小时,而我们只采样少量画面,很容易遗漏关键动作。
实际系统可以提前把视频拆成 10~30 秒左右的片段,再为每个片段生成向量。这个分段长度只是工程起点,应根据场景与动作持续时间调整。
另外,Qwen3-VL-Embedding 当前的视频输入主要处理视觉内容,并不会同时理解视频音轨。如果想根据讲师讲了什么来检索视频,可以增加 ASR 字幕检索通道。
五、工程实践:多模态 Embeddings 有哪些坑?
5.1 相似度高,不代表一定匹配
假设:
查询:红色汽车停在路边
图片A:红色汽车停在路边
图片B:蓝色汽车停在路边
两个图片在“汽车”“停在路边”等语义上高度接近,模型有可能给出相近的分数。
因此,向量检索的 Top-1 不一定就是正确答案。
对于颜色、数量、文字、空间位置要求严格的场景,可以增加多模态 Reranker 或视觉语言模型进行复核。
而且,余弦相似度不是正确概率,不能把 0.85 解释成有 85% 的匹配正确率。
5.2 图片、视频的推理成本明显高于纯文本
纯文本 Embeddings 只处理 Token。
图像和视频模型还需要进行视觉编码,输入分辨率、视频帧数都会影响推理成本。
因此,生产环境应该:
- 离线生成图片和视频向量。
- 对视频合理分段和采样。
- 使用批量推理与向量索引。
- 根据业务需求评估是否可以降低向量维度。
例如,2048 维的 Float32 向量,一个约占 8 KiB。
100 万个向量,仅原始向量数据就需要约 7.6 GiB 存储空间,还没有算上索引、元数据及其他开销。
5.3 多模态模型不一定适合纯文本检索
这点比较容易被忽略。
如果你的业务数据全部是纯文本,那么专门的文本 Embeddings 模型可能更合适。
因为多模态模型需要兼顾图像、视频与文本之间的语义对齐,不一定在所有纯文本检索任务上都优于同规模文本模型。
模型支持的模态更多,不代表每一种模态都更强。
5.4 如何评估模型效果?
不同业务需要不同的指标:
| 指标 | 作用 |
|---|---|
| Recall@K | 正确图片或视频是否被召回 |
| MRR@K | 正确结果排得是否靠前 |
| NDCG@K | 评价相关结果的排序质量 |
| P95 Latency | 95% 查询请求的耗时 |
| 视频片段命中率 | 是否找到了正确时间段 |
对于视频检索,还应分别评估内容召回和时间定位:找到了包含目标事件的视频,不代表已经找到了事件发生的准确时间。
六、总结:多模态 Embeddings 在 AI 系统中的位置
通过两个案例可以看出,多模态 Embeddings 最重要的能力并不是“能识别图片”,而是让不同模态的数据具有可比较的语义表示。
它使我们可以完成:
- 文字搜索图片。
- 图片搜索相似图片。
- 文字搜索视频片段。
- 图片与文本混合检索。
- 对图片、文本和视频内容进行语义聚类。
结合之前介绍的 OCR、ASR 和 Reranker,我们可以进一步构建:
用户输入
(文本/图片)
│
▼
多模态 Embeddings
│
▼
向量相似度检索
│
▼
图片 / 视频召回
│
▼
多模态 Reranker
│
▼
精细排序
│
▼
视觉语言模型 / LLM
│
▼
生成最终答案
不过,OCR、ASR 依然有自己的价值。
例如,搜索一张合同截图中的精确金额,OCR 加关键词检索可能比直接使用多模态向量更可靠;搜索一段视频中的具体发言,ASR 加文本检索可能更加准确。
所以实际应用中,多模态 Embeddings 更适合提供语义召回能力,而不是取代所有其他模态处理技术。
最后,用一句话概括它与纯文本 Embeddings 的区别:
纯文本 Embeddings 让不同的文字可以通过语义关联起来;多模态 Embeddings 则进一步让文字、图片、视频之间建立起语义联系。
过去我们想搜索图片,需要先给图片写描述。现在,可以直接让模型去寻找视觉上符合要求的内容。
这看起来只是检索方式发生了变化,但对图片素材库、视频知识库和多模态 RAG 来说,意义相当大。
- 点赞
- 收藏
- 关注作者
评论(0)