Memoria 项目实训日志 #4 | 语义编导与 AIGC:智能回忆推荐引擎与多模态叙事落地
文章目录
项目名称:智能影记 - Memoria
团队名称:Mnemosyne
时间:2026.04.06 - 2026.04.12 (实训第四周)
当前阶段:Phase 3 (语义编导与 AIGC 初探)
一、 本周工作概述:让数据产生“温度”
在过去的几周里,Memoria 团队完成了底层 Isar 数据库的搭建、相册的极速扫描过滤以及双重打标(视觉 + OCR)。但仅仅把照片存起来并贴上标签并不是我们的最终目标。
本周,团队的重心从“数据存储”向“数据应用”转移。我们开始基于已有的元数据矩阵(时间戳、地理坐标、多维标签),为用户提供具备情感价值的上层交互。本周成功落地了两大核心模块:
- 智能回忆推荐引擎:实现“往年今日”、“场景聚合”、“地点回顾”等个性化推送(UI首页动态展示)。
- 多模态叙事生成器:通过提取多图特征构建复杂的 Prompt 工程,调用云端大模型自动为相册生成旁白剧本与配乐提示词。
二、 智能回忆推荐引擎:让美好主动“浮现”
传统的相册是一个冷冰冰的文件管理器,而“智能影记”的使命是成为用户的“回忆管家”。本周前端团队在 HomePage (首页) 重构了“发现”模块,抛弃了静态 Mock 数据,编写了一套基于规则的本地推荐策略。
2.1 推荐策略设计
由于所有运算都在本地 Isar 数据库中完成,我们设计了轻量级、不耗费网络资源的三层渐进式推荐规则:
- 规则 1:时间策略。系统会动态感知当前日期。如果是 12 月底或 1 月初,会触发“年度总结”;如果到了月末,会触发“月度回顾”;日常情况则会匹配历史上同月同日的照片(往年今日)。
- 规则 2:内容画像策略。利用前期 AI 打上的标签进行归类。当本地图库中出现大量带“猫/狗”标签的照片时,触发“萌宠心动瞬间”卡片;带“美食/餐厅”标签时,触发“我的美食日记”。
- 规则 3:地点保底策略。当上述规则均未命中时,系统会按城市(如
city == '青岛市')进行聚合回顾。
2.2 核心代码实现
得益于 Isar 的链式过滤语法,这套复杂的查询引擎在本地执行仅需毫秒级。以下是“时间策略(往年今日)”的核心片段:
// 截取自 home_page.dart -> _buildTimeRuleCard
Future<Map<String, dynamic>?> _buildTimeRuleCard(Isar isar, DateTime now) async {
List<PhotoEntity> historyPhotos = [];
int historyYear = now.year;
// 向上追溯 5 年的今天
for (int i = 1; i <= 5; i++) {
final start = DateTime(now.year - i, now.month, now.day).millisecondsSinceEpoch;
final end = DateTime(now.year - i, now.month, now.day, 23, 59, 59).millisecondsSinceEpoch;
// 利用 Isar 的时间戳过滤进行极速匹配
final photos = await isar.photoEntitys
.filter()
.timestampBetween(start, end)
.findAll();
if (photos.isNotEmpty) {
historyPhotos.addAll(photos);
if (historyYear == now.year) historyYear = now.year - i;
}
}
// 生成可供 UI 渲染的卡片数据
if (historyPhotos.length >= 3) {
return _createCard(
'那年今日',
'梦回 $historyYear 年的今天',
'时光机',
Colors.orange.shade50,
Colors.orange.shade300,
Icons.history,
historyPhotos.take(20).toList(),
);
}
return null;
}
三、 多模态叙事生成器:AI 化身“金牌编剧”
推荐出照片只是第一步,本周最具挑战的突破是将这些离散的照片“串联成故事”。这就是 StoryService 的核心职责。
3.1 跨模态特征提取与洗脱
当用户选中一组照片准备生成故事时,系统首先要解决的是:如何让只能处理文本的大模型“看懂”这组照片?
我们在客户端对选中的多图进行了降维打击:
- 提取每张照片的高频视觉标签(AI Tags)。
- 将照片中的文字(OCR Tags 与 OCR Highlights)提炼出来。
- 计算该组照片的平均欢乐值(Joy Score)与总体时空信息。
3.2 终极 Prompt 工程:铁血约束与结构化输出
为了防止大模型过度“脑补剧情”或产生幻觉,我们在 LLMService 中编写了极其严苛的 Prompt。我们强制要求模型绝对服从客观素材提炼,并直接输出带  占位符的结构化剧本:
// 截取自 llm_service.dart -> generateStoryAndMusic 的 Prompt 设计
final prompt = '''
你现在是一位拥有百万粉丝的爆款短视频导演兼金牌编剧。
请严格基于以下【真实的画面素材记录】,构思短视频/Vlog的剪辑思路和旁白脚本。
【既定背景与要求】
- 整体时空:$date · $location
- 照片总数:$photoCount 张
- 灵感词汇:${tags.join(', ')}
- OCR 文本线索:${ocrHighlights.join(';')}
- 欢乐指数:${joyScore.toStringAsFixed(2)} / 1.0
【🎬 真实镜头分镜表(绝对不许篡改或推测)】
$photoDetails
【硬性约束】
- 禁止把零散 OCR 词语脑补成“采购员、房主、未婚妻、套路”等角色设定。
- 如果镜头描述中出现“屏幕、课件、聊天”,必须按文档内容处理,禁止写成剧情。
请按照以下结构输出:
【一、 素材内容提炼】
【二、 备选故事脚本】(必须包含所有照片的  占位符以供后续渲染)
【三、 成片风格总结】
''';
3.3 MusicGen 专属配乐提示词生成
除了文字,我们还为后续的 AI 音乐合成铺平了道路。通过额外提取照片风格(如阳光、旅行、忧郁等),LLM 会自动撰写一句符合 Meta MusicGen 规范的纯英文配乐提示词(如:Seamless loop, upbeat acoustic pop, sunny travel vlog vibe, 120 bpm.),为下一步生成视频做足了听觉准备。
四、 本周总结与下周展望
本周,团队跳出了底层数据的泥沼,向用户展示了“智能相册”真正的业务价值。通过本地规则引擎实现了千人千面的回忆推荐,又利用精密的 Prompt 工程打通了从图片集到结构化剧本的 AIGC 生成流。
下周(Phase 3 冲刺阶段)工作重点:
- 端侧向量引擎并网:底层负责的 C++
MobileCLIP端侧转换已进入尾声,下周我们将彻底替换掉现有的文字搜索,正式上线全本地、多模态的向量空间检索(V2 版搜索)。 - 视频合成管线预研:有了本周生成的带占位符的脚本,我们将探索在 Flutter 侧整合图片与本地/云端音频流,尝试进行初步的视频帧渲染。
Memoria 的故事线已经展开,敬请期待下周的技术突破。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)