真实案例库:6 个用 AI 造东西的血泪复盘
前面讲的是方法,这一讲是战场。下面 6 个案例全部来自真实生产环境(我们自己运营的产品),是真用户、真账单踩出来的坑。你不用了解这些产品——看的是判断和方法。这些经验,比任何教程都贵。
案例一:一个模型名被下线,整站挂了 10 小时
发生了什么:模型名一失效,所有功能瞬间全挂——10 小时内 88 次调用全部失败。更糟的是:血流了 10 小时才被发现,因为没有任何报警,全靠用户反馈才知道出事。
根因:两个——①单点依赖:只挂一个模型名,它一变就全崩,没有任何备用;②用了随时可能被回收的 preview(预览)版模型名,而不是稳定的正式版(GA)。
案例二:让 AI 读图,它开始"鬼打墙",吐了 17 万个点
发生了什么:模型看到复杂的视觉背景,开始试图"描述纹理",吐出 · . _ 这种单字符——然后停不下来(模型的注意力自我强化,下一个字符还是同一个的概率越来越高),一页图被抽成了 17 万个中点符号。污染从 OCR 一路扩散到翻译、存储、前端,查了三天才定位。
同一个项目还踩了第二个坑:输出被长度截断后,让模型"从刚才的地方继续",结果它不听指令、直接从头重写一遍,导致前半段内容出现了两次。
案例三:删了一个"没人用的"接口,结果客户端还在偷偷调,挂了 18 小时
/polish-plus),理由是"看数据这个接口没什么流量,应该是废弃的"。
发生了什么:其实手机端(Mac/iOS)的代码里硬编码还在调这个接口。删掉后,所有润色功能静默地返回 404 失败——用户付了钱、却发现润色没效果,而且没有明显报错。18 小时后才被发现。
根因:判断"没人用"的两个证据都不可靠——"产品说废弃了"是意图,不等于客户端代码真的删了调用;后台数据"看起来少"是另一条独立路径,跟这个接口的调用量根本不对应。
案例四:找到一个原因就喊"修好了"——结果修错了
发生了什么:第一轮排查,发现一个字段命名不一致的 bug,逻辑链看起来很通,于是改了、自信地宣布"修好了"。用户一测——问题还在。第二轮才挖到真因:另一个老函数在做额度检查时,漏掉了新套餐的判断,把付费用户当免费用户拒了。第一轮修的是个真 bug,但跟用户的问题无关。
根因:看到第一个"说得通"的原因就拼出完整故事、急着下结论——却忽略了一个明显矛盾:如果真是那个 bug,界面根本不可能显示出余额数字。这个矛盾本来就是"此路不通"的信号,被无视了。
案例五:自动部署"成功"了,服务却崩了
发生了什么:服务其实在不停崩溃重启(接口全挂数小时),报错 Cannot find module './lib/llmFallback'。原来这次新增了一个文件 lib/llmFallback.js,主程序引用了它——但部署脚本的"要上传的文件清单"是写死的,没包含 lib/ 目录,于是新主程序上去了、它依赖的新文件没上去,一启动就找不到模块。
案例六:辛辛苦苦省钱,却省错了地方——97% 的成本在你没看的那一项
发生了什么:一量化才发现:整条线一天约 ¥1.4($0.20),其中 97% 的钱花在"联网探测"这一个环节(它按次收高额抓取费),而 AI 写作 + 校验加起来一天才几分钱。如果凭直觉去"优化那个看起来很贵的写作模型",累死也省不下钱——真正该动的是探测环节的频次。
6 个案例,一条主线
| 案例 | 一句话教训 |
|---|---|
| ① 单点故障 | 别押单一模型,要 fallback + 告警 |
| ② LLM 输出陷阱 | LLM 输出天生不可靠,多层防御从一开始就加 |
| ③ 删接口翻车 | 改/删任何接口前,先全局搜所有调用方 |
| ④ 调试早停 | 所有线索都要被解释,修完亲自验证 |
| ⑤ 部署假成功 | "部署成功"≠"服务正常",要真实健康检查 |
| ⑥ 成本省错地方 | 先量化成本占比,只砍大头 |