node --check 语法校验 → Playwright 真实浏览器断言 → 内容质检,便宜的先跑,贵的兜底。凌晨一点,批量生成任务跑完,172 个工具页齐刷刷落盘。我随手点开第 47 个——白屏,Console 一片红,Uncaught SyntaxError 刺得眼睛疼。
这就是让 LLM 裸奔量产的下场。同一段 prompt 跑两遍,一遍能上线,一遍直接炸给你看,概率论教你做人。
更阴的是静默失败:模板字符串没闭合,构建工具一声不吭,页面照样部署出去,直到用户访问那一刻才翻车。谁接盘谁被坑惨了。
语法校验:node --check file.js 只解析、不执行,任何语法层面的硬伤当场报红。
IIFE 少写一个右括号——(function(){...}() 这种货色,人眼扫十遍未必能看出来,node --check 一秒拍死。
为什么不用 ESLint?产线要的是快和确定,一个文件毫秒级出结果才是能扛住批量任务的姿势。ESLint 那套规则引擎拿来守产线,属于杀鸡上了牛刀还嫌牛刀钝。
成本几乎为零,所以它永远排第一个。便宜的道理就在这:先用最便宜的检查过滤掉最大量的垃圾,别让后面的贵工序白烧。
语法对了,页面就一定活吗?不一定。运行时炸的、DOM 空的、依赖加载失败的,node --check 一个都看不见。
真实浏览器断言:headless 起一个 Chromium,真实加载页面,然后盯三件事——
document.body.innerText.length 必须超过阈值,防止页面活着但内容是空的。document.querySelector('h1') 非空,标题都没渲染出来,SEO 等于白给。有人问:我自己开浏览器扫一眼不行吗?行,头十个页面可以。第一百个的时候你的眼睛已经是装饰品了——人肉 review 在批量场景下的漏检率,高到不敢直视。
这道的成本明显上去了,起浏览器、等渲染、跑断言,单页好几秒。所以它必须排在语法校验后面,只处理语法上活下来的那批。
第二道过了,只能说页面活着,不能说页面有价值。LLM 最擅长的就是产出一个语法完美、渲染正常、但内容是废话的页面。
长度阈值:正文低于设定字数,大概率是模型偷懒输出到一半就收工了,或者被截断了自己都不知道。
关键结构存在性:该有的块一个不能少——h1、核心要点列表、正文段落、FAQ,缺任何一块直接判 BAD。结构残缺的页面,上线就是给搜索引擎递投名状:这站没人管。
说人话就是:前两道验“代码能不能跑”,这一道验“内容配不配上线”。两码事,缺一不可。
三道闸门任何一个不过,怎么处理?我踩过坑,两种路线都试过。
人肉修补是死路:你打开废品文件,读一遍模型生成的两百行,找到那个漏掉的括号,修好,保存——五分钟没了,而且下一页还有。这不叫工程,这叫给 AI 打工。
BAD 即删才是正解:unlink 掉文件,任务打回生成队列,带着失败原因重新生成一遍。LLM 重roll一次的成本,比工程师读十分钟别人的代码便宜一个数量级。
但要有重试上限。同一个页面连续重生成 3 次还不合格,说明 prompt 或模板本身有硬伤,再roll下去就是烧 token 赌运气,这种进人工兜底桶,回头改上游。
那晚的任务:172 个工具页,批量生成 + 全量过闸。账本长这样——
node --check 拦下 19 个,全是语法硬伤,括号没闭合占大头。最终漏网多少?人工抽检 20 个加后续上线反馈,抓出 5 个漏检,漏检率约 3%。三道闸门挡住了 87.5% 的废品,约等于题目说的那个九成。
漏检的是哪类?全是内容层面的“微妙垃圾”——字数够、结构全、语法对,但读起来是车轱辘话。这就是确定性规则的天花板:它验得出坏,验不出平庸。所以别想躺赚,人工抽检这最后一道人肉闸门,砍不掉。
闸门之外我还顺手加了个兜底:上线后跑一轮站内链接巡检,扫出 404 和意外 301 一把抓。排查状态码含义的时候,直接用本站的 HTTP 状态码查询 对照,比翻文档快,CI 日志里看到一串码不用再来回搜。
Q1:有了三道闸门,是不是就能全自动无人值守了?
不能。3% 的漏检率看着小,摊到几千个页面上就是上百个平庸废品,人工抽检这道人肉闸门砍不掉。
Q2:能不能用另一个 LLM 当裁判来质检内容?
能加,但成本直接翻倍,而且裁判自己也会翻车、也会看走眼。产线先用确定性规则把 90% 的垃圾挡掉,LLM 裁判留给最后那层拿不准的疑难杂症。
Q3:每页都起浏览器跑断言,一晚几百页不会慢死吗?
单页几秒是实话,但 Playwright 可以并行开多实例,一晚的时间窗口足够跑完全量。慢不是问题,上线废品才是——时间可以买,口碑买不回来。
评论列表 (0条)