上一篇:不会还有人拿「感觉变好了」当改进吧?基线不在,改进不算 | 效果评测与回归门槛(待发布)
不会还有人学完还觉得「感觉用上了 AI」就算落地吧?清单打分不认感觉 | 工程化终章
系列:《从 Rule 到落地:AI 工程化实践》第 27 篇
标签:AI工程化 · 验收清单 · 红线门禁 · 工程化打分
专栏:从小白到AI落地大师
序言
二十六篇走到终章。童鞋们若只带走「好像懂了」,那我们失败了。本篇给你一份可打印的工程化检查清单,并指导如何为自己的下一连载选题。不推销课程,不制造焦虑之后再卖解药——清单本身就是解药。
说句自嘲的:我也会自我感觉良好。直到有次按清单勾,安全 Rule 常驻居然空着,假绿门禁也空着。感觉不认账,勾选认账。
记住一句话:落地不用「感觉用上了」打分,用清单打分;安全 / 审核红线漏一条,总分一票清零。这份尺子不是给人扣分,是给人排优先级——先补最短板那层,再谈扩张。下面这份checklist_score.py纯标准库、复制即跑,把本篇那张 18 项清单真跑一遍打分,故意复刻序言那次「勾了 12 项却两条红线空着」的翻车现场。
概念
检查清单,按层可勾选的落地验收项。安全层未完成,则其它加分无效——这是优先级,不是打击。Lesson 闭环是否含人工审核,E2E 关键路径是否可一键跑通,SSOT 是否仍成立,都是终章要回看的钉子。
可以理解为:毕业答辩不看你收藏了多少篇,看你仓库里钉牢了哪些钉子。钉子够,房子才算立住。
打分不是「勾了几项除以总数」。红线是闸门,普通项才是分数:
普通项漏了,是进度问题,补上就涨分。红线漏了,是放行问题,分数直接归零。两件事不要混进同一个「完成度百分比」。
问题在哪
学完系列最常见三种飘。第一种,概念都会讲,仓库无交付物。第二种,工具很多,审核与安全空着还加速裸奔。第三种,急着开下一连载,本系列清单没勾完。选题可以超前,验收不能超前。
举例
主线回顾:规则 → 技能 → 协议 → 记忆 → 测试,回看第 3 篇站牌。检查清单摘录,请完整拷进仓库改:
# AI 工程化落地检查清单 ## 约束 - [ ] 常驻安全 Rule 已入库且可演练 - [ ] 硬约束可判定;建议另册 - [ ] 加载顺序与场景路由写明 ## 技能与 Pack - [ ] 至少 1 个 Skill 带正反例与报告模板 - [ ] Commands/Manifest 可发现可消歧 - [ ] Pack 有 SSOT 与锁版本 ## 协议与 Agent - [ ] MCP 工具有风险分级;默认 dry-run - [ ] 鉴权、熔断、审计字段齐全 - [ ] Agent 入口有启动清单与停靠点 - [ ] 审核门禁只审不写 ## 记忆与测试 - [ ] lesson 闭环含人工审核与黑名单 - [ ] 召回克制并过滤过期 - [ ] 关键路径 E2E 可一键跑 - [ ] 红灯可生成草稿 lesson;禁止假绿自动修 - [ ] 失败归档含关联 id - [ ] 记忆注入有三道闸:脱敏、审批、元指令黑名单 - [ ] 记忆与用户规则有冲突裁决;误报不阻断已审批项 - [ ] 效果指标有版本化基线与回归门槛;降基线走 PR清单写在这儿,谁来打分?把序言那句「感觉不认账,勾选认账」做成能跑的尺子——打分逻辑十几行就能写死,红线规则也写死在里面,不给人情分留缝。
完整可跑:checklist_score.py
# checklist_score.py —— 终章:清单打分,感觉不认账、勾选才认账。安全/审核红线漏一条 = 总分清零# 纯标准库,复制即跑。用法:python checklist_score.pyfromdataclassesimportdataclassfromcollectionsimportOrderedDict PASS_BAR=12# 满分为勾选项个数;红线全过且 >= PASS_BAR 才谈扩张@dataclassclassItem:text:strlayer:strchecked:boolredline:bool=False# 安全 / 审核红线:漏一条,总分直接判 0CHECKLIST=[Item("常驻安全 Rule 已入库且可演练","约束",checked=False,redline=True),# 序言里那处「居然空着」Item("硬约束可判定;建议另册","约束",checked=True),Item("加载顺序与场景路由写明","约束",checked=True),Item("至少 1 个 Skill 带正反例与报告模板","技能与Pack",checked=True),Item("Commands/Manifest 可发现可消歧","技能与Pack",checked=True),Item("Pack 有 SSOT 与锁版本","技能与Pack",checked=False),Item("MCP 工具有风险分级;默认 dry-run","协议与Agent",checked=True),Item("鉴权、熔断、审计字段齐全","协议与Agent",checked=True,redline=True),Item("Agent 入口有启动清单与停靠点","协议与Agent",checked=True),Item("审核门禁只审不写","协议与Agent",checked=True,redline=True),Item("lesson 闭环含人工审核与黑名单","记忆与测试",checked=True,redline=True),Item("召回克制并过滤过期","记忆与测试",checked=True),Item("关键路径 E2E 可一键跑","记忆与测试",checked=True),Item("红灯可生成草稿 lesson;禁止假绿自动修","记忆与测试",checked=False,redline=True),# 又一处红线空着Item("失败归档含关联 id","记忆与测试",checked=True),Item("记忆注入有三道闸:脱敏、审批、元指令黑名单","记忆与测试",checked=False),Item("记忆与用户规则有冲突裁决;误报不阻断已审批项","记忆与测试",checked=False),Item("效果指标有版本化基线与回归门槛;降基线走 PR","记忆与测试",checked=False),]defscore(items):hit=sum(1foritinitemsifit.checked)broken=[itforitinitemsifit.redlineandnotit.checked]total=0ifbrokenelsehit# 红线未勾 -> 一票清零,不是扣分returnhit,total,brokendefmain():hit,total,broken=score(CHECKLIST)print("== 逐层勾选 ==")layers=OrderedDict()foritinCHECKLIST:layers.setdefault(it.layer,[]).append(it)forlayer,itsinlayers.items():done=sum(1forxinitsifx.checked)marks="".join("x"ifx.checkedelse" "forxinits)print(f"{layer:8}{done}/{len(its)}[{marks}]")print(f"\n== 打分 ==")print(f" 勾选项 :{hit}/{len(CHECKLIST)}")print(f" 红线未勾 :{[b.textforbinbroken]or'无'}")print(f" 总分 :{total}"+(" <- 安全/审核红线漏一条,一票清零"ifbrokenelse""))print(f"\n== 优先级 ==")ifbroken:print(f" 感觉分{hit}分也没用,先补这{len(broken)}条红线,再谈 12 分及格线(当前红线全过也才{hit}分)")forbinbroken:print(f" · [{b.layer}]{b.text}")eliftotal<PASS_BAR:print(f" 红线全过,但{total}<{PASS_BAR}:补最短板那层,别急着扩工具")else:print(f" 红线全过且{total}>={PASS_BAR}:可以谈扩张与下一连载选题")if__name__=="__main__":main()上面那份 18 项清单,checked直接抄你仓库当前真实状态即可。这里故意复刻序言那次翻车:勾了 12 项、看着挺体面,偏偏两条安全/审核红线空着;末尾三项是本轮新并入的三篇(三道闸、冲突裁决、回归门槛)——玩具仓还没补上,全空着,正好给你看「清单长胖后分数会自动下沉」是什么体验。
跑起来长这样
python checklist_score.py,真实输出原样贴上(·后为终端里本该连写的整行,此处未改写):
== 逐层勾选 == 约束 2/3 [ xx] 技能与Pack 2/3 [xx ] 协议与Agent 4/4 [xxxx] 记忆与测试 4/8 [xxx x ] == 打分 == 勾选项 : 12/18 红线未勾 : ['常驻安全 Rule 已入库且可演练', '红灯可生成草稿 lesson;禁止假绿自动修'] 总分 : 0 <- 安全/审核红线漏一条,一票清零 == 优先级 == 感觉分 12 分也没用,先补这 2 条红线,再谈 12 分及格线(当前红线全过也才 12 分) · [约束] 常驻安全 Rule 已入库且可演练 · [记忆与测试] 红灯可生成草稿 lesson;禁止假绿自动修输出你看什么
- 12 与 0 的落差,就是本篇的全部论点:勾选项明明 12/15,
score()却把总分拍成0。total = 0 if broken else hit这一行,把序言「感觉不认账,勾选认账」钉死成代码——安全 / 审核红线不参与「扣分」,只参与「一票清零」。 - 清零的两条正是序言自曝的那两处:
常驻安全 Rule 已入库且可演练、红灯可生成草稿 lesson;禁止假绿自动修。自嘲不是白说的,它精确对应红线未勾那行的两个元素。 - 逐层
[xx ]比分数更早暴露短板:协议与Agent 4/4全勾,约束和记忆与测试各漏一个且都漏在红线上。先补最短板那层,优先级反了就是「先补炫酷工具、安全空着裸奔」。 - 红线全过也才 12 分,刚好卡在及格线:
优先级那句提示——先把两条红线勾上(hit会涨到 14),再拿它比PASS_BAR=12。别在红线漏勾时谈「12 分以下先补最短板」,那话术是给已过关的人说的。
把「感觉分 12」和「门禁分 0」并排放开,比再讲一遍口号有用:
| 状态 | 勾选项 | 红线未勾 | 总分 | 下一步 |
|---|---|---|---|---|
| 序言那次翻车 | 12 / 18 | 2 条 | 0 | 先补安全 Rule 与假绿禁令 |
| 只补上这两条红线 | 14 / 18 | 无 | 14 | 已过 12 分线,再补 Pack / 三道闸 / 基线 |
| 红线全过但普通项只勾到 11 | 11 / 18 | 无 | 11 | 不许谈扩张,补最短板那一层 |
第二行不是另写一套程序。checked=True把那两条红线勾上之后,broken变成空列表,total = 0 if broken else hit就不再清零,hit从 12 涨到 14。14 已经大于PASS_BAR。
14 不是满分。还空着 4 项:Pack 的 SSOT,加上末尾三项(三道闸、冲突裁决、回归门槛)。这 4 项都不是红线,所以总分停在 14,意思是「可以开始补效率项」,不是「仓库已经钉完」。
第三行用来挡住另一种自欺:红线都勾了,就拿一个 11 分的仓库去开下一连载。红线全过只取消清零,不自动发放扩张许可。
打分与改进优先级请记牢:安全与审核层任一红线未勾,总分记 0——这是优先级,不是打击。12 分以下,先补最短板那层,再谈扩张。下一连载选题:选有真实仓库对照的主题;层层递进;同样脱敏。数据库向连载可作姊妹篇,另建目录,题眼示意——为什么 SQL 也会聊崩、方言差异地图、规则包如何约束迁移——只给题眼不展开。方法可复制:主线、脱敏、项目对照。
本系列每篇都劝你「把最小示意落成真实文件名」。二十六篇攒下来,玩具仓(虚构 acme)的完整目录树长这样——这就是终章的交付物:
acme/ # 玩具仓:周末两小时可复现的最小闭环 ├── BOOT.md # 第16篇:入口手册(启动/停靠点/禁止) ├── rules/ │ ├── 00-safety.always.md # 第4-5篇:常驻安全内核 │ └── 06-adaptor.routing.md # 第5篇:场景路由,按意图加载 ├── skills/ │ └── fix-parse/ │ ├── SKILL.md # 第7-9篇:步骤 + 正反例 + 报告模板 │ └── references/escape.md ├── commands/manifest.yaml # 第8篇:意图路由与消歧 ├── mcp/ │ ├── ops-gate/ # 第12-14篇:三工具 + 鉴权 + 熔断 │ │ ├── server.py │ │ └── policy.yaml # T1-T4 风险分级 │ └── memory-boot/ # 第18-19篇:捕获 / 审核 / 召回 │ ├── lessons/ # front-matter 见第18篇,状态机见第19篇 │ └── recall.py # 打分召回:floor + top_k + token 预算 ├── cases/ │ ├── schema/case.schema.yaml # 第23篇:不合 schema 拒跑 │ ├── adapt_smoke_01.yaml # 应绿 │ └── adapt_forbid_no_sample.yaml # 应红:门禁必须拦住无样例变更 ├── e2e-harness/ │ ├── policy.yaml # 第24篇:required_suites / allow_flake │ └── artifacts/2026-10-13/run-001/ # 失败归档树(meta.json 见第24篇) └── scripts/ ├── probe_mcp.py # 第15篇:握手探针,三层体检 ├── boot_lint.py # 第16篇:入口文件五段完整性 ├── gate_score.py # 第17篇:风险打分门禁 ├── mask_gate.py # 第21篇:注入三道闸(脱敏→审批→黑名单) ├── conflict_arbiter.py # 第22篇:三类冲突检测 + 三选一裁决 ├── red_to_lesson.py # 第25篇:红灯 → 草稿 → 人审队列 ├── eval_gate.py # 第26篇:宏 F1/分层门槛/基线 diff 多刹车 └── checklist_score.py # 第27篇:清单打分,红线漏一条总分清零对着这张树回看:每一层都能在某篇正文里找到对应片段。周末两小时的搭建顺序也给你排好——按依赖走,不按章节序:
1. Rule 层(30 分钟):rules/ 两份 + BOOT.md + boot_lint.py 进 CI 2. 测试层(20 分钟):cases/ 两条 YAML(应绿+应红)+ schema 3. MCP 层(40 分钟):ops-gate 三工具 + policy.yaml,probe_mcp.py 验通 4. 记忆层(30 分钟):memory-boot + lessons/ 空库,screen_draft.py 安检 5. 闭环验证(10 分钟):跑一次应红用例,看 lessons/pending/ 是否多出一条草稿第 5 步是终验:应红用例红灯 →red_to_lesson.py出草稿 → 待审队列能看见。这条链通了,第 19 篇的闭环就不是插图,是你仓库里的活物。
自检
把上面清单认真勾一遍。再问两句。第一,若只能补三项,是否都落在安全与审核?若你先补炫酷工具,优先级还是反的。第二,你能否用同一大纲模板开一个姊妹连载目录骨架?能,方法就内化了;不能,先把本系列一站的最小交付物做实。
终章不是终点,是你仓库的体检日。建议每季度重勾一次清单——漂移会回来,体检要定期。
把清单打印也好、钉在 README 也好,关键是有人追问输出。没人追问的清单,两周后会变成装饰。
反模式速查(半页)
| 反模式 | 一眼症状 | 先改哪 |
|---|---|---|
| 全家桶 alwaysApply | 上下文爆、关键约束反而被挤掉 | 常驻只留安全内核,其余场景路由 |
| 「尽量注意」当 Rule | 无法判定,演练永远假绿 | 改成必须/禁止 + 反例 |
| 审写不分 | 同一会话又改又放行 | 审核门禁只审不写 |
| 假绿自动修 | 红灯被脚本静音 | 禁止自动消红;只允许生成 lesson 草稿 |
| 口头豁免 | 「这次特殊」从不入库 | 写成显式例外条款或拒绝 |
| 多处拷贝 Rule | 三处改两处 | Pack + SSOT + 锁版本 |
终章用法:先勾安全与审核,再勾效率项。清单每季度重勾一次;漂移会回来,体检要定期。
姊妹选题只点题眼,不动笔:方言差异地图、迁移规则包、SQL 也会聊崩的现场。方法复制本系列:主线、脱敏、仓库对照、清单验收。终章交的是尺子,不是下一门课的广告。
读到这里,不妨立刻做一个五分钟动作:打开你们仓库,找到与本篇对应的那个目录(没有就新建),把文中最小示意落成真实文件名。文件在,讨论才有坐标;文件不在,下周还会从「我们觉得」开始。第 27 篇的验收不是「读完」,是「仓库里多了一份可指出的东西」。
举例加长:季度重勾怎么开场
会前每人只带仓库链接与清单截图,不带 PPT。会中只追问未勾项的负责人与日期。会后把未勾项写成 issue。终章清单若从不进 issue,就还是墙饰。
思考
小结三句。用清单验收,比「感觉用上了 AI」可靠。安全与审核未就绪时,不要急着全自动。下一连载沿用「主线 + 脱敏 + 项目对照」即可复制成功。
清单之外还有一把更狠的尺子,送给准备开下一连载的你:价值出口错位。曾有这样一个答题工具——自持一个 LLM,检索记忆库、自己拼 prompt、自己生成答案,单元测试全绿,答案也像模像样。然后发现它基本没意义:它学到的记忆只注入它自己工具的 prompt,用户日常干活用的是宿主模型,对那套记忆毫无感知。攒了一仓库的「学问」,价值出口接在一个没人用的水龙头上。这不是 bug,是架构级定位错误,修它的办法不是打补丁,是把它拆了退回确定性:生成全部透传宿主,自己只做存储、检索、学习、注入。做减法时用三条判据——看价值出口,不看功能完成度(零件好不好 vs 机器接没接上电源);看你是否在跟宿主竞争(你的模型永远更弱,却霸占了输出端);看确定性占比(存储检索注入,确定性是优点;生成,确定性恰恰做不到)。清单勾的是「钉牢了没有」,这三条问的是「钉子钉在墙上有没有人看」。清单全绿但出口接错的仓,我见过不止一个。
可以理解为:导游图走完,钉子钉完,再出发去下一座城市。落地是制度加工具加闭环,不是单次提示词胜利。2026 年了,别再只靠会聊天证明自己——让仓库说话。
本篇为系列终章。若你要开数据库姊妹连载,可在本地 bloks 目录下另建子目录,用同一大纲模板开写。欢迎在评论区贴你勾完清单后的最短板那一层——咱们下一系列见,或在留言区继续拆。
下篇预告:本篇为终章。你的下一篇,由你的仓库最短板决定。
觉得有用的话,欢迎点赞、留言勾清单;有「感觉良好但勾不上」的瞬间,那就是成长的开始。感谢读到这里的你。
专栏:从小白到AI落地大师|《从 Rule 到落地:AI 工程化实践》