你的 AI 品控规则越来越多了——但它们已经在打架了,你没看见

你的 AI 品控规则越来越多了------但它们已经在打架了,你没看见

我维护 sharp-skills 半年多,规则从 10 条膨胀到 100 条的时候,出了一个让我意外的事:不是规则的覆盖度不够,是规则之间开始互相打架。

最典型的场景是:sharp-tech-writing 有一条"MUST 给每个 API 配上可运行的代码示例",sharp-copywriting 有一条"MUST 避免代码块超过 30 行"。当一个 API 本身就需要 50 行代码才能说清楚时,这两条规则就正面冲突了。AI 出来的东西要么违反了"必须有完整代码示例",要么违反了"代码块不能太长"。

这种冲突不是语法错误,是品控规则自己内部的矛盾。如果没有一个冲突仲裁机制,规则越多,AI 越无所适从,最终的输出质量反而会下降。

这篇聊的不是怎么写规则,是规则多了之后怎么让它们不打架。

规则冲突的三种类型

我在维护过程中遇到的规则冲突,大致可以归到三类:

第一类:范围冲突------"必须 A"和"禁止 A"撞车

最直白的冲突。比如 sharp-tech-writing 早期有一条"术语首次出现时必须给出英文原文",sharp-copywriting 有一条"营销文案必须避免中英混用显得土"。两个规则都对,但合在一起,技术文档里的英文术语标识就做不出来了。

这类冲突的根源是规则没标注适用场景。一条规则如果没写"在 X 场景下生效",它就会默认在所有场景下生效,跟其他规则碰撞只是时间问题。

第二类:优先级冲突------两条规则都该执行,资源不够

比如 sharp-tech-writing 的"代码示例必须可运行"和"代码示例必须覆盖所有错误码"。两个错误码的 API,第一个规则想要"完整可运行",第二个规则想要"穷尽覆盖"。时间有限/上下文有限的情况下,AI 必须二选一。

冲突的根源是规则没声明优先级。当品控规则集大到一定程度,你没办法靠"按文件顺序"或者"按时间顺序"来决定谁先谁后------你需要一个明确的优先级机制。

第三类:语义冲突------两条规则字面对立但都对

这是最隐蔽的一类。sharp-api-design 有一条"错误码必须反映真实错误类型"(比如 5xx 是服务器错,4xx 是客户端错),sharp-presentation 有一条"演示文稿必须用通俗类比解释错误码"(比如"500 说明服务器开小差了")。两个规则的目的是一致的------让用户理解错误码。但 sharp-presentation 的"通俗类比"在严格意义上违反了"错误码必须反映真实错误类型"的精神,因为"开小差"这种类比不是真实的错误类型。

这种冲突在规则文件里看不出来,但 AI 一执行就发现两边都在跟自己说要做相反的事。

仲裁器:让规则有自己的"宪法"

解决冲突的核心思路,是引入一个规则优先级仲裁器。它不是规则本身,是规则的"宪法"。

仲裁器做的事,分三步:

第一步:场景归一化。 每条规则必须标注它适用的场景------后端 API 文档、前端组件文档、营销文案、求职简历、PPT 演示。规则不再"默认全场景生效",在某个具体场景下,AI 只需要考虑该场景的规则集。

这一步把第一类冲突(范围冲突)大幅消解了。两个规则撞车,往往是因为它们本来就属于不同场景。

第二步:优先级分层。 在同一个场景下,规则按优先级排:

  • L1 安全规则: 涉及合规、安全、隐私的规则,永远最高优先级。比如"代码示例不能出现真实密钥"。这类规则是 MUST-NEVER。
  • L2 准确性规则: 涉及事实正确性的规则。比如"技术文档引用的 API 名称必须和代码里一致"。这是 MUST。
  • L3 完整性规则: 涉及内容完整度的规则。比如"代码示例必须包括错误处理"。这是 MUST。
  • L4 风格规则: 涉及表达风格的规则。比如"代码块不超过 30 行"。这是 SHOULD,可被上下文覆盖。

同一层级的规则发生冲突,按"明确性优先"------更具体的规则胜过更通用的规则。比如"用户认证模块的所有 API 必须用 OAuth 2.0"胜过"API 鉴权方式必须符合行业标准"。

第三步:冲突可观测。 当规则冲突发生时,仲裁器必须把冲突暴露出来,而不是默默选一个。AI 应该在输出里标注"这条满足规则 A,违反了规则 B(优先级低于 A),原因如下"。人能看到决策过程,事后可以调整规则权重。

