讲讲 Agent 的反思机制?为什么要用反思?具体怎么实现?
反思(Reflection)是让 Agent 把"自己刚产出的东西"再读一遍,找出问题并修订,必要时重试。 它把"一次成型"变成"生成—检验—改进"的闭环,本质是用额外的推理换正确率,而且只在检验信号可靠时才划得来。
1. 结论:反思的价值取决于"判定信号"的质量
| 信号来源 | 可靠性 | 成本 | 示例 |
|---|---|---|---|
| 外部执行结果(编译、单测、HTTP 状态) | 高 | 低 | 代码跑不通、接口 400 |
| 结构化校验(schema、规则引擎) | 高 | 极低 | 字段缺失、字数超标 |
| 另一个模型的批判(Critic) | 中 | 中 | 评审逻辑漏洞 |
| 自我批判(同一模型自评) | 低~中 | 低 | "检查一下有没有错误" |
没有客观信号时的反思,效果经常是负的:模型倾向于认为自己没错,或者把对的改成错的。所以第一条工程准则是:能用执行结果验证,就别用模型自评。
2. 机制:三种典型形态
① 自我修订(Self-Refine)
生成 ──▶ 批判 ──▶ 修订 ──▶ 达标? ──否──┐
▲ │
└──────────────────┘(≤N 轮)
② 反思记忆(Reflexion)
尝试 ──▶ 失败 ──▶ 归因(为什么失败)──▶ 写入教训 ──▶ 下次尝试带上教训
③ 生成-验证分离(Generator / Verifier)
A 生成 ──▶ B 独立验证(不看 A 的思路)──▶ 不通过则打回 A 并附具体缺陷
②与①的区别在于:反思结果被持久化成经验,跨尝试复用;③的关键是验证者不看生成者的推理过程,避免被带偏。
3. 实现:带停止条件与评分的反思循环
RUBRIC = """你是严格的代码评审员,只按以下条目逐条判定:
1. 是否处理了空输入与超长输入?
2. 是否有未捕获的异常路径?
3. 是否引入了未声明的依赖?
每条给出 PASS/FAIL 与一句理由,最后一行为 SCORE: 0-10"""
def reflect_and_revise(task: str, draft: str, llm, run_tests, max_rounds=2, threshold=8):
history = []
for r in range(max_rounds):
test_ok, test_log = run_tests(draft) # 客观信号优先
if test_ok:
return draft, "tests_passed"
review = llm(RUBRIC + f"\n任务:{task}\n代码:\n{draft}\n测试输出:\n{test_log[:2000]}")
score = int(re.search(r"SCORE:\s*(\d+)", review).group(1))
history.append({"round": r, "score": score, "review": review})
if score >= threshold and r > 0:
break
# 关键:把具体缺陷喂回去,而不是笼统说"再改改"
draft = llm(f"""根据评审意见修订代码,只输出完整代码。
任务:{task}
评审意见:
{review}
当前代码:
{draft}""")
return draft, history # 未达标也要返回,由上层决定是否人工介入
三个工程细节:评审条目要事先固定(否则每轮标准漂移)、必须设轮数上限、未达标时如实返回并标记,不能假装成功。
4. 什么时候反思收益最大
| 场景 | 收益 | 说明 |
|---|---|---|
| 代码生成 + 单测 | 高 | 有编译器与测试作为硬信号 |
| 结构化抽取 + schema 校验 | 高 | 缺字段可精确定位 |
| 长文写作(有明确 rubric) | 中 | 依赖评分标准质量 |
| 事实问答 | 低 | 模型无法自查幻觉,需要检索验证 |
| 开放式创意 | 低甚至负 | 反复修改会磨掉风格 |
替代方案常常更划算:把"反思一轮"换成"生成三个候选 + 用规则或小模型选优"(自洽性投票),成本相近但方差更小。
5. 常见追问
问:模型自评为什么不可靠? 同源偏差:生成与评判用同一个模型,错误往往共享同一套盲区;再加上模型倾向于给"看起来完整"的答案打高分。缓解办法是换模型做评审、给具体检查清单、要求引用证据。
问:反思会不会越改越差? 会。常见于"没有评分标准"和"每轮都重写"。对策:只在分数提升时接受新稿(保留历史最佳版本)、限制修改范围(只改被指出的问题)、设置最大轮数。
问:Reflexion 的"教训"存在哪? 存在任务级或会话级的记忆里,一条教训一句话,带触发条件(例如"调用内部 API 必须带 X-Env 头")。下次同类任务开始时注入,避免重蹈覆辙。
问:反思和多 Agent 的评审角色有什么区别? 机制相同,组织不同。单 Agent 自省省成本但易自我肯定;独立评审 Agent 更客观但要传上下文、成本更高。选择取决于错误代价。
小结
反思 = 检验 + 修订,收益上限由检验信号决定。工程上优先用执行结果和 schema 做判定,模型自评只作为补充;同时固定评审标准、限制轮数、保留最佳版本、如实上报未达标。这样反思才是提分项,而不是把成本翻倍还把答案改坏。