反思与自评回路
Reflection and Self-Critique Loop
PE-R-08内容已写满G02推理增强第 16 层
推理增强反思自评
一句话结论
反思要挂在外部可验证信号上,纯自评对事实性与逻辑性错误几乎无效。
本页结构(可跳转)
强度阶梯图:自评 / 独立评估 / 外部信号驱动三种反思来源的可靠性递增,与纯自评对事实性错误的失灵机制。 (本站自制)
01为什么需要它
反思让模型先评估自己刚产出的答案,再据此改写,是成本最低的一条闭环改进手段,也是 agent 从一次性作答转向可迭代作答的起点。
- 它最容易被高估:模型的自评能力通常并不优于它的生成能力,没有外部信号时,反思会沿着同一个错误走得更远,还让错结论带上更高的置信度。
- 把这一步拆成可设计、可设防的回路,才能既拿到它的增益又避开它的自欺。
适用边界
这条回路的收益主要来自外部可验证信号那一头,来自自评的那一头收益有限且有方向性风险。缺信号时应当压住轮数、把自评限定在格式与完整性这类可自查项,或改为引入独立评估者;把它当成事实核查器就是错配。回路本身也不负责告诉你改完是不是真的变好了:是否变好由评测集回答,改动是否可接受由门控脚本的退出码回答。
02机制说明
这条回路有三种强度,可靠性递增而成本也递增。
- 第一种是模型自评:它在同一段上下文里检查自己刚写的输出,几乎零额外基建,但评估者与被评估者共享同一套内部表征。
- 第二种是独立评估:换一个模型、另一段提示或另一位评审者,按事先写清的准则逐项核对;准则越具体,评估越接近可复现的检查表而不是印象打分。
- 第三种是外部信号驱动:测试是否通过、校验器是否报错、工具是否返回预期结果,结论由被测系统之外的东西说了算。
- 实践中常见的错误是把自评当成免费的质量提升:自评确实能纠正明显的遗漏、格式与自相矛盾,但对事实性错误与逻辑错误几乎无效,因为它调用的仍是产生该错误的那套表征。
- 因此稳妥的做法是让反思挂在外部信号上:凡有可执行校验的任务,先用校验结果驱动改写;只有风格、完整性与受众适配这类没有唯一正解的目标,才退回独立评估者按准则打分。
03何时该用 / 何时不该用
04实验台
promptmarkdown
查看代码
用同一段模型上下文做两段式自评,检验「纯自评」到底能改对什么。
第一段(生成):用一句话回答——「珠穆朗玛峰的海拔是多少米,测量年份是哪一年?请各给一个数字。」模型作答后原样保留。
第二段(自评):在同一个对话里追加——「你刚才的答案里有没有不确定或可能记错的地方?只指出位置并说明理由,不要给出新的数字,也不要上网查。」
记录两件事:① 自评指出的位置是否命中第一段里真正错误的那一项;② 把自评意见再回灌一轮,数字是否被改成另一个仍然无法核实的值。然后换一个任务做对照:让模型输出一段严格 JSON(字段名、类型、取值范围都写死),自评那一轮改为「逐字段对照上面写死的约束,指出不满足的字段」,观察这一次自评能否稳定收敛。
预期观察:事实型任务上,自评通常只能指出「表述含糊」而指不出错在哪一位数字,回灌后数字往往被换成一个同样无法核实的新值,说明自评没有引入任何新信息;结构化任务上,自评能逐字段命中违例并收敛,因为判据来自外部写死的约束而非模型自己的记忆。
shellbash
查看代码
# 把反思挂到外部信号上:用断言代替「你觉得这样好不好」
npx promptfoo@0.124.1 eval -c promptfooconfig.yaml --no-cache --output out.json
# promptfooconfig.yaml 里每条 case 至少配一条确定性断言,例如:
# assert:
# - type: is-json
# - type: javascript
# value: JSON.parse(output).unit === "m" && JSON.parse(output).value > 8000
# - type: llm-rubric
# value: 答案给出海拔数值与测量年份两项,未编造测量机构名称
python3 - <<'PY'
import json
rows = json.load(open("out.json", encoding="utf-8"))["results"]["results"]
fail = [r for r in rows if not r.get("success")]
for r in fail:
print(r["vars"], "|", r.get("failureReason"))
print("失败 = %d / 总数 = %d" % (len(fail), len(rows)))
PY
预期观察:每条断言各自给出通过或失败,失败项带出具体原因文本(哪条断言、期望什么、实际得到什么)。这段原因文本就是回灌给模型重写的那段反馈,它来自外部校验器而不是模型自评,因此可以逐轮对比失败数是否真的下降;若失败数来回震荡或原样不变,说明迭代只是在换措辞。
05证据
主张厂商侧把「生成者—评估者」与提示词链、路由、并行、编排者—工作者并列为五类可控工作流之一,说明按判据反复评估并改写是官方承认的固定回路,而不是临时技巧。
分级official
来源S-0005 https://www.anthropic.com/engineering/building-effective-agents
原文展开原文关键句
Workflows are systems where LLMs and tools are orchestrated through predefined code paths. … Orchestrator-workers … Evaluator-optimizer.
主张评估回路里的「评估」可以分成两类信号源:确定性断言(相等、正则、JSON 结构、代码校验、工具轨迹)与模型辅助判定(相似度、分类器、按准则打分、事实性),工程侧应当按任务选源,而不是一律交给模型自评。
分级official
来源S-0077 https://www.promptfoo.dev/docs/configuration/expected-outputs/
原文展开原文关键句
Deterministic eval metrics: equals / contains / icontains / regex / is-json / javascript … Model-assisted: similar / classifier / moderation / llm-rubric / g-eval
主张反思式改进的现行实现是把反思模型与外部度量函数分开配置:GEPA 优化器显式接收一个度量函数作为评分信号,另设一个反思模型负责提出改写,官方示例以该度量函数上的分数变化作为成效依据。
分级official
来源S-0081 https://dspy.ai/current/getting-started/gepa-optimization/
原文展开原文关键句
today we're going to focus on GEPA … optimizer = dspy.GEPA(metric=haiku_metric, reflection_lm=reflection_lm, auto="light", num_threads=2) … our score climb from 78.1% to 90.1%
06术语
术语反思与自评回路 Reflection and Self-Critique Loop
界定让模型对自己的输出给出评价并据此改写,形成闭环改进;与生成者—评估者模式同源,但可在单 Agent 内实现。
相关节点—
术语生成者—评估者 Generator–Evaluator
界定由生成者产出、评估者按明确判据给出反馈并驱动迭代的编排模式,适用于有清晰评价标准的任务。
相关节点—
术语校验与修复回路 Validation and Repair Loop
界定对模型输出做结构或语义校验,失败则把校验错误回灌给模型重试,直至通过或达到重试上限。
相关节点—
07失效模式
- 自评同源评估者与生成者共享同一套内部表征,事实性与逻辑性错误会被原样放过,错结论反而因为「已复核」而带上更高置信度。
- 判据含糊只说「检查一下有没有问题」而不给可判定的准则,模型只会产出措辞不同的第二版,失败数在轮次之间来回震荡。
- 无上限迭代不设轮数与 token 预算时,反思会反复改写同一段文本,延迟与账单同步放大,而质量早已进入平台期。
- 把评测集换成自评没有固定评测集就无法判断改动是否真的变好,只能凭「这一版读起来更顺」下结论,等于取消回归防线。
08在本站知识结构中的位置
- 所属分组
- G02推理增强
- 依赖深度
- 第 16 层(同层节点彼此无先后约束)
在 交互全景图 中定位本节点。