Self-Reflection 一般翻译成:
自我反思。
听起来有点抽象。
其实放在 Agent 里,它的意思很简单:
Agent 做完一件事之后,再检查一下自己刚才做得对不对。
如果发现问题,就修改。
这就是 Self-Reflection。
为什么需要 Self-Reflection
大模型经常会犯一种错误:
它会很自信地给出一个错误结果。
比如让 Agent 写一段代码。
它写完以后直接回答:
已完成。
但实际上代码可能根本跑不起来。
如果加入 Self-Reflection,流程就不一样了。
生成代码
↓
检查代码
↓
发现问题
↓
修改代码
↓
再次检查
这样最终结果通常会更可靠。
Self-Reflection 是怎么工作的
最简单的 Self-Reflection 可以分成两步:
生成
然后:
检查
比如用户要求:
写一个 Python 函数,计算两个日期之间相差多少天。
模型先生成代码。
然后再问自己:
这段代码有没有问题?
有没有遗漏边界情况?
是否符合用户要求?
如果发现问题,就重新修改。
所以流程大概是:
第一次生成
↓
检查
↓
发现问题
↓
修改
↓
再次检查
↓
输出结果
一个简单例子
比如 Agent 写了一篇文章。
初稿里有这样一句:
所有 Agent 都必须使用 ReAct。
Reflection 阶段重新检查:
这个说法是不是太绝对了?
模型发现:
不是所有 Agent 都必须使用 ReAct。
于是修改成:
ReAct 是 Agent 中常见的一种设计方式。
这就是一次很简单的 Self-Reflection。
Reflection 可以检查什么
不同任务检查的东西也不一样。
写代码时可以检查:
有没有语法错误
有没有逻辑错误
有没有遗漏异常处理
是否满足需求
写文章时可以检查:
有没有事实错误
结构是否清楚
有没有重复
有没有回答用户的问题
做研究时可以检查:
证据是否足够
来源是否可靠
有没有遗漏重要信息
结论是不是过度推断
所以 Reflection 本质上就是多加了一层:
质量检查。
Self-Reflection 和普通重试不一样
普通重试可能只是:
失败
↓
再执行一次
但 Self-Reflection 会多一个过程:
为什么失败?
↓
哪里有问题?
↓
应该怎么改?
然后再重新执行。
所以它不是单纯重新来一遍。
而是先分析问题,再修改。
在 Agent 里怎么用
Self-Reflection 经常会和工具调用一起使用。
比如一个 Coding Agent:
写代码
↓
运行测试
↓
测试失败
↓
分析错误
↓
修改代码
↓
再次运行测试
这里的测试结果就是一个非常好的反馈。
模型可以根据测试结果进行 Reflection。
比如:
测试期望 200
实际返回 401
模型就可以继续分析:
可能是认证信息没有传入。
然后去检查相关代码。
所以很多 Coding Agent 看起来像是在“自己改 Bug”。
其实背后就是:
执行
↓
得到反馈
↓
反思
↓
修改
Self-Reflection 不一定真的可靠
这里也要注意一个问题。
模型自己检查自己,并不代表一定能发现错误。
因为生成答案和检查答案的,可能还是同一个模型。
它第一次没发现的问题,第二次也可能看不出来。
所以更加可靠的方法,通常是给 Reflection 提供外部反馈。
比如:
测试结果
编译错误
搜索结果
用户反馈
规则检查
另一个模型的评价
这些信息比单纯让模型说:
请检查你自己的答案。
通常更有效。
Self-Reflection 也不能无限进行
还有一个问题:
Agent 可能会一直觉得自己的结果不够好。
修改
↓
检查
↓
再修改
↓
再检查
最后陷入循环。
所以实际开发中通常也需要限制 Reflection 次数。
比如:
最多反思 3 次。
超过以后就输出当前最好的结果。
最后
Self-Reflection 的核心非常简单:
做完以后,再检查一遍。
如果发现问题:
修改,然后重新检查。
整个流程就是:
执行
↓
检查
↓
发现问题
↓
修改
↓
再次执行
它的价值在于给 Agent 增加一个纠错过程。
ReAct 关注的是:
下一步做什么。
Plan-and-Execute 关注的是:
整个任务怎么做。
Map-Reduce 关注的是:
大任务怎么拆开处理。
而 Self-Reflection 关注的是:
刚才做得对不对,要不要改。