一个文档质量分类器用了这样的 prompt:“只报告高置信度的发现,评分时保守一些。“同一篇论文,跑一次评”高质量”,再跑一次评”低质量”。多次运行的一致率:47%。
换成:“当方法论缺少样本量或对照组时标记。“一致率直接跳到 94%。
同一个模型,同样的 temperature,同样的文档。唯一的变化是标准的具体程度。
模糊词为什么不行
LLM 对主观修饰词没有稳定的内部校准。“高置信度""保守""合适""专业”——这些词在不同上下文里含义不同,模型每次运行都从合理的解读中选一个。
这不是随机性,是歧义。模型在正确地处理一条模糊指令——“保守”有很多种理解方式,模型从中采样。具体标准直接消灭了采样空间:方法论有没有样本量,是或否,没有第三种可能。
数据说话
一个客服团队把模糊标准替换成具体标准,覆盖 500 条已审核的回复:
| 标准 | 多次运行一致率 | 误报率 |
|---|---|---|
| ”检查回复是否合适” | 52% | 38% |
| “标记:退款超出政策限额,或回复承诺了不可用的功能” | 91% | 7% |
具体标准让一致率提升了 39 个百分点,误报率降低了 31 个百分点。驱动一致性的是标准,不是模型。
常见模糊词及其替代
| 模糊 | 具体 |
|---|---|
| ”语气要合适" | "标记讽刺、甩锅措辞或敷衍表达" |
| "高置信度的发现" | "当方法论缺少样本量或对照组时标记" |
| "根据影响评定严重等级" | "HIGH:生产路径崩溃。MEDIUM:输出错误。LOW:外观问题" |
| "准确且仔细" | "日期用 ISO 8601 格式提取,有歧义时返回 null" |
| "确保专业质量" | "标记退款金额超过 $500 限额或回复承诺了已下线功能” |
规律很明显:用具体的、可验证的条件替换主观形容词。“专业”是观点,“超过 $500 限额”是事实。
这些方法修不了模糊标准
降低 temperature。 temperature 影响的是输出生成时的随机性,不是模型对主观词的理解。“合适”这个词在 temperature 0 和 temperature 1 下都没有一致的含义。
堆更多模糊文字。 “更准确、更仔细一些”增加了零具体性。“再检查一遍你的工作”是鸡汤,不是指令。叠加模糊修饰词制造的是更多层歧义,不是更多层精度。
多跑几次。 用一条模糊标准跑 10 次然后取平均,并不会收敛到一个一致的标准。每次运行独立地解读歧义——对主观解读取平均,得到的是不一致的平均值。
加一轮复审。 如果第一轮用模糊标准产生了误报,第二轮用同样的模糊标准会产生同样的误报。需要改的是标准,不是轮数。
分类别精度
一个包含 5 个审查类别(安全、正确性、性能、风格、文档)的流水线,不需要所有类别的标准都一样细:
- 安全: 精确触发条件带代码示例——SQL 注入模式、查询构造中未检查的用户输入
- 正确性: 具体条件——注释中声明的行为与实际代码逻辑矛盾
- 性能: 可度量阈值——处理 10K+ 元素数组的循环中出现 O(n²)
- 风格: 命名规范——变量用 camelCase,组件用 PascalCase
- 文档: 存在性检查——public 函数没有 JSDoc、缺少参数描述
每个类别用匹配其精度需求的标准。安全需要精确触发条件(零误报优先)。风格需要命名约定(轻微不一致可接受)。两者都是具体的——只是粒度不同。
这种组合同时实现了覆盖面(5 个类别)和精度(具体触发条件)。不需要为了减少误报而砍掉类别——具体标准在每个类别内部就能防止误报。
底线
如果标准里包含”合适""专业""保守""高质量""仔细""全面”这类词,又没有用具体条件定义它们的含义,结果就会不一致。把每个主观修饰词替换成可验证的条件。
一句话总结: 把每个”要合适”换成”当 X 与 Y 矛盾时标记”——主观修饰词产出 47% 一致率,具体条件产出 94%。