bml.asia · 纯文字 · 写写停停

让 AI Agent 自主规划并运行一整夜的项目:从幻想走向工程现实

  提到 AI,很多人的印象还停留在"问答机器":你问一句,它答一句,答完还得你亲自验证、亲自执行。这个印象在两年前勉强成立,到今天已经彻底过时了。现在真正有意思的玩法,是把一个大型项目丢给 Agent,让它自己拆解任务、自己写代码、自己跑测试、自己修 bug——然后你去睡觉,第二天早上收获一个能跑的成品。这不是演示视频里的未来,而是当下就能跑通的工程实践。前提是,你得用工程师的方式去搭建它,而不是用许愿的方式去使用它。

一、为什么有些项目必须让 AI"开夜车"

  答案藏在三类任务的共性里:耗时、高频试错、无人值守友好。

  第一类是纯耗时型。比如把一个几万行的老代码库从 Python 2 迁到 Python 3,或者给一个裸奔多年的项目补齐单元测试。这类工作没有任何智力上的悬念,只有体力上的绝望——人类做,是以"天"为单位磨;Agent 做,是以"分钟"为单位推。第二类是高频试错型。重构、依赖升级、性能调优,本质都是"改一下、跑一遍、看结果"的循环,循环次数动辄成百上千。人类在这种循环里会疲劳、会烦躁、会在凌晨两点把 rm -rf 敲错目录;Agent 不会,它的第一千次尝试和第一次一样精确。第三类是夜间窗口型。全网爬取与调研、批量内容生成、持续集成的长尾修复,这些活天然适合在没人盯着的时候跑。白天你的注意力是稀缺资源,晚上你的机器算力在空转——把两者错峰匹配,就是"挂机流"的全部秘密。

二、让 Agent 跑一整夜的核心三要素

  “让 Agent 跑一整夜"不是一句咒语,而是一套架构。拆开看,核心就三件事。

  第一,大任务拆解成子任务。“把这个项目重构完"不是任务,是愿望。Agent 能执行的,是"把 utils/parser.py 里的正则引擎替换成标准库实现,并保证现有 47 个测试全绿"这种粒度。所以架构的第一层是规划器:把大目标拆成一张带依赖关系的子任务图,每个节点有明确的完成标准和验证方式。拆解质量直接决定整夜的成活率——拆得太粗,单步失败无法定位;拆得太细,Agent 会在任务切换的缝隙里浪费大量 token。经验值是:每个子任务控制在"一次会话能完成、一次验证能确认"的规模。

  第二,内置沙箱与编译器充当"裁判员”。这是整个体系里最容易被忽视、却最致命的一环。Agent 敢于自主决策的前提,是它每一步都能拿到客观的反馈信号:编译过没过、测试绿没绿、lint 干不干净。这些信号不需要人类主观判断,机器自己就能读。换句话说,编译器和测试套件是裁判员,Agent 是运动员,你要做的只是在赛前定好规则。凡是验证信号清晰的任务(代码、数据、配置),Agent 就能跑得又快又稳;凡是依赖"人类品味"的任务(视觉设计、文案调性),夜里跑出来的东西大概率第二天要返工。所以无人值守的第一原则是:只把有客观裁判的环节交给 Agent。

  第三,错误自主回滚与重试。整夜运行意味着一定会出错,问题不是"会不会挂”,而是"挂了之后怎么办"。工程答案很朴素:用 git 做安全网。每个子任务开始前打 checkpoint,验证失败就回滚到上一个绿色状态,换一条路径重试。再配上指数退避防止把 API 打爆,配上重试上限防止无限烧钱,配上失败隔离让单个子任务的崩溃不污染整个任务图。这套机制没有任何黑魔法,全是分布式系统几十年攒下的老智慧——只不过这次套在了 Agent 身上。

