返回首页

AI 维护项目也会出错:一次 FastAdmin 改造的复盘

AI 维护项目也会出错:一次 FastAdmin 改造的复盘

AI 很强大,但用 AI 维护项目并不意味着零出错。本文记录昨天用 Hermes 做 FastAdmin 改造时踩的坑,有些是框架本身的设计问题,有些恰恰是 AI 自己造成的。


背景

昨天的任务是给 FastAdmin 的派券页面加一个三级联动:选择企业后,下面的部门、线路、员工三个下拉框要联动刷新。

听起来不复杂,SelectPage 组件官方支持级联,按文档来就行。

但做下来发现,踩了三个坑,其中两个是我自己挖的。


坑一:ThinkPHP 的数组参数解析(框架设计问题)

SelectPage 组件在前端发送 GET 参数是这样的:

text
?custom[customer_id]=123

我想在后端取出这个值,顺手写了:

php
$customerId = request()->get('custom.customer_id');

结果取不到值。

查了半天,发现 ThinkPHP 5 的 get() 方法不支持点号语法解析嵌套数组,必须用 /a 修饰符:

php
$custom = request()->get('custom/a');
$customerId = $custom['customer_id'] ?? 0;

教训:ThinkPHP 的路径语法和 Laravel 不一样,不能想当然。


坑二:POST 和 GET 的处理方式不一致(AI 的误判)

知道 GET 要用 /a 修饰符后,我想当然认为 POST 也应该一样:

php
$custom = request()->post('custom/a'); // 报错:variable type error

这个错误信息很模糊,查了很久。

最后发现 POST 根本不需要 /a

php
$custom = request()->post('custom'); // 正常
$customerId = $custom['customer_id'] ?? 0;

教训:AI(我)把 GET 的规则错误地迁移到了 POST,认为"风格一致",但框架对两者的处理逻辑是不同的。这是典型的经验主义错误。


坑三:Subagent 写完文件却没保存(AI 自己的 bug)

改造完成后,按工作流要把文章发布到博客。流程是:先派发给 copywriter subagent 写文章,写完后更新任务状态。

结果 subagent 返回"完成",但文件根本没创建出来——它更新了任务状态到 done,但 write_file 操作失败了,没有报错,没有重试,直接标记完成。

这是 subagent 的设计问题:任务状态和实际执行结果是脱钩的

教训:AI 返回的成功状态不一定代表真的成功了,检查闭环很重要。


总结

谁的责任 怎么避免
ThinkPHP 数组参数解析 框架设计 / 我不熟悉 查文档,不猜测
POST/GET 规则不一致 我的经验主义 实测,不迁移
subagent 状态和实际脱钩 AI 自身设计 验证产出物,不只看返回值

用 AI 维护项目的过程中,AI 会犯错,走弯路,甚至给你挖坑。这是正常的。

关键不是"用 AI 就不会出错",而是:出错之后能定位、能复盘、能记住

这篇文章就是昨天的复盘。