新一代提示词工程 · 知识全景图面向有工程基础、提示词工程尚未系统化的工程师
显示设置

反思与自评回路

Reflection and Self-Critique Loop

PE-R-08内容已写满G02推理增强第 16 层

推理增强反思自评

一句话结论

反思要挂在外部可验证信号上,纯自评对事实性与逻辑性错误几乎无效。

本页结构(可跳转)

S1 强度一 模型自评 自己检查自己的输出 可靠性最低 · 成本最低 S2 强度二 独立评估 另一个模型或另一段提示 按判据评估 S1->S2 可靠性递增 L 无外部信号时的纪律 限制反思轮数 或改为引入独立评估者 S1->L S3 强度三 外部信号驱动 测试通过 / 校验器报错 工具返回预期结果 S2->S3 可靠性递增 N 为什么自评会失灵 它依赖与生成同一套内部表征 能纠正遗漏与格式问题 对事实性与逻辑错误几乎无效 ⇒ 无外部信号时反思沿同一个错误走得更远 并给错误结论更高的置信度 S3->N
强度阶梯图:自评 / 独立评估 / 外部信号驱动三种反思来源的可靠性递增,与纯自评对事实性错误的失灵机制。 (本站自制)

01为什么需要它

反思让模型先评估自己刚产出的答案,再据此改写,是成本最低的一条闭环改进手段,也是 agent 从一次性作答转向可迭代作答的起点。

适用边界

这条回路的收益主要来自外部可验证信号那一头,来自自评的那一头收益有限且有方向性风险。缺信号时应当压住轮数、把自评限定在格式与完整性这类可自查项,或改为引入独立评估者;把它当成事实核查器就是错配。回路本身也不负责告诉你改完是不是真的变好了:是否变好由评测集回答,改动是否可接受由门控脚本的退出码回答。

02机制说明

这条回路有三种强度,可靠性递增而成本也递增。

03何时该用 / 何时不该用

按场景对照:先看条件,再看该怎么做。
类别场景 / 条件(总结)具体做法(细节)
该用存在可执行校验(测试、schema、业务规则)时把校验错误回灌给模型重写,收益最确定。
该用输出质量取决于风格或完整性、且有明确准则时引入独立评估者按准则逐项评估,而不是让生成者自己打分。
该用追问链较长、单轮答案易漏项时在中间产物上做一次定向复核,比在整段对话末尾一次性重写更省 token。
不该用把自评当事实校验模型无法可靠发现自己不知道的错误。
不该用不设轮数上限的迭代反思可能强化错误并放大成本,必须带终止条件与预算。

04实验台

  1. promptmarkdown

    查看代码
    用同一段模型上下文做两段式自评,检验「纯自评」到底能改对什么。
    
    第一段(生成):用一句话回答——「珠穆朗玛峰的海拔是多少米,测量年份是哪一年?请各给一个数字。」模型作答后原样保留。
    第二段(自评):在同一个对话里追加——「你刚才的答案里有没有不确定或可能记错的地方?只指出位置并说明理由,不要给出新的数字,也不要上网查。」
    
    记录两件事:① 自评指出的位置是否命中第一段里真正错误的那一项;② 把自评意见再回灌一轮,数字是否被改成另一个仍然无法核实的值。然后换一个任务做对照:让模型输出一段严格 JSON(字段名、类型、取值范围都写死),自评那一轮改为「逐字段对照上面写死的约束,指出不满足的字段」,观察这一次自评能否稳定收敛。

    预期观察:事实型任务上,自评通常只能指出「表述含糊」而指不出错在哪一位数字,回灌后数字往往被换成一个同样无法核实的新值,说明自评没有引入任何新信息;结构化任务上,自评能逐字段命中违例并收敛,因为判据来自外部写死的约束而非模型自己的记忆。

  2. 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失效模式

08在本站知识结构中的位置

所属分组
G02推理增强
依赖深度
第 16 层(同层节点彼此无先后约束)
前置PE-R-07→PE-R-08 本节点→后继PE-E-05

在 交互全景图 中定位本节点。