严格评审模型的发散性:如何通过规则约束而非提示词突破

副业中创业者 初级 2026/8/22 230 浏览 4 点赞 约 2 分钟

在开源项目 PlannerCritic 中,我尝试了双 LLM 协作模式:一个负责生成执行计划,另一个作为评审员进行严格审查。最初设定的目标是仅在“乱序”、“回滚薄弱”、“依赖未验证”和“不可行”四类情况下触发严格拦截(blocker),但当评审员的 system prompt 中增加了“adversarial”标签后,16 个严格目标全部被误判为人工升级,结果导致大量误报。

问题出现在评审员的审查逻辑偏离了原始设计。例如,在跨账号 VPC 对等连接方案中,回滚逻辑已明确,但评审员错误地将“还需考虑 DNS 故障回切场景”视为结构性缺陷,将其归类为 blocker,而实际上这属于完整性建议级别。在嵌入索引迁移方案中,仅凭“切换窗口可能延迟”即判定为 blocker,尽管设计文档明确标记为 warning 级别。这种发散性不仅无法避免,而且极易受到模型版本(如 GPT-3.5 或 GPT-4)、temperature 参数以及方案描述的影响。

单纯通过提示词调整(如追加“仅拦截具体缺陷”)并未改变结果,即使 30% 的完整性问题仍被错误判为 blocker。LLM 无法自动内化“严重到必须拦截”的严格边界,这种模糊性导致评审结果失控。

最终,我通过代码层面的白名单约束来解决问题。定义一个固定的 frozenset 列表 _BLOCKER_ELIGIBLE_FAMILIES,包含四类明确的 blocker 类型:“unsafe_sequencing”、“weak_rollback”、“unverified_dependencies”和“feasibility”。在评审结果输出时,如果严重级别为 Severity.BLOCKER 但 heuristic_family 不在白名单内,代码会自动降级为 Severity.WARNING。这样,即使评审员输出 blocker,也无法进入 findings 列表。

经过 92 次 strict 模式运行后,所有 advisory 类 findings 均被排除,剩下的 132 个 blocker 都符合实打实的结构缺陷或确定性门控要求。balanced 模式的通过率依然保持不变,而严格模式的拦截理由也变得准确可靠。这个实践表明,当判断标准无法转化为可枚举且可验证的规则集时,仅依赖提示词的模糊指导是无法约束模型发散的;真正的守卫在于代码层面的硬编码规则,才能确保评审结果的稳定性。

PlannerCriticLLM 评审器frozenset方案审查代码护栏

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

技
技术宅Ray 初级 2026/8/22

居然在规则层锁死就解决了?赶紧把那几条漂移的 prompt 删了,太浪费 token 了。

我也遇到过类似的问题,用双 LLM 协作模式,有个写计划的,有个评审员挑刺。我原本只想拦截四类真正的安全隐患——乱序、回滚薄弱、依赖未验证以及不可行,但评审员一看到 You are an adversarial plan reviewer 就把所有 16 个严格目标都判定为 blocker,结果全是误报。

评审员不是在找安全缺陷,而是在找“遗憾”。比如跨账号 VPC 对等连接方案,回滚逻辑写得清楚,但评审员非要说“还得考虑 DNS 故障回切场景”,这明显是完整性建议,不是结构性缺陷。又比如嵌入索引迁移方案,评审员看到切换窗口可能有延迟,就笼统地标了个 risk 当 blocker。按设计,这两类情况应该是 warning,在已知风险下放行就行。

单纯改提示词没用。即便在 system prompt 里加了 "only block on concrete defects",还是有 30% 的 completeness 问题被判定为 blocker。LLM 就是无法稳定内化“严重到必须拦截”这条界线,轻易受模型、temperature 及方案措辞影响。

最后我也用代码兜底解决了,照着你的思路加了个白名单:

_BLOCKER_ELIGIBLE_FAMILIES = frozenset({
    "unsafe_sequencing",
    "weak_rollback",
    "unverified_dependencies",
    "feasibility",
})
if severity == Severity.BLOCKER and item.heuristic_family not in _BLOCKER_ELIGIBLE_FAMILIES:
    severity = Severity.WARNING

改动后跑了 92 次 strict 目标,没有任何 advisory 类 findings 冒充 blocker。剩下的 132 个 blocker 都是实打实的结构缺陷或确定性门控拦截。这样 balanced 模式能过的依然能过,strict 模式拦截的理由也终于正确了。

这次经历让我深有感触:如果判断标准不能落地为可枚举、可校验的规则集,仅靠 prompt 里的形容词是压不住模型发散性的。frozenset 这一层守卫,才是真正的合同。

0 回复
小
小李爱学习 初级 2026/8/22

仅仅因为在提示词里加了 adversarial,模型就立刻切换到战斗模式,这种诱导实在太强。为防止它把完整性建议误判为缺陷,我在代码层加入了白名单,只让 unsafe_sequencing、weak_rollback、unverified_dependencies、feasibility 四类真正的安全问题保持 blocker,其他被评审员标记的 blocker 都会被自动降级为 warning,这样才能真正抑制模型的过度拦截。

0 回复
极
极客阿强 中级 2026/8/22

换个词能降误报?赶紧把我的评审脚本改一遍,之前报错率高得离谱——参考 PlannerCritic 里的做法,直接加个白名单兜底:

_BLOCKER_ELIGIBLE_FAMILIES = frozenset({
    "unsafe_sequencing", "weak_rollback", "unverified_dependencies", "feasibility",
})
if severity == Severity.BLOCKER and item.heuristic_family not in _BLOCKER_ELIGIBLE_FAMILIES:
    severity = Severity.WARNING

这样即便评审员瞎判 blocker,也直接降级为 warning,稳了。

0 回复

发表回复

支持 Markdown 格式