Memoria 开发记录 13:端侧 VLM 演进——从原生桥接实验到可复用媒体描述服务
前言
视觉语言模型(VLM)能够把图片转换为自然语言描述,是相册故事生成的重要基础。传统标签只能说明“海边、人物、日落”,而 VLM 可以进一步描述“几个人在傍晚的海边散步”,为标题、旁白和故事结构提供更丰富的上下文。
但端侧 VLM 远比云端 API 难做:模型体积大、内存占用高、运行时复杂,图片读取还必须遵守移动系统权限。Memoria 的本地 VLM 经历了多次方向调整,从原生 Android Bridge、llama.cpp/llamadart,到 SmolVLM2 和统一描述服务。
这段演进的价值不在于证明某个模型最好,而在于逐步找到可维护的产品边界。
原生桥接为什么难以长期维护
早期 InternVL 实验通过 Kotlin 原生桥接接入,包含大量平台代码、实验服务、探针脚本和测试页面。它能够快速验证“模型能否在设备上跑”,但实验代码逐渐和业务编排耦合。
提交 a25b506 迁移到 llamadart,并删除大量原生桥接和旧实验代码。这次改动新增统一的本地模型服务、Qwen llama.cpp 服务和模型资产管理,减少 Dart 与 Kotlin 两侧重复维护。
迁移体现了一个常见规律:
原型阶段优先打通能力,产品阶段必须重新划分运行时边界。
如果每个模型都拥有独立页面、平台桥接、输出归档和故事逻辑,后续更换模型的成本会非常高。
“CPU 能跑”只是第一道门槛
提交 9f694e3 的信息很直白:“起码 CPU 能跑了,GPU 不知道”。这其实非常符合端侧大模型的真实状态。
GPU 加速不仅取决于运行时支持,还取决于:
- 模型算子能否放到 GPU;
- 内存是否足够容纳权重和中间张量;
- 图形上下文和执行线程是否正确;
- 量化格式是否被后端支持;
- 加速后的数据搬运成本是否值得。
所以端侧 VLM 的第一目标通常不是追求峰值速度,而是建立一个稳定的 CPU 基线:模型能加载、能生成、能停止、不会破坏应用其他功能。在这个基础上再逐步尝试 GPU 或 NPU,才有可比较的结果。
模型配置不只是一个权重路径
提交 ca50070 为本地 Qwen3.5 增加 mmproj 文件支持并更新配置。多模态模型通常由语言模型和视觉投影组件共同组成。只加载语言权重,模型可能能对话,却无法正确理解图片。
因此本地模型配置至少需要描述:
语言模型权重
视觉投影 / mmproj
上下文长度
生成参数
提示词模板
运行后端
资产来源与版本
把这些参数散落在页面和服务中,会让一次模型替换变成全局修改。集中配置和模型资产服务,是后续多模型实验能够持续进行的基础。
从 InternVL 实验转向更轻量的 SmolVLM2
提交 9c9c077 删除了大量 InternVL 实验代码和旧测试页面,同时引入 SmolVLM2 服务与统一 VLM 类型。单次改动删除约五千行代码,只保留更接近产品目标的轻量路径。
这个选择背后的考虑不是单纯比较模型榜单,而是综合:
- 手机上能否稳定加载;
- 单张描述延迟是否可接受;
- 输出是否足够 grounded;
- 是否容易接入故事生成;
- 失败时能否清晰回退;
- 维护成本是否可控。
对相册故事而言,可靠描述“画面中有什么”通常比开放式长篇推理更有价值。模型越容易自由发挥,越可能生成照片中并不存在的情节。
一次描述不够稳定怎么办
生成模型存在采样波动。同一张图片多次生成,可能得到措辞不同、细节侧重不同的结果。提交 caef47b 增加候选结果处理,让故事编排不再只依赖单次输出。
多候选的价值在于:
- 观察共同出现的稳定信息;
- 过滤明显跑偏的描述;
- 为后续故事模型提供更丰富但仍受控的上下文;
- 在调试时判断问题来自图片读取还是生成随机性。
合理的使用方式不是把三段描述无脑拼接,而是保留候选及其来源,让后续步骤做选择、归纳或一致性判断。
统一媒体描述服务
提交 9440785 重构视觉语言描述服务,强化图片与视频读取,并将故事编排中零散的模型调用收拢到 LocalVlmDescriptionService。
统一描述服务的输入不应是“某个文件路径”,而应是媒体资产和读取策略;输出也不应只是自由文本,而应包含可供业务判断的结构:
媒体身份
描述候选
生成状态
使用的模型与后端
失败原因
图片或视频的读取来源
这样,故事生成、测试页和批量分析都可以复用同一能力。更重要的是,模型更换不会迫使上层故事逻辑重新理解底层插件细节。
总结
端侧 VLM 的工程难点不只在模型推理,还包括平台桥接、资源管理、媒体读取、输出稳定性和业务边界。
这一阶段形成的经验是:
- 原型桥接适合验证能力,但产品阶段需要统一服务接口;
- 先建立稳定 CPU 基线,再讨论 GPU 加速;
- 多模态模型配置要显式管理语言权重与视觉投影;
- 模型选择应以设备可用性和输出可靠性为核心;
- 对生成结果保留多个候选,用一致性降低随机性;
- 描述服务围绕媒体资产工作,并与故事编排解耦;
- 大规模删除旧实验代码,是从研究原型走向产品能力的重要一步。
对应提交:a25b506、ca50070、9f694e3、9c9c077、caef47b、9440785。
浙公网安备 33010602011771号