反思与迭代修正
反思是检查已有结果、利用反馈找出问题并尝试修正的过程。它需要具体的评价依据,也需要防止改动让原本正确的部分退步。
理解与应用
智能体中的反思,通常指执行或生成结果后,再检查哪里不符合要求,并把反馈用于下一次尝试。反馈可以来自测试、用户意见、规则检查,也可以由模型提出。相关研究中,Reflexion 强调用语言反馈帮助后续尝试,Self-Refine 则研究生成、反馈和修订的迭代;这些做法并不等于修改模型权重。
例如一个程序要删除标签两端的空白,初稿却用了 replace,把标签中间的空格也删了。“New York”因此变成“NewYork”。有用的反馈不是“代码不够严谨”,而是指出输入、错误输出和预期输出:两端空白应去掉,内部空格应保留。这个反馈将修改方向缩小到字符串处理规则。
下一轮可以改用 strip,然后重跑原先的案例和其他相关测试。如果只检查“New York”一个样本,可能忽略空字符串或制表符。反思产生的是待验证的修正建议;只有新版本通过检查,才有理由替换旧版本。保留上一版和测试结果,也能在改动引入新问题时回退。
不是所有任务都有明确答案。文章修改可以依据字数、读者背景和必需信息来检查,但“更好读”仍包含判断。当评价和修订都来自同一个模型时,它们可能共享同样的误解,因此外部标准或独立证据尤其有价值。达到任务要求后继续反复改写,未必比停在已验证的版本更好。
动手试一试:用失败样本说明具体要改什么
代码中的两个版本都是预先写好的,用来展示测试反馈如何指向修正,而非展示模型自动修复。修改版通过了这里列出的三个案例;这不能代替对完整业务输入范围的检查。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
def first_version(text):
return text.replace(" ", "")
def revised_version(text):
return text.strip()
cases = [
(" New York ", "New York"),
("\tAlice\t", "Alice"),
("", ""),
]
for name, function in [("初稿", first_version), ("修改后", revised_version)]:
passed = sum(function(source) == expected for source, expected in cases)
print(f"{name}: {passed}/{len(cases)} 通过")
print("具体反馈:", repr(first_version(cases[0][0])), "应为", repr(cases[0][1]))运行结果
初稿: 1/3 通过 修改后: 3/3 通过 具体反馈: 'NewYork' 应为 'New York'
常见误区
- 只让模型说“再检查一遍”,却不给可判断的标准,容易得到语气更肯定但问题未改的答案。
- 只复测刚失败的案例,可能错过修改对其他已通过案例造成的影响。
前置与延伸
建议先读
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Reflexion 原始论文 ↗
已核对作者论文页面,v4;Reflexion 是特定研究方法,本文同时讨论更广义的反馈修正,不将其等同于权重更新。 · 核验:2026-10-10
- Self-Refine 原始论文 ↗
已核对作者论文页面与迭代反馈方法摘要,v2;不承诺自我反馈必然提高正确率。 · 核验:2026-10-10