6. 极低花费下使用手机完成AI编程——开发网站
项目最终目标:让没有编程技术的用户,最方便地创建并维护自己的博客网站。
这是什么:资源受限不是「机器差」,而是三本账同时吃紧——机器(2 核 2 GB 服务器 + 一台 16 GB 笔记本)、人的注意力(单人、没有 code review)、模型上下文(每次会话从零开始)。本章讲在这种条件下,怎么把 AI 编程管成一条可复现的流水线。
为什么用:AI 把产出放大十倍,也会把错误放大十倍。资源充足时你可以「先错了再改」;资源受限时没有冗余吸收返工,约束只能前置,验证只能机械。
如何用:下面按「为什么做 → 三本账 → 工具与额度 → 从零建站 → 流程 → 失效点」六层展开,每条都能落成一个文件或一个脚本。样本是本章作者自己的博客:48 个技术栈、327 章教程、388 个静态页,一台 2C2G ECS 对外,一台 16 GB 笔记本干活。
6.1 这是个什么站:一个特点鲜明的博客
先交代样本身份:青蛙编程网,一个个人编程教程博客。 但它不是「又一个博客」,与常见博客的差异本身就是资源策略的体现:
| 维度 | 常见博客的做法 | 本站的做法 |
|---|---|---|
| 站点形态 | WordPress / Hexo / VitePress 框架 | 零框架、零构建:产物即页面本体,几百个 HTML 直接编辑入库 |
| 内容生产 | 人工逐篇写 | AI 批量生产 + 机械校验的流水线 |
| 内容形态 | 散文章 | 结构化教程:48 栈 / 327 章,每章配可运行代码 ZIP |
| 运行资源 | 弹性扩容 | 2C2G 独服,常驻约 380 MB |
| 维护投入 | 团队或全职 | 单人业余:晚上与周末,一次一批 |
| 站点身份 | 内容的容器 | 内容与实验品合一:讲 AI 编程方法论就拿自己当样本 |
最后一条最关键:这个站既是博客,又是它自己教程的实验台。 本章讲的约束与验证,由站点自己的部署与体检流程验证——没有第二个项目可牺牲,就让项目自身互为实验品。
6.2 为什么做这个站:填「知道」和「做过」之间的空档
AI 把技术更迭的节奏从「几年一代」压到「几个月一代」,而真实工作环境的落地速度跟不上——依赖要过审、生产网无外网、线上不能试错。于是「知道」和「做过」之间空出一段:文章读了不少,真上手仍是零。填补方式就是业余时间 + 个人资源。
定位也要说清:这是一次「资源极限低」的探索,不是最佳实践合集。目标是探出「资源压到这么低,还能不能持续产出」的下限;文中每条做法都是被约束逼出来的取舍,资源一变就该重算(见 6.8)。
花钱的地方先记清楚:
| 项 | 金额 | 记账口径 |
|---|---|---|
| 笔记本(i5-8 代 / 16 GB) | 0 元 | 自用既有设备,不计入 |
| 服务器 2C2G | 99 元/年(首年活动价) | 站点 + 后台的唯一线上支出 |
| token 包月(智谱) | 99 元/月,约 1188 元/年 | 最大单项,按月可停 |
| 免费 token | 0 元 | 工具自带额度 + 各平台免费模型 |
首年合计约 1287 元,月均约 107 元。 失败的最大损失就是这一年,换来的是一批能带回工作的可运行经验——这笔账不难算。
6.3 先把「资源」拆成三本账
| 账 | 本站数字 | 直接后果 |
|---|---|---|
| 机器 | 服务器 2 核 2 GB(常驻约 380 MB)+ 开发机 i5-8 代 / 16 GB | 构建、模型、多 worker 在服务器上全部出局 |
| 注意力 | 单人开发与维护 48 个技术栈,只有 md 文档 review | 只能靠脚本和制度兜底 |
| 上下文 | 每次会话从零开始 | 项目知识必须外置成文件 |
关键动作是把约束写成数字:内存预算表列到「argon2 每次哈希吃 19 MB」这一级,于是「能不能在服务器上装后台」不再是争论,而是查表。反向清单更值钱——明确不装上服务器的:本地大模型、OCR / PDF 解析、MySQL、Node 构建链。范围纪律比技术选型更值钱。
两台机器的分工也是硬边界:
| 环节 | 在哪台机器 | 为什么 |
|---|---|---|
| 写作、生成、抽代码、全站体检 | 笔记本 | 依赖 mistune / Pygments / Node,装好常驻保留;边界只在服务器不装 |
| 站点、后台、SQLite | 2C2G ECS | 只跑「站点 + 后台 + 数据库」三样 |
| 两端交接 | git push → 服务器 git pull |
产物入库,服务器上没有构建步骤 |
一句话:笔记本负责「算」,服务器负责「服务」,两者只用 Git 交换产物。
6.4 工具与额度:省 token 靠分层,不靠少用
| 角色 | 工具 | 用在哪 |
|---|---|---|
| 主力 | opencode | 改文档、改代码、跑脚本、提交前自查,占九成会话 |
| 辅助 | openclaw(龙虾) | 接飞书做移动编程:收对话 → 拆任务 → 派活 → 汇总,自己不碰代码 |
| 兜底 | 千问(Qwen) | 前两者额度耗尽时才上,只写各类文档,不做代码 |
额度是免费 token 打底 + 一份 99 元/月包月。免费模型会下架、限流、改行为,所以规矩不能绑在某个模型上:规则写在 AGENTS.md,正确性交给脚本,换模型只换入口。
额度见底时的降级顺序是 opencode → openclaw → 千问,最后一档只接文档;代码一律等额度恢复,因为换工具重写一遍的返工成本远高于等半天。切换的执行是手工为主 + 龙虾自动为辅:人定额度档位(额度余量是外部状态,模型看不准也信不得),龙虾在前台自动分派碎活——人定额度档位,机器定任务去向。
6.4.1 第一层:前台与执行分开
龙虾费 token 是众所周知的。最初端到端让它读仓库、改文件、跑校验,回合多、上下文反复重传,token 消耗高到这个入口基本闲置。改成分层之后才留下来:
| 层 | 谁 | 上下文里装什么 |
|---|---|---|
| 前台 | 龙虾 + 飞书 | 只有对话与任务说明,不装仓库 |
| 执行 | opencode(笔记本侧) | 完整项目上下文,一次会话内闭环 |
| 汇总 | 龙虾 | 只读结果:改了什么、校验过没过、下一步 |
关键约束是上下文不跨界:仓库内容不进 IM(即时通讯软件,如飞书、微信、Telegram,下同)会话,IM 里的讨论也不回灌主力;两层之间只传「任务说明」(哪个文件、改成什么、验收标准)和「结果摘要」(diff 要点 + 退出码)。
代价也要记账:多一跳协调,任务说明写不清,主力就来回反问,省下的 token 又花在澄清上。所以这套方案的前提是「任务能写成验收标准」——需求还模糊时,直接在终端做反而更省。自动化本身不省资源,分层才省。
6.4.2 第二层:编程类 skill——把「怎么干」从对话搬进文件
没有 skill,每个会话都要用对话轮次重新交代「章节格式、校验怎么跑、产物放哪里」——同样的话每次重新生成、重新计费;装了 skill,agent 按需读文件。省 token 的机理两层:少花(读文件比对话解释便宜,文件不随会话重传)+ 少错(照标准步骤减少试错回合,试错才是 token 大头)。
| 层级 | 文件 | 管什么 |
|---|---|---|
| 全局边界 | AGENTS.md |
允许区 / 禁区、git 与服务器规矩 |
| 工种动作 | 编程类 skill | 「新增技术栈」「改页面」「跑体检」的标准步骤 |
| 单次任务 | 任务说明 | 本次的验收标准 |
skill 不必全自己写,公开来源按可信度排三档:
- 官方仓
anthropics/skills(约 19 个,质量稳):webapp-testing(浏览器测试)、mcp-builder、docx/pptx等文档四件套 - ClawHub 社区市场(安全清理后剩三千上下,鱼龙混杂):多语言 code review / PR 审查类,可当「第二双眼睛」
- awesome 精选列表(人工筛过的索引):先查列表再去市场搜
安全闸门:公开 skill ≠ 可信任的 skill。 ClawHub 出过成规模恶意技能事件(Snyk 2026-02:抽样 36% 存在提示注入)。装任何一个公开 skill 前,人工读一遍 SKILL.md 与附带脚本,先在允许区的活上试跑——这一步归人工闸门,不交给模型自查。
6.4.3 第三层:代码生成器——批量产出交给脚本跑
内容源 md 确定性转换脚本 产物
(AI 写,花 token)→(进程跑,零 token)→(HTML / ZIP / 索引,零 token)
本项目的三件套,各管一段:
| 生成器 | 输入 | 输出 | 什么时候跑 |
|---|---|---|---|
gen_nav.py |
各栈 index.md 的章节表格 |
v2/nav.json(全站章节登记) |
新增或调整章节时,先 --write |
gen_pages.py |
docs/**/*.md + nav.json |
与现有 dist 同构的 HTML(topbar / 侧边栏 / 面包屑 / 下载按钮 / 上下章),并更新搜索索引与 sitemap | 新章节写完,渲染上线 |
extract_code.py |
正文代码块(按扩展名映射) | 每章可下载 ZIP(内含 README) | 章节定稿后重跑 |
一批技术栈(8 章 / 30~60 文件)的 token 账:花 token 的只有 8 章内容源 + 生成器(写一次,之后摊薄到接近零);零 token 的有导航登记、几十个 HTML 渲染、ZIP 打包、索引与 sitemap 更新——这些如果让 AI 逐页搬,每个文件都要读模板、生成、计费,且每次都可能引入不一致。
「AI 写生成器」特别划算的原因:生成器代码本身就是结构重复、规则明确的极致——正是模型擅长、人不爱干的活。写一次,跑无数次。
AI 的 token 只花两处:写 / 改生成器(一次性)+ 写内容源 md(每批真正的增量);机械转换归零。生成器自己守四条工程要求:
- 产物字节确定:ZIP 固定时间戳、索引无时间戳,否则每批几百个假 diff
- 先 dry-run 后落盘:解析结果先打印,人工核对再写入
- 解析不了就警告,不硬造:生成器可以兜底,不能静默出错
- 目标是同构:产出与现有页面逐块对齐,否则批量生成变成风格漂移的批量来源
边界与「敢删工具」(6.6 第 ③ 条)是同一条纪律的两面:产出结构重复、规则明确才值得写生成器;反过来,几百行、零维护、替代每批 30~60 个文件逐页开销的生成器,正是该留的那种。
生成器的职责按改动大小划:负责前端代码的初次生成(新增技术栈 / 章节,30~60 文件)与前端大改动(全站导航调整、模板结构变化——改模板一处重跑,胜过直改几百个文件);教程小改动(错字、表格、单页微调)则直接改前端产物,为几十个字跑一遍生成流程反而是浪费。判据是波及文件数:波及面大的走生成器,小的直改。
6.5 从零开始建一个站:省 token 的敏捷路线
前面回答「怎么省」,这一节回答「从零建站,顺序怎么排」。路线按批次时间轴走:
| 批次 | 干什么 | 对应的敏捷原则 |
|---|---|---|
| 第 -1 步 | 一次性基础设施:2C2G 够了别超配、域名备案第一天提交、Let's Encrypt 免费 HTTPS、服务器只装 nginx + 运行时 | 花钱点鼠标,不花 token,但决策错了全盘翻 |
| 第 0 批 | 不写页面,先写 AGENTS.md + 反向清单 |
规则前置,替代口头约定 |
| 第 1 批 | 最小可上线:首页 + 一个专题 1~2 章,静态 HTML 直写、不引框架 | 可工作的软件重于详尽的文档——第一周就有能访问的站 |
| 第 2 批起 | 把重复结构生成器化(从手做产物提炼模板,产出必须同构) | 迭代交付物里包括「让下一轮更便宜的工具」 |
| 每批 | 写作 → 生成 → 校验 → 提交 → 部署,一次会话内闭环 | 小步交付,WIP = 1 |
| 随时 | 工具跑不动就换、就删 | 响应变化重于遵循计划 |
每一步的验收标准(做到什么程度算完成):
- 第 0 批:开一个全新会话,AI 只读文件就能答对「什么能直接改、什么必须请示」
- 第 1 批:手机走流量能打开;随手改一个错字走完「改 → push → pull → 线上可见」一次
- 第 2 批:生成器独立产出一整个专题,与手做版逐块对齐,全站体检通过
- 第 3 批起:批次 = 一次会话能验证完,每批可结算、可中断,适合碎片时间
每一步的常见死法,对照自查:
| 步 | 死法 | 解法 |
|---|---|---|
| 第 0 批 | 规矩写完从未被读;反向清单变许愿清单 | 规矩进会话固定动作;违反清单必须请示并记踩坑表 |
| 第 1 批 | 完美主义开局(「先搭 CI」,两周了线上没 URL);第一批就想做满 8 章 | 死守「第一批结束线上有 URL」;砍到 1~2 章 |
| 第 2 批 | 过早生成器化(模板全靠猜);生成器过度设计 | 第二个专题仍手做;只生成真实存在的页面类型 |
| 第 3 批 | 批次膨胀(「就差一点」收不了尾);假绿 | 砍出部分进路线图排队;验收看「新版才有的端点」 |
两条顺序教训:工具选型是迭代的产出,不是迭代的前提(本站先搭 VitePress「全家桶」,263 章时峰值 1652 MB 跑不动,只能推倒换方案);生成器不是第一个会话写出来的(第一个专题手做摸清结构,第二个才开始提炼——没有真实产物就没有模板)。
站点长大之后(本站 48 栈的现状):重心完全移到内容,批次模板与风格指南的价值开始大于工具优化;站点功能(搜索、统计、后台)不是不能加,是加之前先查资源预算表;产物规模大了直改吃力,生成器从「全量构建」演化成「指定范围按需生成」——工具的每次演化都是真问题逼出来的,没有一次是提前设计的。
这条路线的敏捷内核一句话:每个批次结束时,线上都有一个能点开的东西,而且下一批比上一批更便宜。
6.6 七步闭环
| # | 步骤 | 一句话 | 本站落地 |
|---|---|---|---|
| 1 | 立规矩 | 先划允许区 / 禁区,再动手 | AGENTS.md + 操作边界文档(按风险划,不按目录) |
| 2 | 文档先行 | 先改设计文档,再改代码,同一次提交 | 架构文档里的变更流程 |
| 3 | 小批闭环 | 一次只开一个战线 | 一次一个技术栈(8 章 / 2~5k 行) |
| 4 | 机械验证 | 用脚本代替「我觉得对」 | 死链体检、范围校验、沙箱逃逸验证 |
| 5 | 人工闸门 | 只拦不可逆动作 | commit / push / 服务器写操作 |
| 6 | 压短链路 | 少一层依赖就少一处故障 | 删掉构建器,产物即页面本体 |
| 7 | 收尾沉淀 | 踩过的坑变成一次性知识 | 「已踩过的坑」表 + 决策记录 |
三处值得展开。
① 禁区按风险划,不按目录划。 判据是「是否影响线上站点与后端」。于是页面产物(几百个 HTML)可以自由改,沙箱执行器(一个文件)必须请示——虽然前者文件多得多。
② 范围校验要能被断言。 「不要顺手改别的」写在提示词里等于没写。把它变成一个比对脚本:
import hashlib, pathlib, subprocess
REL = "docs/ai/harness/guardrails.md"
def tail(text: str) -> str:
"""H2 之后的全部内容;H1 与首个 H2 之间才是本次允许改的区域"""
return text.split("\n## ", 1)[1] if "\n## " in text else ""
now = pathlib.Path(REL).read_text(encoding="utf-8")
old = subprocess.run(["git", "show", f"HEAD:{REL}"],
capture_output=True, text=True, encoding="utf-8").stdout
print("越界" if tail(now) != tail(old) else "范围 OK")
跑起来只有两种输出:
范围 OK
越界
③ 敢删工具。 本站最早用 VitePress 构建,263 章规模下峰值内存 1652 MB,2 GB 的服务器跑不动,只能本机构建再传。后来换成自研 Python 脚本,峰值降到 52 MB——然后把脚本也删了:产物直接入库、直接编辑,服务器 git pull 即部署,回滚即 git revert。判断标准很朴素:工具的维护成本超过它节省的成本,就该删。
人工闸门拦的是哪些动作——判据是「出了错能不能靠再跑一次校验 / git revert 恢复」:git commit / push(进入共享历史)、改写历史类(force-push、rebase 已推送分支)、生产服务器任何写操作、禁区代码(沙箱执行器)、门禁规则改动、批量删除、敏感信息写入、供应链引入(装公开 skill、加依赖)。人只出现在「写历史、碰线上、改规则、进外部代码」这四类位置上;其余一切,脚本是评审,Git 是后悔药。
6.7 敏捷:七步的来路
本项目不引入 Scrum,但七步几乎每一步都能对回敏捷的老结论,差别只在周期:敏捷团队两周一个 Sprint,单人 + AI 把同样的循环压到半天到一天。
| 敏捷宣言原句 | 本项目的形态 |
|---|---|
| 个体与交互 重于 流程与工具 | 人只出现在 commit / push / 服务器写上,其余交给脚本 |
| 可工作的软件 重于 详尽的文档 | 完成定义 = 脚本通过 + 新端点取证,不靠「文档写了」 |
| 客户合作 重于 合同谈判 | 单人项目里「客户」是未来的自己和读者,需求进批次排队 |
| 响应变化 重于 遵循计划 | 构建器跑不动,当天转向,随后连脚本一起删 |
一个「迭代」在这里叫「一批」:8 章 / 2~5k 行 / 30~60 文件,一次会话能覆盖;批内跑完 写作 → 生成 → 校验 → 提交 → 部署,不留半成品;同时只开一条战线(WIP = 1)。
仪式可以删,反馈不能丢:
| 仪式 | 承担的功能 | 替代品 |
|---|---|---|
| 每日站会 | 暴露阻塞、同步进度 | AGENTS.md + 批次表状态列 |
| Sprint 评审 | 交付物可验收 | 校验脚本 + 单测出结论,不靠口头汇报 |
| 回顾会议 | 教训变成改进项 | 踩坑表、决策记录逐条追加 |
| 结对编程 | 第二双眼睛 | 范围校验 + 反向验证当评审 |
| 故事点估算 | 控制批次大小 | 章数 / 行数 / 文件数这类可数指标 |
原则:删仪式的前提是每一次反馈都有文件承接。 没有承接的删减,等价于取消反馈。
6.8 十个失效点
| 阶段 | 失效点 | 为什么危险 | 对策 |
|---|---|---|---|
| 内容 | 幻觉链接、过期版本号 | 看起来对,点开 404 | 版本政策 + 外链可达性探测 |
| 内容 | 批量生成风格漂移 | 写到第 50 章开始自创结构 | 模板 + 结构校验脚本 |
| 内容 | 示例代码没跑过 | 读者复制就报错 | 代码块抽成可下载包,倒逼可运行 |
| 代码 | 改了不该改的地方 | 正确但越界,评审看不出来 | 范围校验(见 6.6 ②) |
| 代码 | 一处失败拖垮全局 | 小机器最怕雪崩 | 降级局部化:一个模块挂只影响自己 |
| 安全 | 「已经加固了」 | 自我评价不可信 | 反向验证:主动攻击并断言被拦住 |
| 资源 | 账算到「大概够」 | 峰值一来就 OOM | 逐项列预算,参数级下调 |
| 资源 | 产物不是字节确定 | 每次发布几百个假 diff | 固定时间戳,内容不变则产物不变 |
| 协作 | 假绿 | 自检全绿但跑的是旧代码 | 请求只有新版才有的端点 |
| 协作 | 环境杂活 | 每次都重新踩 | 踩坑表:现象 + 解法 + 为什么误判 |
「假绿」值得单独说。本项目真实发生过一次:部署脚本静默跳过后端重启,代码已经 pull 到最新,进程还是在跑旧的——而所有健康检查依然返回 200。事后定的取证法是:
# 自检全绿 ≠ 新代码在跑:问一个只有新版才存在的端点
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8900/api/admin/analytics/events
401
401 = 新代码生效;404 = 旧进程还在跑。验收要证明「新东西在跑」,不是「服务活着」。
还有一类隐性失效点不属于技术:把自动化当免费。让 IM 机器人端到端干活(读仓库、改文件),实际回合变多、上下文重传,token 翻倍而产出不变——应分层(见 6.4.1)。
6.9 什么时候这套不成立
诚实地说,这套流程有明确的适用边界:
| 场景 | 为什么不适用 | 该换成什么 |
|---|---|---|
| 想找「最佳实践」 | 本文是资源下限处的探针,不是标杆 | 常规工程实践(CI、代码评审、多环境),再回头对照哪些做法仍然必要 |
| 多人并行改同一批文件 | 人工闸门变成瓶颈 | 代码评审 + CI,并恢复站会 / 评审 / 回顾 |
| 需要在线服务 SLA | 产物入库 + git pull 太慢 |
蓝绿发布 / 回滚编排 |
| 需要真实性能调优 | 校验脚本管不了延迟 | 压测 + 观测 |
| 模型能力已足够强 | 保护机制变成纯开销 | 按 5.7 节审一遍,删掉多余的层 |
资源约束变了,流程也要跟着变。 第 5 章那句「Harness 的每个组件都编码了一个假设」在这里同样成立——假设是「这个模型 / 这台机器 / 这个人做不到」,假设不成立了,组件就该撤。
动手改
- 给项目列一张资源账:机器多少、谁在维护、上下文怎么续——三项各写一个数字,再写一条由它推出的「不做清单」
- 把花销也算成数字:服务器年费、模型月费、哪些设备算沉没成本不算项目支出。写不出来,说明「省钱」还只是感觉
- 给自己站点的首页和常见博客各列一张对比表:站点形态、内容生产、运行资源、维护投入——差异最大的那一维,就是你的流程最该改的地方
- 挑一条你反复叮嘱的规则(「不要改 X」「记得更新 Y」),把它变成校验脚本,报错里带修复方法
- 如果接了 IM / 手机入口,先给它划边界:对话与调度一层、执行一层,仓库上下文不要进聊天窗口
- 想从零建个站?按 6.5 的时间轴走:第 0 批只写规矩,第一批只求「手机能打开」,第二个专题手做、第三个才写生成器
- 找一个「自检通过」的部署流程,补一条只有新版才成立的探针,确认它能区分新旧
小结
- 先交代样本身份:这是一个特点鲜明的个人教程博客——零框架、AI 批量生产、2C2G、单人业余,还是它自己教程的实验台
- 定位要诚实:资源极限低的探索探的是下限,不是最佳实践
- 资源要拆成三本账:机器、注意力、上下文;约束写成数字,成本也写成数字(首年约 1287 元)
- 工具按「吃不吃长上下文」分工:主力执行、辅助调度、兜底只写文档;额度降级 opencode → openclaw → 千问
- 省 token 三层:前台与执行分层(上下文不跨界)、skill 把「怎么干」搬进文件(公开 skill 装前人工审源码)、生成器让批量产出零 token
- 人定额度档位,机器定任务去向
- 从零建站按批次走:规矩 → 最小可上线 → 生成器化 → 流水线;工具选型是迭代的产出,不是前提
- 每批的敏捷内核:结束时线上有能点开的东西,下一批比上一批更便宜
- 禁区按风险划;人工闸门只拦「写历史、碰线上、改规则、进外部代码」
- 警惕假绿:验收要证明新代码在跑,不是服务活着
- 约束变了,流程要跟着改;这套流程不是终点,是一组可被推翻的假设
下一章:综合练习,把这七步在你的项目里搭起来 🐸