端侧 AI 语义搜图实战:从向量化到多模态检索

"帮我找那张在海边看日落的照片。“这句话一旦能从嘴里说出来,图库就自己翻出目标,用户和相册之间那层"文件名加文件夹"的隔阂就被拆掉了。据公开报道,HarmonyOS 7 的 CoreVisionKit 把这类语义搜图做成端侧 AI 能力之后,讨论的焦点立刻从"能不能搜"变成了"怎么在手机里搜”。

云相册做语义搜索做了好几年,识别准确率早就够用。真正难的是把它塞进一台手机:模型不能太大,推理不能太慢,还得扛住电池和发热。端侧和云端,同一套检索逻辑,两种完全不同的活法。这篇文章把原理拆开讲,再从工程角度说清楚端侧部署的取舍,最后给一段流程级实现示例。

我会按"事件、原理、挑战、实现、对比"的顺序走。读完你不仅知道语义搜图是怎么回事,还知道它凭什么能跑进你的手机里。

事件引入:语义搜图从云端走到端侧

据公开报道,HarmonyOS 7 的 CoreVisionKit 提供端侧 AI 能力,其中语义搜图支持用户用自然语言描述画面内容,在本地图库中检索图片,处理过程在设备端完成,无需上传云端。具体支持的语言范围、检索精度与硬件门槛,以官方文档为准。

单看技术含量,这条新闻不算惊艳,多模态检索在云端早已成熟。真正值得读的信号是"端侧"两个字。它带来三个变化:① 数据不出设备,隐私顾虑直接清零;② 没有网络也能搜,离线场景天然可用;③ 延迟从"绕一圈云端"压缩成一次本地推理。三个变化叠在一起,语义搜图才从"云端功能"变成"系统能力"。

原理拆解:一张图怎么变成一串数字

语义搜图的核心,是把图像和文本塞进同一个数学空间,让"猫"和"一张猫的照片"在空间里靠得很近。这依赖两个关键设计。

双塔模型(Two-Tower)。 CLIP 这类架构给这套玩法定了型。一个图像编码器负责把图片变成向量,一个文本编码器负责把文字变成向量,两个塔各自独立,最终输出到同一套坐标体系里。图片侧常用卷积网络或视觉 Transformer,文本侧用 Transformer,中间靠对比学习把两边对齐。

对比学习(Contrastive Learning)。 训练时把"猫的照片"和"猫"这个描述配成正样本,把随机组合配成负样本。模型要学会让正样本在向量空间里靠近、负样本远离。这个目标简单粗暴,效果却出奇地好。因为语义相似被直接翻译成了向量距离近,检索问题就变成了向量空间里的邻居搜索问题。

对齐之后,图库里每张图提前算好向量存进索引。用户输入一句描述,文本塔出一个查询向量,系统在索引里找最近的 K 个邻居,返回对应图片。整条链路用伪代码表达,大概是下面这个样子:

# 离线阶段:为图库构建向量索引
for img in photo_library:
    vec = image_encoder(img)            # 图像塔 → 图像向量
    index.add(vec, img.id)

# 在线阶段:文本查询 → 相似度检索
query_vec = text_encoder("海边看日落")  # 文本塔 → 查询向量
results = index.search(query_vec, top_k=20)  # ANN 近似最近邻
return [photo_library[id] for id in results]

伪代码里的 search 不是暴力遍历。十万张照片挨个算余弦相似度,手机扛不住,所以工程上用的是近似最近邻(ANN)索引,常见的有 HNSW、IVF 这类算法。它们牺牲一点点召回率,把检索复杂度从全量扫描降到图导航式查找,端侧才跑得动。

端侧部署的挑战

原理说穿了不难,难在"在手机里跑起来"。一张约束表,比十段论述更直观:

约束维度 云端的做法 端侧的处境
算力 GPU 集群随便调 手机 SoC,NPU 算力有限还要分时共享
内存 权重常驻服务器内存 权重要常驻 App 内存,百 MB 级别就伤不起
模型体积 不敏感 目标通常压到几十 MB 量级
功耗发热 无关紧要 一次全量建索引,可能让手机发烫掉电
隐私 数据上云,靠协议兜底 数据不出设备,是卖点也是约束
更新频率 模型随时迭代 只能随系统或 App 版本走,周期长

这张表推导出一个现实结论:端侧模型的能力上限不取决于算法,取决于压缩和蒸馏做到什么程度。图像塔往往比文本塔更重,因为要理解画面里繁杂的视觉信息,所以压缩通常优先打在图像编码器上。

实现路径:图像、向量、索引、检索

给一条完整可走的实现路径,每个环节都标注要做的决策。

第一步,向量化。 选一个多模态模型,把图库里的图片全部过一遍图像塔,产出向量。端侧建议用量化到 INT8 或更低精度的版本,用一点精度损失换体积和速度,这笔交易在相册场景里通常划算。

增量插入这件事,HNSW 和 IVF 的底子完全不同,选型前得先看清差异。