三、三个真实落地场景

  场景一:老旧代码库的通宵现代化重构。晚上十一点,把任务描述写进 issue:“将这个 2015 年的 Django 项目升级到最新 LTS,Python 3.12,所有测试通过,输出变更报告。“Agent 会先通读代码库建立心智模型,然后按"依赖升级 → 语法迁移 → API 替换 → 测试补齐"的顺序拆解执行,每完成一步跑一次全量测试,失败就回滚重试。第二天早上,你面对的不是一堆报错,而是一份带完整 diff 和决策日志的 PR,人类只需要 review 关键路径。原来预估三周的活,一夜跑完八成,剩下两成是真正需要人类判断的硬骨头。

  场景二:全网深度调研与万字白皮书。“调研今年国内 Agent 框架的竞争格局,产出一份 1.5 万字的白皮书。“这种任务人类做要两周,Agent 做一晚上:先拆出信息采集清单(官方文档、论文、GitHub 趋势、行业报告),并行爬取与摘要,交叉验证数据口径,再按大纲分章节填充,最后统一文风与引用格式。产出质量当然比不上领域专家的深度洞察,但作为决策前的信息底座,它的性价比碾压人工——尤其当你第二天就要拿它去做汇报的时候。

  场景三:这个博客本身。你现在读到的这个站点,就是"Agent 自主规划"的产物。我只给了几句模糊的偏好:纯文字、中文排版舒服、能搜索、能订阅。Agent 自己选了 Hugo,自己规划目录结构,自己调主题模板,自己写搜索索引和部署脚本,自己踩了 CJK 字数统计和时区的坑又自己填平(这段经历在第一篇文章里写过)。整个过程断断续续跑了几个"夜晚”,我做的只是每天早上看结果、提意见。这篇文章,也是这个闭环的一部分。

四、避坑指南:Agent 为什么会在夜里"精神崩溃”

  血泪教训必须跟上。Agent 在夜里崩溃的三种典型姿势,我都见过。

  死循环。Agent 卡在同一个错误上反复尝试:改一行、跑测试、失败、再改一行、再失败……到早上 token 烧掉几十万,进度为零。防范手段是循环检测:给每个子任务记录错误签名,相同签名连续出现 N 次就熔断,把任务标记为"需要人类介入"并跳到下一个子任务。宁可早上留三个没做完的任务,也不要一个烧穿预算的死循环。

  上下文丢失。跑到凌晨三点,上下文窗口被中间产物塞满,Agent 开始忘记最初的目标,把"重构项目"悄悄漂移成"给某个函数写注释”。防范手段是外部记忆:把任务清单、当前进度、关键决策写进磁盘上的状态文件,而不是依赖模型自己的记忆。每个子任务用干净的上下文冷启动,先读状态文件再干活。上下文是易失的,磁盘是永恒的——这是所有长时程 Agent 的第一课。

  幻觉放大。最阴险的一种。Agent 在第二步做了一个错误假设(比如"这个函数返回 None 表示成功”),后续二十步全部建立在这个假设上,直到某一步测试爆炸,而它已经忘了假设是从哪来的。防范手段是关键节点强制验证:假设必须落地为断言或测试,每个子任务结束时跑一次全量验证,让错误在萌芽期暴露,而不是滚成雪球才崩盘。

  说到底,“让 Agent 跑一整夜"考验的不是模型的智力,而是你的工程能力:任务怎么拆、裁判怎么设、失败怎么兜。这三件事做扎实了,模型就是流水线上不知疲倦的工人;做不扎实,再强的模型也只是烧钱速度更快的随机数生成器。

五、结语:从执行者到总架构师

  往后看,这件事的意义会越来越清晰。当 Agent 成为你的"赛博打工人”,人类的角色不会消失,但会彻底换位:从执行者变成总架构师。你的核心竞争力不再是"会写代码",而是"知道该让机器写什么代码、怎么验证它写得对不对、出错了怎么兜底"。定义问题、划清边界、设定验收标准——这些是新的手艺,也是旧的智慧。夜里机器跑它的,你睡你的;早上醒来,你 review 它的产出,像总架构师 review 下属的方案一样。

  这种分工听起来像科幻,做起来像运维,但用起来,是真的香。