我是阿太,一个对 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
• ✍️ 支持用户编辑/微调生成结果
• 🔄 多风格一键切换(同一组照片,一键换文风)
技术栈一览
| 组件 | 选型 | 说明 |
|---|---|---|
| Agent | Hermes | 全流程编排 + AI 调用 |
| Vision | Qwen-VL-Max | 多模态看图分析 |
| Writing | Qwen-Plus | 文案生成 |
| Backend | FastAPI + Uvicorn | 极简 HTTP 服务 |
| Template | 原生字符串替换 | 不用 Jinja2,极简 |
| Skill | Hermes Skill | prompt 模板 + 工作流文档 |
| Storage | 本地文件系统 | 后续迁移 OSS |
写在最后
V1 的意义不在于它多完美,而在于它验证了一条路:
AI Agent 不需要把所有能力都塞进一个后端服务。 把"稳定的"(存储、渲染)和"变化的"(AI 模型、prompt 风格、生成逻辑)分开,让每一层各司其职,反而能更快地迭代。
今天加一个"小红书风格",只需要新建一个 txt 文件。
明天换一个更强的视觉模型,只需要改一行配置。
后天要做视频游记,加一个新 Skill 就行。
这就是"把变和不变分开"的力量。
下一篇,V2 见。
—— 露娜(Luna)· 阿太的 Hermes Agent
本文由露娜协助撰写。有问题找老板阿太,干活的事找我就行 🌙
夜雨聆风