Photo Story 项目
项目背景与设计动机
Photo Story 的目的在于简化PR部门的内容创作流程,借助 AI 快速生成宣传视频和文章。
一个完整的宣传内容的创作过程,通常分为两大类。
一类是由专业团队通过拍摄和录影采集素材,然后经过专业编辑加工工作制作出视频或稿件。 这种周期较长,成本高,但是质量也非常高,通常只用于特定的活动日。
另一类是基于既有素材或即时收集的内容,经过挑选,由机构内部的工作人员自己制作。这 种方式成本较低,但是因为会高频次发生,累计的劳动量很高,而且质量相对来说较低。传统上, 能够稳定高效的创作出宣传内容的工作人员,总是宝贵的人才,古今中外的大机构莫不如此。
通过 AI 的手段,我们可以探索一条高频次,极低成本,质量较好的内容创作路径。这个方式 生成的内容,无法与最优秀的人类创作相比,但是可以节省大量的人力,达到比较可靠的质量。
实现
Story Card
回顾一个全人工的工作流程。编辑需要以下步骤
- 进入照片目录或相册软件
- 挑选需要的照片和视频片段
- 在编辑软件中组合为视频,加工填写必要的内容
在这个过程中,AI可以在几个方面优化工作
- 智能化的选择素材
- 从图片生成视频
- 加入必要的渲染效果
- 根据图片生成宣传文章
- 对图片进行预分析,生成标注和摘要信息
- 智能识别图片的内容,找出身份信息
除了AI功能,信息系统本身还可以提供自动化能力
- 管理素材和作品
- 提供操作界面,管理图片标注和摘要
- 提供作品的编辑功能——这个能力对文章创作尤其重要
- 提供作品发布功能
基本技术架构
Photo Story 项目采用了常规的 web ai 项目架构
graph TD
A[用户] -->|访问| B(前端)
B -->|触发| G[Web后端]
G -->|启动| C[后台AI任务]
G -->|监控&跟踪| C
C -->|自动访问| D[第三方AI API]
C -->|读写| E[后端存储]
C -->|读写| F[数据库]
G -->|管理| H[素材]
G -->|管理| I[作品]
G -->|管理| J[用户身份信息]
G -->|管理| K[第三方发布]
B <-->|浏览/编辑| H
B <-->|浏览/编辑| I
H -->|保存在| E
H -->|保存在| F
I -->|保存在| E
I -->|保存在| F
- 后端
- Python
- PostgreSQL
- FastAPI
- SQLALchemy
- Alembic
- Pydantic
- PyTest
- 前端
- React
- Typescript
- Antd
- 外部服务
- 对话 AI
- 图像编辑 AI
- 图生视频 AI
- 视频编辑 AI
- 对象存储
实际上还设计一个 Mock节点,这个节点用于在测试过程中代替实际的 API 服务器。它的 技术架构几乎是后端的子集
下面我们梳理主要的开发过程和实现思路。
实现路径
在开发过程中,我会重复这样的路径
- 尽可能列举已知的需求目标,评估重要性。
- 将最重要的目标细分,尽可能分解为原子化的开发任务,梳理开发任务直接的关系,特别是从属和依赖。
- 找出“达到”目标的最短路径,实现这个路径上覆盖的所有任务。
- 在开发过程中,尽可能早的建立测试并频繁验证
开发过程
第一个迭代
第一个迭代,先打通整个开发过程的基础设施。
- 构建一个空的后端 service,运行开发模式,打开本地浏览器,在 http://localhost:8000/docs 路径可以看到 swagger 页面
- 构建空的前端项目,初始化必要的项目结构
- 配置后端的 .env 配置,建立对应的 config.py 写好基本的 settings 定义
- 建立本地的开发数据库
- 配置 alembic ,使其可以读取本地配置
- 配置本地的 minio 用于开发阶段代替云平台的对象存储
- 建立 mock,写出第一个测试
以上过程几乎都可以直接给 AI 下命令,让 AI 自动完成。 在完成第一个工作循环后,提交工作。
打通第一个目标
Photo Story 最初的目标,是希望提供一站式的图片到视频的生成过程,我们分析一下达成这个目标的最短路径。
- 用户输入提示词
- AI 在照片库中选择素材
- 根据照片库生成视频
- 根据用户的要求做必要的后处理,生成作品
要达到这四个步骤,我们需要有:
- 在线相册,用于浏览照片素材,编辑信息
- 第三方 API 服务的访问封装
- 运行长时 AI 调用任务的后台 Agent 机制
- 测试和验证程序
在这个阶段
- 我实现了一个命令行程序,从命令行参数读取文件路径,然后将图片提交给AI生成视频片段。
- 实现存储类型,封装对电信天翼云对象存储和minio的兼容访问,向本地开发环境导入测试数据集
- 编写图片素材预处理脚本,为图片生成tag和摘要信息,通过alembic管理涉及的数据库变更
- 升级命令行,读取存储对象的key,将图片提交给AI生成视频,再进行后处理,将结果保存到开发环境
- 编写命令行,读取提示词参数,从素材图片集中筛选图片
- 编写一个一站式的命令行任务,接受提示词,从素材中选取图片,根据逐张图片生成视频片段,完成合成和保存
- 完善后端代码,提供提交视频任务的API,提交请求后,后台启动命令行脚本,完成任务。
- 开始开发前端,实现照片浏览功能
- 开发创作页,提交提示词触发任务
- 完善命令行脚本,提供进度跟踪
- 完善后端和前端,使前端页面可以跟踪创作任务的进度,浏览作品
这是一个最简实现,这个阶段,我们验证了AI如何简化日常的宣传作品创作。现在我们可以做一个回顾。
- 我们有了最小的操作流程
- 系统具有了一定的工程稳定性,AI任务可以脱离服务进程独立运行,并且可跟踪
完整最小流程后,我们可以梳理下一阶段的任务
- 目前视频标题还是人工书写,我们已经有了摘要信息,可以让AI自行拟定标题
- 我们还可以提供文章创作
- 可以提供风格化加工,产生人力不容易得到的特效作品
- 提供编辑机制,允许用户选择和调整视频的片段
可用性提升
在这个阶段,我着重完善核心的创作流程
- 实现基本的文章创作流程
在实现文章创作的过程中,我们回顾前一流程中选择素材的功能,会发现这是视频和文章创作过程中共有的
- 将文章和视频流程都改写为两步过程,先通过提示词选择照片素材,然后经过用户确认再生成结果
- 允许用户调整素材顺序
- 在编辑阶段允许风格选择
- 完善用户体验,允许用户预览渲染的中间结果,加入编辑能力
- 完善 mock 子项目,尽可能将验证代码转换为测试代码
这个阶段,后端和AI任务通过AI和手工结合方式实现,前端仍然以AI为主,几乎没有人工介入。
解决技术债
在前面的迭代中,我主要通过随机选择静态资源模拟AI API,这对于图片处理和视频生成非常有效,但是 Photo Story 的流程中会需要 Chat 模型生成一些特定形式的结果,例如长度在限定范围的标题,特定格式的 JSON 表示查询逻辑,等等。
因此,第二轮迭代的大部分开发任务,都没有经过充分的测试,主要是人工操作验证。
经过验证,我发现 Qwen3 0.6B 和 Qwen3-vl Instruct 0.6B 足以满足 mock 要求,它们足够小,完全可以在有限的 cpu 环境中运行。即使在 docker compose 或 kubernetes 环境中也可以以较低的成本部署。
在这个迭代中,我还实现了视频的流式播放。
下一步
人脸识别和记忆系统
对于照片集出现过的人物,应该可以通过标注和学习记录下来,以后可以普遍用于业务中。
身份验证和接入系统
身份验证和接入系统,是几乎所有互联网系统必须的部分,但是它并不是 Photo Story 的核心,我准备在一个独立的迭代过程中实现一个允许第三方平台接入的身份验证系统。
内容发布系统
内容发布系统必须依赖身份验证,因此要在接入第三方后实现。
重建测试系统
补齐缺失的测试,并且实现对未来测试工作的规划,使测试过程能够持续方便的更新和使用。
后台任务的进一步完善
目前后台任务通过模块化管理,可以确保任务的状态跟踪,再进一步可以追求其可重入,以及对docker和kubernetes的支持。
测试改进
通过对后台任务对容器的支持,我们可以进一步实现整个系统的ci流程。使其可以在gitee中可靠的进行测试。
作品编辑逻辑的进一步优化
应允许通过全文检索等手段,先选择素材,再进入作品创作。
应对素材和作品的编辑交互做进一步的优化。
素材和作品浏览应提供照片流。
过期的中间产物应有合适的机制回收。
技术路线
- [] Photo Story
- [] 后端
- [] 后台任务
- [*] 离线运行
- [*] 命令行直接运行
- [] docker compose 支持
- [] kubernetes 支持
- [] 可重入
- [*] 可跟踪状态
- [*] 可停止
- [] 人脸识别
- [] 风格处理
- [*] 简单查询
- [] 基于语义的查询
- [*] 图像理解
- [*] 视频生成
- [*] 视频合成
- [] API
- [] 身份验证
- [] 第三方发布
- [] 素材
- [*] 素材上传
- [*] tag 管理
- [*] 摘要编辑
- [] 区域标注支持
- [] 基于 tags 的采样接口
- [] 基于语义的搜索
- [] 作品
- [*] 文章编辑
- [*] 视频创作
- [*] 流式播放
- [] 后台任务
- [] 前端
- [] 身份验证
- [] 标注管理系统
- [*] 标签编辑
- [*] 摘要编辑
- [] 区域标注
- [] 素材选取托盘
- [] 任务管理
- [*] 照片墙
- [] 流式浏览
- [] 编辑界面
- [*] 文章编辑
- [*] 视频编辑
- [] mock
- [*] Chat 模型模拟
- [*] VL 模型模拟
- [*] Image to Video 模拟
- [] 风格重绘模拟
- [] 后端
基本的思想
- 理解 AI 的特长,尽可能扬长避短
- 保持可验证
- 从长规划,具体实现,尽可能不产生技术债
- 每一次开发任务直至打通一个路线为止
- 及时还债
- 量化工作量
- 积累可重复的成果
话题延伸
- 长时任务与 Web 系统的结合
- 依赖外部系统的项目如何测试
- AI 系统接入的实践哲学
- 异步编程的基本原则
- vibe coding 的基本思路