想象你是一位专门替人淘换旧物的寻宝猎人,掌管着一座堆满宝贝的巨大旧货市场。顾客找上门来,掏出一张泛黄的老照片说:“我要找照片里这种花纹的布料。”又有一位顾客放了一段五秒的舞蹈视频:“帮我找出处。”你既看图片,又看视频,还听文字描述,把各种“线索”都翻译成同一种寻宝暗号,再循着暗号去百万件货品里翻找。这就是多模态搜索——让机器看懂图像和视频,用“相似”而非“完全相等”的逻辑,从海量内容中找回你真正想要的东西。它的完整过程分几步:先把图片或视频画面写成“特征小抄”(向量),再把图像与文本统一进同一语义空间(跨模态对齐),借索引快速缩小范围(ANN 检索),最后按业务规则排序返回(商品搜索、视频检索)。这些能力正悄悄工作在电商拍照搜同款、视频版权检测、内容推荐等各类场景中。
多模态搜索是搜索引擎、电商平台、视频社区的核心能力之一。掌握它,意味着你能独立设计“以图搜图”和“视频检索”类服务,是走向多模态应用方向的必修课。
目录
可视化演示
动态演示多模态搜索的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
多模态搜索:多模态搜 多模态搜索的任务定义与核心架构 视觉特征提取与表示方法 核心机制可视化 多模态搜索整体架构与关键组件
视觉特征提取:给照片写“特征小抄”
寻宝猎人老周接到一单生意:顾客发来一件旧旗袍的照片,想在全市场找同款。老周不急着逛市场,他先掏出小本子记下三件事——颜色是“大红底”,花纹是“缠枝莲”,样式是“立领盘扣”。这张小抄,决定了他能在多大范围内锁定目标。以图搜图的第一步,就是给每张图做这样一张数字版“特征小抄”。
计算机没有“红”“花纹”这种直觉,它看到的只是密密麻麻的像素矩阵。于是研究者训练了卷积神经网络(CNN),让模型像老周一样一层层地看:先看边缘线条,再看色块纹理,最后组合出“这是一个物品”的高层语义。最终,一张图被压缩成一个固定长度的浮点数向量,比如 256 维。这个向量就是数字小抄,把颜色、纹理、形状的线索全部浓缩进了一串数字。
形式化地看,一张图 I 经过 CNN 变成特征向量 $f$,检索时再与商品库中的每个向量计算余弦相似度:
小抄写得越精准,老周找东西越省劲。CNN 训练得越充分,特征向量就越能扛住旋转、缩放、滤镜的干扰——即使顾客拍的是斜角照片,系统也能从“小抄”里认出同款。这正是以图搜图能“认脸”的根基。
- 卷积网络读图CNN 对图像做多次卷积与池化,从像素中逐层提取边缘、纹理、形状等视觉线索。
- 生成特征向量全连接层把高层语义压缩成固定长度向量 $f$,这就是图像的“数字指纹”。
- 点积比较方向两个向量的点积越大,说明它们在同一个维度上同时取值大的位置越多,方向越一致。
- 长度归一化除以各自模长,消除图片分辨率、亮度等因素带来的尺度差异。
跨模态对齐:训练一位“翻译官”
寻宝猎人不止会看图,还听得懂话。顾客常常口述:“我要红底白花的棉布。”老周能立刻把这句话翻译成自己心里的那套“小抄”暗号。为什么能对上?因为他脑子里有一本对照词典,能把文字里的“红”和图片里的“红”指向同一个概念。机器学习把这本词典叫作跨模态对齐。
模型要做的,就是把“图像空间”和“文字空间”通过映射函数放进同一个“语义空间”里。训练时,给模型看大量图文对——一张图配一段描述它的文字。匹配对要在空间里靠近,不匹配的要相互推开。最经典的训练方法是对比学习:每个批次里,配对的图文是正样本,其余全是负样本,模型要学着把正样本从一堆干扰项里挑出来。
对比学习常使用 InfoNCE 损失函数,公式如下:
有了翻译官,老周不再需要顾客提供专业描述——一句“像那种花的布”就够定位了。跨模态对齐让以图搜文、以文搜图变成同一件事:图像与文本在同一个空间里自由对话。
- 正样本对打分图像向量和它对应的文本向量,相似度应该尽量高。
- 温度缩放相似度除以 τ 再取指数,τ 越小分布越尖锐,模型越较真。
- 分母构建候选名单把批次内所有负样本的指数项相加,构成待区分集合。
- 负对数似然正确配对被选中的概率越接近 1,损失越小。
ANN 近似检索:旧货市场的分区导航
老周的市场有一百个摊位。如果目标布料的“小抄”要和每个摊位的布料从头到尾比对一遍,跑完得花一整天。聪明的做法是先给市场画一张分区导航图:布料去 2 区,瓷器去 8 区;2 区再细分纯色区、印花区。每次寻宝先锁定几个分区,再在分区内细看。索引的力量,就在于此。
在向量检索中,我们同样要为海量商品特征建立索引。最常用的是倒排索引:先对全库做聚类,得到几千个聚类中心作为“分区标志”,每个商品挂到最近的中心下。查询时只访问最近的几个分区,大幅减少比对次数。此外还有局部敏感哈希(LSH),让相近向量碰撞进同一个桶;HNSW 构建可导航的小世界图;乘积量化(PQ)负责压缩向量体积。这些方法统称近似最近邻(ANN)。
以 PQ 为例,它的压缩思路可以用下面的近似距离公式表达:
有了分区导航,老周不用再从头逛到尾,而是直奔 2 区再比对细节。ANN 正是牺牲一点点“可能漏掉最相似项”的代价,换来几十上百倍的提速——对千万级商品库来说,这是唯一可行的方案。
- 切分向量把 d 维向量均匀切成 m 段子向量。
- 码本量化每一段子向量在对应码本中找到距离最近的中心,用中心编号代替原始数值。
- 近似距离累加把各段与最近中心的距离相加,得到整体距离的估计值。
商品搜索:拍照搜同款的完整链路
顾客拍了一件外套的照片,说要找同款。老周的流程是:先做特征小抄(向量),再用分区导航快速圈定候选,接着只看“男装→外套”这一类,最后综合价格、销量等条件排出结果。这一套组合拳,就是电商以图搜同款的真实链路。
商品搜索和通用以图搜图不同,它必须结合类目信息。图里是一件男士牛仔外套,就不该去“女鞋区”比对。系统会先做类目预测或直接读取商品挂载的类目,用类目过滤掉无关候选,再做精细排序。最终排序分数通常不只看视觉,还要融合文本相关性、销量热度、价格区间等信号。
常见的融合排序公式如下:
老周找同款时,不仅求“像”,还求“对”。类目过滤和排序融合,相当于把顾客的潜台词——“是男款”“别太贵”“评价要好”——全部纳入考量。搜索系统把视觉信号和商业信号揉在一起,才真正从“眼力”升级为“生意”。
- 视觉相似度查询图片与候选商品的图像特征做余弦相似度,衡量外观像不像。
- 文本相似度查询词(如“牛仔外套”)与商品标题的语义匹配度,弥补视觉盲区。
- 加权求和用 α 控制两种信号占比,工程上可通过离线实验调优。
视频片段检索:把一段舞拆成帧来认
某天顾客发来一段 5 秒的舞蹈视频,问老周能不能找到出处。老周先把视频按每秒几帧拆成几十张画面,像翻连环画一样逐张看,最后锁定“这个转身动作在第 3 分 20 秒处”。视频检索的本质就在于此:把视频拆成帧,像以图搜图那样逐帧比对,再把帧级结果聚合成片段级结论。
工程上,视频片段检索通常先均匀抽帧,比如每秒 2 帧,或按场景切分取关键帧;然后每帧过一遍 CNN 得到帧向量。当查询图片或文字到达时,系统计算它与每一帧的相似度。一个片段与查询有多相关,可以取片段内所有帧相似度的最大值或平均值:取最大适合“片段里出现过就算数”,取平均则要求整体风格一致。
帧级最大相似度的公式如下:
老周能把一段“5 秒舞蹈”定位到“完整版第 3 分 20 秒开始”,靠的就是把动态视频变成一组静态小抄再连续比对。视频检索让“用内容找片段”成为可能,版权检测、影视搜索、直播回放定位都依赖它。
- 逐帧提取对片段的每一帧用 CNN 提取特征向量,得到向量序列。
- 帧级相似度查询向量与第 t 帧的向量计算余弦相似度,得到 T 个分数。
- 聚合取最大从 T 个分数中选出最大值,作为该片段与查询的整体匹配度。
部署与优化:把寻宝铺子开成现代化商城
老周的生意越做越大,市场管理方请他把经验固化下来:建一个商品档案库(向量数据库),配上快速电梯(GPU 加速卡),再安排专人每天上新货(增量索引更新)。单机演示再漂亮,落地成服务才是真功夫。
线上以图搜图系统通常包括四层:特征抽取服务用 GPU 推理把入库图片实时转成向量;向量数据库(如 Milvus、Faiss)负责 ANN 检索;业务层做类目过滤和排序;最后是索引更新任务——新商品凌晨批量入库、下架商品及时删除。由于数据每天都在变化,索引不能一次性建完,需要用增量更新保证新鲜度。
衡量检索质量的重要指标是召回率:
老周的市场最终被改造成现代化商城:档案库(向量索引)让查找变快,电梯(GPU)让换层变快,每日上新(增量更新)让信息不过时。部署与优化的本质,是让实验室里“走得通”的寻宝术,变成每天能扛住百万次查询的扎实服务。
- 标准答案集合H 是评测集中与查询真正相关的全部商品。
- 返回前 K 个系统按融合分数从高到低返回前 K 条结果。
- 交集与比值返回结果中命中正确集合的比例,越接近 100% 越理想。
AI 应用场景
电商拍照搜同款
阶段:内容理解与检索
解决的问题:用户看到一件衣服想买同款,却说不清品名和品牌;传统关键词搜索无法描述视觉特征。AI 用 CNN 提取商品特征,配合 ANN 索引在亿级商品中秒级召回相似款,再结合类目与销量排序。
具体案例:用户在街拍中看到一件大衣,拍照上传,系统在 200 毫秒内返回相近款式,按“相似度 + 销量”排序,并支持“只看同款”和“找相似”两种模式。
视频版权与片段溯源
阶段:视频理解与匹配
解决的问题:搬运、二次创作导致视频片段散落全网,人工审核无法逐一比对。将视频抽帧成向量入库,再用疑似视频的帧向量检索,命中即定位来源。
具体案例:某平台接到原片投诉,系统将疑似搬运视频切帧检索,3 秒内定位到与源视频相同的片段,并给出时间戳和相似度报告。
设计灵感素材检索
阶段:跨模态检索
解决的问题:设计师想找“莫兰迪色系的极简客厅”,却不知道该怎么描述风格。利用跨模态对齐,既可以用参考图搜同风格素材,也可以让“图像 + 文字”联合检索,覆盖传统标签库够不到的表达。
具体案例:家装 App 上线“以图搜灵感”功能:用户上传一张配色参考图,再输入“原木风”,系统返回与该风格匹配的实景图集。
Python 演示
import timeimport numpy as np class SimpleSearchEngine: def __init__(self, dim=128, n_items=10000, n_centers=64): self.dim = dim self.n_items = n_items self.n_centers = n_centers # 模拟商品特征库 (真实场景中由 CNN 或 ViT 提取) self.db = np.random.randn(n_items, dim).astype(np.float32) self.db /= np.linalg.norm(self.db, axis=1, keepdims=True) self.labels = np.random.randint(0, 10, n_items) self.kmeans = None self.cluster_ids = None self.inverted_list = None def extract_feature(self): # 模拟视觉特征提取: 真实系统用 CNN/ViT 模型 v = np.random.randn(self.dim).astype(np.float32) return v / np.linalg.norm(v) def brute_force_search(self, query, top_k=5): # 精确最近邻: 全库计算余弦相似度 sims = self.db @ query idx = np.argsort(-sims)[:top_k] return idx, sims[idx] def build_inverted_index(self): # 用 KMeans 聚类中心模拟倒排索引的分区 from sklearn.cluster import MiniBatchKMeans self.kmeans = MiniBatchKMeans(n_clusters=self.n_centers, random_state=42, batch_size=1024) self.cluster_ids = self.kmeans.fit_predict(self.db) self.inverted_list = {i: np.where(self.cluster_ids == i)[0] for i in range(self.n_centers)} def ann_search(self, query, top_k=5, n_probe=4): # 近似最近邻: 只检索最近的 n_probe 个分区 dist_to_centers = np.linalg.norm(self.kmeans.cluster_centers_ - query, axis=1) probe = np.argsort(dist_to_centers)[:n_probe] cand = np.concatenate([self.inverted_list[c] for c in probe]) sims = self.db[cand] @ query order = np.argsort(-sims)[:top_k] return cand[order], sims[order] if __name__ == '__main__': engine = SimpleSearchEngine() q = engine.extract_feature() t0 = time.time() exact_idx, exact_sim = engine.brute_force_search(q) t_exact = time.time() - t0 engine.build_inverted_index() t0 = time.time() ann_idx, ann_sim = engine.ann_search(q) t_ann = time.time() - t0 overlap = len(set(exact_idx.tolist()) & set(ann_idx.tolist())) print("exact top:", exact_idx, "sim:", exact_sim) print("ann top:", ann_idx, "sim:", ann_sim) print("exact time: %.4fs | ann time: %.4fs | overlap: %d/5" % (t_exact, t_ann, overlap))
self.db = np.random.randn(n_items, dim).astype(np.float32)用随机向量模拟商品特征库,真实场景中这些向量来自 CNN 对图片的编码。self.db /= np.linalg.norm(self.db, axis=1, keepdims=True)把所有向量归一化成单位长度,之后一次内积直接等于余弦相似度。sims = self.db @ query一次矩阵乘完成全库相似度计算,这是精确检索的核心。self.kmeans = MiniBatchKMeans(n_clusters=self.n_centers, ...)用聚类中心模拟“分区”,每个聚类中心管理一批特征相近的商品。probe = np.argsort(dist_to_centers)[:n_probe]查询只进入最近的几个分区,这就是 ANN 比暴力检索快几个数量级的原因。overlap = len(set(exact_idx.tolist()) & set(ann_idx.tolist()))对比精确检索与 ANN 命中的重叠个数,直观观察召回损失。
常见误区
误区以图搜图不就是拿图片逐像素比对吗?只有完全一样的图片才能搜出来,换个滤镜、裁个边就找不到了。
正解实际系统比较的是高维特征向量,也就是“颜色、纹理、结构”的抽象浓缩版。像素完全一样反而不是目标,特征相似才是。滤镜、裁剪、缩放后,只要主要视觉特征还在,向量依然相近,所以仍然能搜到。
为何常见:用户对“图像相似”的直觉停留在像素层,不知道深度学习已经把图片压缩成语义特征了。
误区ANN 是近似检索,会漏结果,正式系统必须用暴力精确搜索才能保证准确。
正解在千万级向量库里,暴力搜索的时间和算力都不可接受。ANN 通过可调参数(如 n_probe、ef_search)能把召回率做到 95% 以上,漏掉的通常是肉眼都难以区分的极相似项,业务上可接受。
为何常见:把“近似”等同于“不靠谱”,忽略了精度与速度之间存在可控的权衡空间。
误区视频不就是一组图片吗?抽一帧关键帧去做以图搜图就够了。
正解单帧会丢掉动作过程。查询“跳水动作”时,光看一张入水前的截图很难和完整动作匹配。正确做法是抽多帧、逐帧算相似度,再用最大值或平均值聚合,才能体现时间维度上的内容相关性。
为何常见:把视频简单理解为静态图的集合,忽略了时间顺序和动态语义。
误区图文匹配就是给每张图打上几个标签词,搜索时匹配标签文本就行了。
正解标签是离散的、固定的词汇表,表达不了“红底白花”这类组合语义。跨模态对齐学的是联合语义空间,对从未见过的词组也有泛化能力——这正是它和传统标签检索的本质区别。
为何常见:把深度学习的语义嵌入误解为传统的倒排关键词系统。
误区商品向量建完索引,以后就不用管了,索引是静态文件。
正解电商每天上新和下架,索引必须增量维护。否则新商品永远搜不到,下架商品还留在结果里。生产中需要设计增量插入、删除、段合并等任务来保证数据新鲜度。
为何常见:把索引看成一次性构建的静态资源,忽略了数据是持续流动的。
面试题
Q1. 以图搜图系统处理查询图片的第一步,通常是把图片转换成什么?
- A.高分辨率像素矩阵
- B.稠密的特征向量← 正确答案
- C.压缩后的 JPEG 文件
- D.自动生成的文字描述
答案:B。以图搜图的第一步是让 CNN 把图片编码成稠密特征向量,后续检索、排序都基于向量。像素矩阵太大且不抗干扰;JPEG 只是存储格式;文字描述不是从图片里直接生成的,所以选 B。
Q2. 下列哪一项是衡量两个特征向量相似度的常用指标?
- A.余弦相似度← 正确答案
- B.标准差比对
- C.像素差分和
- D.哈希值相等
答案:A。余弦相似度衡量两个向量方向的一致性,是向量检索最常用的相似度指标。标准差、像素差分、哈希值都不是特征向量相似度的常规度量。
Q3. 跨模态对齐中的“联合语义空间”指的是什么?
- A.图像与文本被映射到同一个向量空间,语义越近距离越近← 正确答案
- B.把图像和文本向量化后存进同一个数据库
- C.用统一的压缩格式保存所有类型的媒体文件
- D.将文本翻译成多国语言后做近似字符串匹配
答案:A。联合语义空间是图像向量与文本向量共享的向量空间,模型通过对比学习让配对的图文在空间里靠近。单纯存在同一个数据库或统一压缩格式不叫语义空间;翻译成多国语言仍是文本层面,不是跨模态。
Q4. 以下哪些技术可以用于 ANN(近似最近邻)向量检索?
- A.倒排索引← 正确答案
- B.HNSW 图索引← 正确答案
- C.随机梯度下降
- D.乘积量化 PQ← 正确答案
答案:ABD。倒排索引用聚类分区裁剪搜索范围;HNSW 用可导航图快速接近目标;乘积量化压缩向量降低内存和距离计算成本。随机梯度下降是训练模型的优化算法,不属于检索索引技术。
Q5. 电商以图搜同款中“类目过滤”的主要作用是什么?
- A.提升商品图片的分辨率与清晰度
- B.仅检索相关品类以降低跨类目噪声← 正确答案
- C.自动生成商品的标题文案
- D.预测商品未来一段时间的销量
答案:B。类目过滤把候选集限制在与查询图相关的品类内,比如“外套”查询不去“鞋靴”区比对,从而降低噪声、提升精度。它不负责图像增强、标题生成或销量预测。
Q6. 视频片段检索中,用“逐帧相似度的最大值”代表片段与查询的匹配度,是出于什么考虑?
- A.片段内所有帧都必须与查询相似才认为匹配
- B.只要片段内有一帧命中查询内容,就说明片段相关← 正确答案
- C.因为取最大值在工程上实现最简单
- D.因为视频帧之间彼此没有任何关联
答案:B。取最大值的语义是“片段中只要出现与查询匹配的画面,片段就相关”,适合检索物体或动作是否出现过。若要求整体一致才选平均。D 选项不成立,帧间存在强时序关联。
Q7. 部署一个商用以图搜图服务,通常需要哪些组件?
- A.向量数据库(如 Milvus/Faiss)← 正确答案
- B.GPU 驱动的特征抽取服务← 正确答案
- C.类目过滤与商品排序模块← 正确答案
- D.前端页面编译打包工具
答案:ABC。向量数据库负责索引与 ANN 检索,GPU 服务负责图像向量化,业务层做类目过滤和排序。前端编译打包属于客户端工程,不构成检索服务端的核心组件。
Q8. 乘积量化(PQ)压缩特征向量的核心思路是什么?
- A.把向量切段,每段用码本中心的编号近似代替← 正确答案
- B.删除向量中的全部零元素以缩小体积
- C.用更小的整数类型存储每一位浮点数
- D.将高维向量随机投影到低维平面
答案:A。PQ 把高维向量切成 m 段,每段在对应码本中找到最近中心,用中心编号存储,距离用各段近似距离之和代替。它不删除零元素,也不是简单换数据类型,随机投影是另一种降维方法。
Q9. 关于对比学习中的温度系数 τ,下列说法正确的是?
- A.τ 越小分布越尖锐,模型更关注难负样本← 正确答案
- B.τ 越大,正负样本相似度差距容易被抹平← 正确答案
- C.τ 常作为超参数手工调节取值← 正确答案
- D.τ 必须设为固定值 1 才收敛
答案:ABC。τ 控制 softmax 分布的锐利程度:越小模型越“较真”,对难负样本更敏感;越大所有样本的分数差异被压平,训练难度降低。τ 一般作为超参数调,不是必须等于 1。
Q10. 相比于以图搜图,视频检索额外处理的核心维度是什么?
- A.时间维度← 正确答案
- B.颜色维度
- C.声音维度
- D.纹理维度
答案:A。视频是在时间轴上连续排列的帧序列,视频检索要在帧与帧之间寻找动态内容与动作模式,时间维度是它区别于静态以图搜图的核心。颜色、纹理是图像已有的维度,声音不在本主题讨论范围。