反思环怎么判定「够好了」:模型自评还是代码硬校验?
简化版
先看判据能不能写成代码。能用确定规则判断的,一律代码硬校验:预算有没有超、时间有没有重叠、字段有没有缺、测试有没有过,代码判定可复现、零调用成本、能按规则编码落库和统计。只有需要理解语义的判断才交给模型:资料能不能回答问题、答案是否有依据、表述是否含糊。让模型当判定者时,要把它约束得像一个「函数」:输出只允许两个词或一个固定结构,温度定为 0,解析时容忍多余的字,结论落库可统计,并用人工抽样检查它的判定准不准。常见的组合是代码先判硬约束、模型再判软约束,两层都有轮数上限,到上限按规则收尾,而不是无限转下去。
详细版
| 维度 | 代码硬校验 | 模型自评 |
|---|---|---|
| 适用判据 | 可计算:数值阈值、时间冲突、字段完整性、测试结果 | 需要语义理解:相关性、有无依据、是否含糊 |
| 稳定性 | 同一输入永远同一结论 | 可能波动,要靠温度 0 和输出约束压住 |
| 成本 | 几乎为零 | 每次判定一次模型调用 |
| 可解释 | 能点名到具体条目和数字 | 需要要求模型给出结构化问题清单 |
| 可统计 | 按规则编码天然可分组 | 自由文本难分组,要限定枚举 |
| 风险 | 规则覆盖不到的问题判不出来 | 误判、判定被产出里的内容影响 |
推荐顺序:
1. 代码判硬约束(可计算、确定)→ 不过:带着具体问题重做
2. 模型判软约束(语义) → 输出限定为枚举 / 结构,温度 0
3. 两层都有上限 → 到上限按规则交付或交人工
完整版教学
一、「够好了」到底在判什么
反思环(生成 → 评判 → 不合格就改)能不能收敛,全看评判这一步。评判要回答的其实是两类问题:
硬约束:违反了就一定不合格,能算出来
总花费 4600 元 > 预算 4000 × (1 + 5%) = 4200 元 → 超预算
第 2 天游玩 660 分钟 > 上限 540 分钟 → 超时长
软约束:需要读懂内容才能判断
这段资料能不能回答用户的问题?
这句结论在资料里有没有依据?
硬约束交给模型判是浪费,而且判不稳;软约束写成代码又写不出来。所以第一步是把判据分成两堆。
二、为什么硬约束一定要用代码
让模型自己看一遍产出说「有没有问题」,有三个毛病:
| 毛病 | 表现 |
|---|---|
| 不稳定 | 同一版产出问两次可能得到不同结论,反思循环变成随机扰动 |
| 难落库 | 「超预算了」这句话要变成规则编码、严重度、关联到哪一条,解析本身又是一次不可靠的调用 |
| 难统计 | 看板要按问题类型排行,模型自由写出来的描述凑不出稳定的分组口径 |
代码校验每条规则只查库、只算数,命中时生成一条带规则编码、严重度和具体数字的问题记录。这些记录既能直接变成下一轮的修改要求,又能长期统计「哪类问题最常出现」,反过来改进生成的提示词。
记忆钩子:能算的别让模型猜,要读懂的才交给模型。
三、让模型当判定者时,把它约束成函数
语义判断只能交给模型,这时要尽量让它的行为可预测:
输出约束:只允许回答「相关」或「不相关」,不要输出其他内容
→ 解析只需一次字符串判断,输出两个字的 token 成本可以忽略
温度: 0 → 同一段资料反复问,结论一致,链路行为可复现
解析: 按包含关系判断,容忍模型多说几个字;先查否定词
「不相关」里包含「相关」,先查「不相关」才不会误判
留痕: 原始回复和解析后的结论都记下来,出问题时分得清是模型判错还是解析错
如果判定需要给出具体问题(而不只是通过或不通过),就用 JSON Schema 约束输出结构:是否通过、得分、问题清单(位置、类型枚举、描述、建议),代码读字段决定走向。
四、模型判定的结论也要被检验
模型当判定者本身会出错,需要一个校准办法:从线上判定里抽样,请人工再判一遍,算一致率:
抽样 100 条「相关性」判定,人工复核:
模型判相关、人工也判相关:58
模型判不相关、人工也判不相关:34
不一致:8
一致率 = (58 + 34) / 100 = 92%
一致率偏低时,先看不一致的样本集中在哪一类:是判定标准写得含糊,还是资料本身模棱两可。前者改判定提示词,后者考虑把这类情况交给人工。
五、两种判定怎么组合
实际系统里常把两者串起来:
| 层 | 判什么 | 不过怎么办 |
|---|---|---|
| 第一层:代码 | 结构完整、数值阈值、时间冲突、引用的 ID 是否存在 | 带着具体问题重做 |
| 第二层:模型 | 内容是否有依据、表述是否清楚 | 带着模型给的问题清单重做 |
| 兜底 | 到达轮数上限 | 交付最后一版 / 问题最少的一版 / 固定兜底话术 / 交人工 |
顺序上先代码后模型:代码判定快且免费,硬约束不过的产出没必要再花一次模型调用去判软约束。评判之后怎么把反馈带进下一轮,见「Reflection 和 Reflexion 有什么区别?」。
六、判定结果要能驱动下一轮
无论谁判,判定结果都要能直接指导下一轮修改。只回一个「不通过」,下一轮只能整体重来;带上位置、数字和改法,下一轮才能定点修改。代码判定天然能做到这一点:规则知道是哪一天、哪一条、超了多少。模型判定要靠结构化输出做到:问题清单里写明是哪一块、第几条、什么问题、怎么改。如果只需要一个是否结论(比如「答案有没有依据」),也要清楚这意味着下一轮拿不到具体的修改方向,只能换一种写法重试。
七、常见误区与追问
- 误区:反思环就应该让模型自己评自己。 能用规则判断的硬约束交给代码,稳定、免费、可统计;模型只判语义。
- 误区:模型判定写个提示词就能用。 要限定输出为枚举或结构、温度 0、容错解析、记录原始回复。
- 误区:解析模型结论用字符串完全相等就行。 模型常多说几个字,要按包含关系判断,并先查否定形式。
- 误区:模型判定是评估标准,不需要被评估。 要抽样人工复核算一致率,校准判定提示词。
- 误区:判不过就一直重试。 两层判定都要有上限,到上限按规则收尾。
- 追问:只返回「通过 / 不通过」有什么代价? 下一轮拿不到具体修改方向,只能整体换一种写法,收敛更慢。
- 追问:代码规则覆盖不到的问题怎么办? 用模型判定补充语义层,或者把高风险的剩余情况交给人工确认。
八、加强记忆
判定「够好了」记「能算的用代码、要读懂的用模型」:硬约束(阈值、冲突、完整性、测试)代码只查库只算数,稳定、零成本、按规则编码可落库可统计,模型自评有不稳定、难落库、难统计三个毛病。语义判断交给模型时约束成函数:只许输出两个词或固定结构、温度 0、按包含关系解析且先查否定词、原始回复和解析结论都记。模型判定也要抽样人工复核算一致率。组合时先代码后模型,判定结果要带位置和改法才能驱动下一轮,两层都设上限、到上限按规则收尾。
项目实战落地
项目里怎么做的
《AI Agentic RAG高级企业知识库平台》的 Agentic 问答有两个判断需要理解语义,都交给模型:
- 相关性评分:模板
CONTEXT_GRADE要求模型判断召回的资料能不能回答问题,「只回答”相关”或”不相关”,不要输出其他内容」; - 幻觉校验:模板
HALLUCINATION_CHECK要求判断答案是不是完全由资料支撑,只回「有支撑」或「无支撑」; - 温度定为 0:模型工厂把温度默认给 0,检索问答、相关性判断、评分这些场景都要求结果稳定,同一个问题反复问应该给出一致的答案;
- 解析容错:按包含关系判断,容忍模型回「这段资料相关」这种多说两个字的情况;先判断「不相关」不在回复里,再判断「相关」在回复里;
- 有上限:判定不通过会回到改写或重新生成,各有次数上限,超过就走兜底话术。
《AI Agent旅游行程智能规划平台》的判据全部是代码:14 条硬规则只查库、只算数、不调模型,阈值来自行程规则模板、行程单预算和点位的开放信息;有任意一条「严重」、或「一般」累计 3 条及以上,这一版就不过。
为什么这样取舍
- 知识库的判定交给模型:「这批资料能不能回答这个问题」「这个答案有没有资料支撑」判的是上一步产出的质量,需要读懂内容;只让模型回两个词,解析一个字符串比对就够,输出两个字的 token 消耗也可以忽略。
- 温度必须是 0:温度高了,同一段资料这次判「相关」下次判「不相关」,整条链路的行为就不可复现,出了问题也没法排查。
- 行程的判定交给代码:让模型自己评行程,同一版问两次可能结论不同,「超预算了」这种话也难以变成规则编码落库和统计。
面试官还会追问
- 幻觉校验判为无支撑、回到生成节点重写时,生成节点拿到了什么反馈?和完整的 Reflection 有什么差别?
- 走兜底话术时,为什么要把召回的引用来源一起清空?
学完《AI Agentic RAG高级企业知识库平台》,上面这些追问你都会迎刃而解。