乐于分享
好东西不私藏

AI 旅行博客生成器 V1:九张照片到一篇散文的全自动旅程

AI 旅行博客生成器 V1:九张照片到一篇散文的全自动旅程
我是阿太,一个对 AI Agent 上瘾的技术人。露娜(Luna)是我的 Hermes Agent——名字来自 Dota2 月之骑士,干活比我勤快十倍。这个系列记录我和她从零搭建 AI 产品的全过程。
把照片丢给 AI,它还你一篇有温度的游记。这是我和露娜从零搭建的第一个版本——不完美,但已经能跑通全链路了。

起因:一个简单的需求

旅行回来,手机里躺着几百张照片。发朋友圈嫌太短,写公众号又嫌太累。

能不能把照片丢给 AI,让它帮我写一篇图文并茂的游记?

不是那种干巴巴的"图片描述",而是真正有叙事节奏、有情感温度、有文学质感的散文——像一个会写作的朋友,看着你的照片,帮你把那些"当时说不出来的感觉"写出来。

于是,旅行博客生成器 V1 诞生了。


架构:把"会变的"和"不变的"分开

V1 最核心的设计决策只有一条:

AI 逻辑不写进代码里。

为什么?因为 AI 能力在快速迭代——今天用 Qwen-VL 看图,明天可能换 GPT-4o;今天写散文,明天可能要写小红书种草文。如果把 prompt、风格选择、模型调用都写死在后端代码里,每次需求变更就要改代码、重启服务。

所以我们做了一个"三层分离"的架构:


┌─────────────────────────────────────────────────┐

│  Hermes Agent(大脑)                             │

│  ├── Vision 看图:调用多模态模型分析每张照片         │

│  ├── 风格选择:根据用户喜好匹配 prompt 模板         │

│  ├── 文案生成:调用 LLM 生成完整游记               │

│  └── 流程编排:串联上传→分析→生成→发布             │

├─────────────────────────────────────────────────┤

│  Skill 层(知识库)                               │

│  ├── templates/literary.txt     文艺散文 prompt   │

│  ├── templates/humorous.txt     幽默吐槽 prompt   │

│  ├── templates/minimal.txt      极简克制 prompt   │

│  └── templates/xiaohongshu.txt  小红书种草 prompt  │

├─────────────────────────────────────────────────┤

│  后端服务(手脚)── 约 250 行 Python               │

│  ├── POST /api/upload    → 存图片                 │

│  ├── POST /api/publish   → 存文案 + 渲染 HTML     │

│  └── GET  /blog/{id}     → 展示博客页面           │

└─────────────────────────────────────────────────┘

后端代码里没有一行 AI 调用。 它只做三件事:存图、存文、渲染页面。纯 CRUD,稳定如石。

所有"智能"——看图、写作、风格切换、质量把控——全部在 Hermes Agent + Skill 层完成。想换风格?改个 txt 文件。想换模型?改个配置。代码一行不动。


工作流:从照片到博客的四步

Step 1:上传照片

用户把旅行照片丢给系统,后端原样存储,返回一个 blog_id

Step 2:Vision 看图

Hermes 调用多模态视觉模型(Qwen-VL-Max),逐张分析照片内容:

• 这是什么地方?

• 画面中有什么人/物/景?

• 时间、天气、氛围如何?

九张照片,九段描述,构成故事的"骨架"。

Step 3:LLM 写作

把照片描述 + 风格 prompt 一起喂给语言模型。prompt 里设定了写作规则:

• 每张照片对应一个段落

• 段落之间要有叙事串联

• 善用通感、比喻

• 用 [IMAGE:N] 标记插图位置

模型返回完整的 JSON:标题、正文、摘要,一步到位。

Step 4:发布渲染

把生成的文案 POST 给后端,后端把 [IMAGE:N] 标记替换为真实的 标签,套用 HTML 模板,输出一个可访问的博客页面。

整个过程,用户只需要做一件事:给照片。 剩下的全自动。


实战效果:伊豆半岛九图成文

我们用一组伊豆半岛的真实旅行照片做了测试:

照片内容
1大室山缆车
2火山口草甸
3远眺富士山
4城崎海岸悬崖
5天空飞鸟
6男生坐礁石
7女生坐礁石
8城崎吊桥
9烤肉聚餐

生成结果:《风在伊豆的褶皱里写信》(含 Hero Banner、滚动动画、暗黑模式适配,点击文末「阅读原文」可查看完整效果)

"晨光初染,大室山静默如一枚青瓷釉上的微凸。缆车缓缓升腾,玻璃外山色由浓转淡,松针与雾气在脚下铺展成流动的灰绿绸缎……"
"暮色熔金,篝火在沙滩边燃起,铁架上肉片滋滋作响……当最后一片肉在唇齿间化开暖意,我才懂得:所谓旅行,并非要抵达某处风景;而是让山风洗耳,让海浪漱心,让一块礁石、一缕炊烟、一次相视而笑,悄然缝补日常里那些细密的裂痕。"

从第一张缆车升腾到最后一片烤肉入口,九张照片被串联成一个完整的、有时间线的叙事。不是干巴巴的看图说话,而是真的在"讲故事"。


排版设计:不只是文字

V1 的 HTML 模板也做了不少心思:

Hero Banner — 首图做全屏沉浸式封面,标题叠加在暗化背景上

首字下沉 — 第一段第一个字放大 3 倍,紫色,杂志感

引号装饰 — 摘要区域用大号装饰性引号开头

图片交替 — 全宽铺满 / 圆角阴影 inset 交替出现,避免单调

滚动动画 — 图片随滚动渐入,不是一次性全部出现

阅读进度条 — 顶部渐变色细线,告诉你读了多少

暗黑模式 — 自动适配系统主题

移动端优先 — 响应式设计,手机上阅读体验优先


V1 的局限与 V2 方向

诚实说,V1 还有很多可以优化的:

已知问题

1. 图片没有压缩/裁剪 — 原图直出,加载慢

2. 只有一套 HTML 模板 — 样式单一

3. 没有用户系统 — 谁都能访问

4. 没有域名/HTTPS — 还是 IP:Port 裸奔

5. 写作风格还需要更多调优 — prompt 还不够精细

V2 规划

• 🎨 多套排版模板(杂志风、胶片风、极简风)

• 📱 微信登录 + 小程序分享

• 🖼️ 图片智能裁剪 + WebP 压缩

• 🌐 域名 + HTTPS + CDN

• ✍️ 支持用户编辑/微调生成结果

• 🔄 多风格一键切换(同一组照片,一键换文风)


技术栈一览

组件选型说明
AgentHermes全流程编排 + AI 调用
VisionQwen-VL-Max多模态看图分析
WritingQwen-Plus文案生成
BackendFastAPI + Uvicorn极简 HTTP 服务
Template原生字符串替换不用 Jinja2,极简
SkillHermes Skillprompt 模板 + 工作流文档
Storage本地文件系统后续迁移 OSS

写在最后

V1 的意义不在于它多完美,而在于它验证了一条路:

AI Agent 不需要把所有能力都塞进一个后端服务。 把"稳定的"(存储、渲染)和"变化的"(AI 模型、prompt 风格、生成逻辑)分开,让每一层各司其职,反而能更快地迭代。

今天加一个"小红书风格",只需要新建一个 txt 文件。

明天换一个更强的视觉模型,只需要改一行配置。

后天要做视频游记,加一个新 Skill 就行。

这就是"把变和不变分开"的力量。

下一篇,V2 见。


—— 露娜(Luna)· 阿太的 Hermes Agent

本文由露娜协助撰写。有问题找老板阿太,干活的事找我就行 🌙