HNSW:天生适合增量。 HNSW 的本质是多层跳表式的图结构,新向量插入时只需从顶层出发做一次贪心搜索,找到它在各层的邻居并连边,就能挂进图里。整个过程是局部的,不涉及全局重建,插入成本低、即时生效。代价是图结构会随插入逐渐偏离最优形态,插入多了之后召回率会缓慢下滑,需要定期做一次重连或重建来"回血"。对端侧相册这种"每天加几张、偶尔删几张"的节奏,HNSW 的增量体验最顺滑。

IVF:增量要打折扣。 IVF 先把向量空间划分成若干聚类(倒排桶),查询时只搜最近的几个桶。它的增量插入本身不复杂——新向量算一下属于哪个桶,塞进去就行——但问题出在聚类中心上:聚类中心是离线训练出来的,新数据不断涌入后,桶的划分会逐渐失真,召回率随之下降。要恢复质量就得重新聚类,而重聚类意味着所有向量重新分配桶,本质上接近一次全量重建。所以 IVF 更适合"数据批量到达、定期整体重建"的场景,比如每天夜间统一更新一次索引。

维度 HNSW IVF
增量插入 局部连边,即时生效 塞入桶内,但聚类中心会失真
插入后质量 缓慢下滑,需定期重连 随数据漂移下降,需重聚类
重建成本 低,局部重连即可 高,接近全量重建
查询延迟 图导航,稳定 桶内扫描,受桶大小影响
内存占用 较高,需存图结构 较低,桶结构更紧凑
端侧适配 适合动态图库 适合批量更新场景

落到端侧图库,推荐的做法是以 HNSW 为主、定期重连兜底:平时新照片进来走增量插入,体验零感知;攒到一定规模或系统空闲时,做一次局部重连或整体重建,把召回率拉回高位。如果图库更新有明显的批次节奏(比如每天同步一次云端相册),IVF 配合夜间重建也是合理选择。无论选哪种,都要把"删除"考虑进去——相册会删照片,索引需要支持标记删除或定期清理,否则死向量会持续占用内存、拖慢查询。
第二步,建索引。 把向量送进 ANN 索引。图库是动态的,用户天天拍新照片,所以索引必须支持增量插入,而不是每次全量重建。这一点直接决定了图库变化时的流畅度,也决定了首次启动要不要让用户干等。

第三步,查询。 用户输入自然语言,文本塔产出查询向量,走一遍 ANN 检索,拿到 Top-K 候选。查询延迟大部分耗在这一步,模型推理和索引查找各自占一半。

第四步,重排序。 候选里补一次精排,按余弦相似度或模型打分重新排序,再返回结果。不少实现还会过滤低分项,避免"看起来像但其实不对"的误召回。这一步看着小,对体验的影响却很大。

整个流程的时间大头在第一步和第二步的首次构建。为了不让用户等,端侧方案通常把全量建索引挪到空闲时段或插电时做,平时只做增量。这是一个很典型的工程取舍:把离线成本藏起来,换在线体验的顺滑。

端侧与云端的取舍

同一个语义搜图,端侧和云端各有各的账本。摆在一张表里,选择逻辑就清楚了:

对比项 端侧方案 云端方案
隐私 数据不出设备 照片需上传,依赖隐私协议
离线可用 完全可用 断网即失效
检索延迟 本地推理,毫秒级 加一次网络往返,受网络质量影响
召回质量 受模型体积限制 可用最大的模型,质量上限高
部署成本 压缩、蒸馏、端侧适配 服务器集群与带宽成本
迭代速度 随系统版本走 云端随时更新

结论不复杂:对质量敏感的冷门场景,云端余地更大;对隐私敏感、追求即时响应的日常场景,端侧是更好的默认选择。很多产品的真实形态是端云协同,端侧先粗筛,云端再精排,两头都占。

对开发者的意义

端侧 AI 语义搜图走到系统层面,对开发者是实打实的机会,三个方向值得盯。

能力借力。 如果系统提供了 CoreVisionKit 这类端侧能力,自己搭建多模态管线的成本就能省下来,重点该放在业务适配而不是重复造轮子。官方能力的支持范围、性能指标和授权方式,以官方文档为准。

离线体验是新的竞争维度。 当别人家的应用还在"正在连接"转圈,你的应用断网状态下也能本地检索,这本身就是差异化。把离线做到位,等于在弱网环境下拿走了别人的用户。

数据在端侧的资产管理。 向量索引是一种新的资产形态。图库、文档、音频都能向量化,未来端侧会沉淀出越来越丰富的个人语义库。谁先把检索体验做好,谁就占住了入口。

结论

从向量化到索引到检索,端侧语义搜图的原理链并不长,但每一步都被"设备资源有限"这根绳子勒着。据公开报道,HarmonyOS 7 把这类能力做成系统级端侧 AI,意味着多模态检索开始从云端特权走向设备标配。对开发者来说,看懂原理只是入门,真正的功夫在压缩、增量索引、功耗调度这些工程细节上,它们是端侧 AI 能不能落地的分水岭。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