项目名称:智能影记 - Memoria
团队名称:Mnemosyne
时间:2026.04.06 - 2026.04.12 (实训第四周)
当前阶段:Phase 3 (语义编导与 AIGC 初探)


一、 本周工作概述:让数据产生“温度”

在过去的几周里,Memoria 团队完成了底层 Isar 数据库的搭建、相册的极速扫描过滤以及双重打标(视觉 + OCR)。但仅仅把照片存起来并贴上标签并不是我们的最终目标。

本周,团队的重心从“数据存储”向“数据应用”转移。我们开始基于已有的元数据矩阵(时间戳、地理坐标、多维标签),为用户提供具备情感价值的上层交互。本周成功落地了两大核心模块:

  1. 智能回忆推荐引擎:实现“往年今日”、“场景聚合”、“地点回顾”等个性化推送(UI首页动态展示)。
  2. 多模态叙事生成器:通过提取多图特征构建复杂的 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 跨模态特征提取与洗脱

当用户选中一组照片准备生成故事时,系统首先要解决的是:如何让只能处理文本的大模型“看懂”这组照片?
我们在客户端对选中的多图进行了降维打击:

  1. 提取每张照片的高频视觉标签(AI Tags)。
  2. 将照片中的文字(OCR Tags 与 OCR Highlights)提炼出来。
  3. 计算该组照片的平均欢乐值(Joy Score)与总体时空信息。

3.2 终极 Prompt 工程:铁血约束与结构化输出

为了防止大模型过度“脑补剧情”或产生幻觉,我们在 LLMService 中编写了极其严苛的 Prompt。我们强制要求模型绝对服从客观素材提炼,并直接输出带 ![img](i) 占位符的结构化剧本:

// 截取自 llm_service.dart -> generateStoryAndMusic 的 Prompt 设计
final prompt = '''
你现在是一位拥有百万粉丝的爆款短视频导演兼金牌编剧。
请严格基于以下【真实的画面素材记录】,构思短视频/Vlog的剪辑思路和旁白脚本。

【既定背景与要求】
- 整体时空:$date · $location
- 照片总数:$photoCount 张
- 灵感词汇:${tags.join(', ')}
- OCR 文本线索:${ocrHighlights.join(';')}
- 欢乐指数:${joyScore.toStringAsFixed(2)} / 1.0

【🎬 真实镜头分镜表(绝对不许篡改或推测)】
$photoDetails

【硬性约束】
- 禁止把零散 OCR 词语脑补成“采购员、房主、未婚妻、套路”等角色设定。
- 如果镜头描述中出现“屏幕、课件、聊天”,必须按文档内容处理,禁止写成剧情。

请按照以下结构输出:
【一、 素材内容提炼】
【二、 备选故事脚本】(必须包含所有照片的 ![img](i) 占位符以供后续渲染)
【三、 成片风格总结】
''';

3.3 MusicGen 专属配乐提示词生成

除了文字,我们还为后续的 AI 音乐合成铺平了道路。通过额外提取照片风格(如阳光、旅行、忧郁等),LLM 会自动撰写一句符合 Meta MusicGen 规范的纯英文配乐提示词(如:Seamless loop, upbeat acoustic pop, sunny travel vlog vibe, 120 bpm.),为下一步生成视频做足了听觉准备。


四、 本周总结与下周展望

本周,团队跳出了底层数据的泥沼,向用户展示了“智能相册”真正的业务价值。通过本地规则引擎实现了千人千面的回忆推荐,又利用精密的 Prompt 工程打通了从图片集到结构化剧本的 AIGC 生成流。

下周(Phase 3 冲刺阶段)工作重点:

  1. 端侧向量引擎并网:底层负责的 C++ MobileCLIP 端侧转换已进入尾声,下周我们将彻底替换掉现有的文字搜索,正式上线全本地、多模态的向量空间检索(V2 版搜索)。
  2. 视频合成管线预研:有了本周生成的带占位符的脚本,我们将探索在 Flutter 侧整合图片与本地/云端音频流,尝试进行初步的视频帧渲染。

Memoria 的故事线已经展开,敬请期待下周的技术突破。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