讲讲 Agent 的反思机制?为什么要用反思?具体怎么实现?

#RAG#Agent#面试八股

讲讲 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 做判定,模型自评只作为补充;同时固定评审标准、限制轮数、保留最佳版本、如实上报未达标。这样反思才是提分项,而不是把成本翻倍还把答案改坏。

笔记加载中…