一个实战案例

最近遇到一个具体案例:用户在用 sharp-api-design 生成一份库存系统的 API 文档,其中一个 API 是"批量更新库存",涉及到批量写入。

当时触发的规则有:

  • L1:所有 API 文档必须包含鉴权说明(NR)
  • L2:所有 API 文档必须包含请求/响应示例(NR)
  • L3:所有 API 文档必须包含错误码说明(NR)
  • L4:批量 API 文档必须包含"批量大小限制"说明(NR)
  • L4:单个示例代码块不超过 30 行(NR)

如果批量更新涉及 5 个字段、3 种错误码、2 个示例,代码块加起来会超过 30 行。L4 内部冲突------一条要求"必须包含完整信息",另一条要求"代码块不能太长"。

仲裁器决策:

  1. L4 内部冲突,触发"明确性优先"。"必须包含完整信息"是 API 文档的硬要求,比"代码块不超过 30 行"更具体。
  2. 触发 L4 的兜底策略。"代码块不超过 30 行"这一条降级为 SHOULD,转而通过"将代码块拆分为多个"` 标签来同时满足两条规则。
  3. AI 输出里标注:"代码块按Step 1: 鉴权Step 2: 批量更新Step 3: 错误码拆成 3 段,每段不超过 30 行。"

这个决策过程是透明的、可追溯的。如果用户对拆分方式不满意,可以直接说"我想要完整代码块",仲裁器就会把"代码块不超过 30 行"暂时降级,等当前任务完成后再恢复。

规则的可执行性 vs 规则的相互独立性

之前写过的"规则可执行性"是规则本身的质量维度------能不能用代码检查、能不能跑出确定结果。

但今天讲的"规则优先级仲裁"是规则之间的关系维度------它们互相独立还是互相依赖、互相冲突还是互相协作。

很多人维护规则集的误区是:以为只要规则写得够清楚就够了。但规则集的复杂度不是单条规则的复杂度叠加,是规则之间的相互关系。20 条相互独立的规则,比 50 条相互冲突的规则好用得多。

sharp-skills 现在的做法是:每条规则除了内容字段外,还强制带三个元数据------scene(适用场景)、priority(优先级 L1-L4)、arbiter_hint(出现冲突时的默认处理建议)。规则文件本身用 YAML 而非 Markdown,方便机器解析,也方便在 PR 评审时检查规则元数据是否完整。

仲裁器不是规则的下属,是规则的合作者

最后想说一个认知:仲裁器不是规则的"管理者",它是规则的"翻译官"。

规则本身是静态的文本,AI 的具体上下文是动态的。同一条规则在不同上下文里的"权重"是不一样的。仲裁器的价值,是把"规则"和"当前上下文"对齐,让 AI 知道这条规则在当下"到底有多重"。

sharp-skills 的仲裁器目前是规则文件 + 一个 Python 脚本的组合,逻辑不复杂。但它让规则库从 50 条扩展到 100 条的过程中,没有出现"规则多了反而不好用"的反效果。这对我来说就是最大的胜利。

我在做一个用卡皮巴拉讲设计模式的微信小程序「爪爪代码冒险记」,23 个设计模式用漫画 + 答题的方式讲,目前正在开发中。如果你觉得这类内容有意思,搜一下「爪爪代码冒险记」,或者等我后面的文章。

相关推荐
有脚就行40 分钟前
第24篇-Go-gRPC推理服务-高性能跨语言通信
开发语言·人工智能·后端·golang
不好听61343 分钟前
NestJS 是什么?一张图看懂企业级后端的骨架
后端·nestjs
liuxiaocheng1 小时前
文本生成的进阶:generateText / streamText 里迟早会撞上的东西
前端·后端·ai编程
江小渔1 小时前
训练工程与训练平台入门33 追踪一次 TrainJob 的完整生命周期
后端
无糖可可果1 小时前
NestJS 学习分享:从工厂模式到企业级后端开发
后端
vipbic2 小时前
网站升级了,我却有点舍不得
前端·vue.js·后端
IT_陈寒2 小时前
Java Stream并行处理让我数据库崩了两次
前端·人工智能·后端
2601_963870222 小时前
【计算机毕业设计】基于Spring Boot的考研信息交流平台的设计与实现
java·spring boot·后端
大模型丫丫2 小时前
Spring Boot 入门指南:从零开始构建你的第一个应用
java·spring boot·后端