多模态 Embeddings 技术实践:不需要 OCR 和图片描述,也能让 AI 搜索图片与视频

举报
yd_54922183 发表于 2026/10/23 09:35:07 2026/10/23
【摘要】 多模态 Embeddings 模型通过将不同类型的数据映射到统一的语义向量空间,让我们可以直接用自然语言搜索图片、视频,也可以用图片寻找相似内容。本文介绍多模态 Embeddings 的核心原理,并以开源 Qwen3-VL-Embedding 为例,通过图片语义检索和视频片段搜索两个 Python 案例,展示如何构建跨模态检索系统。

摘要: 传统 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 种,包括中文
主要用途 跨模态检索、语义匹配、聚类

相关项目:

三、实践案例一:使用自然语言搜索图片

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 来说,意义相当大。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。