リフレクション ─ エージェントが自己修正する仕組み
結論から言うと、リフレクションとは「出力→評価→フィードバック生成→再試行」を繰り返すことで、モデルのパラメータを更新せずに精度を上げるエージェントの自己修正ループです。コーディングや文章生成など、明確な合否基準があるタスクで特に効果があるとされます。
リフレクションとは何か
人間は書いたコードを実行してエラーを見て書き直したり、文章を読み返して直したりします。リフレクションは、これと同じことをLLMエージェントに自動でさせる仕組みです。
ループの流れは次のとおりです。
- 行動(Act): エージェントがタスクを実行し、出力を生成する
- 評価(Evaluate): 出力を評価する(別のLLMや外部ツールの場合もある)
- フィードバック生成(Reflect): 何が悪かったかを自然言語で記述する
- 再試行(Retry): フィードバックをコンテキストに加えて再度実行する
重みの更新が不要なため、APIで利用するだけでも実装できます。
Reflexionフレームワーク
2023年に発表された論文「Reflexion: Language Agents with Verbal Reinforcement Learning」(Shinnら)は、このアプローチを体系化しました。
従来の強化学習は「報酬スコアでパラメータを更新する」のに対し、Reflexionは「過去の失敗を自然言語でエピソードメモリに保存し、次の試行のコンテキストに追記する」だけです。3つの役割を組み合わせます。
| 役割 | 担当するLLM | やること |
|---|---|---|
| Actor | 実行担当 | タスクを解いて出力を生成 |
| Evaluator | 評価担当 | 出力の良し悪しを判定 |
| Self-Reflection | 振り返り担当 | 失敗原因をテキストで記述 |
論文によると、HumanEvalというコーディングベンチマークでGPT-4の80%に対してReflexionが91%の精度を達成したとされています(複数回の試行を許容した場合)。
Anthropicのevaluator-optimizerパターン
Anthropicのガイドでは、同じ考え方を「evaluator-optimizerワークフロー」と呼んでいます。一方のLLM呼び出しが出力を生成し、もう一方がフィードバックをループで提供します。
生成 ──→ 評価 ──→(改善が必要?)──→ フィードバック付きで再生成
↓
(十分?)──→ 完了
「明確な評価基準があるとき」にこのパターンが有効とされています。曖昧な基準のままでは、ループが収束せず無駄なコストだけかかります。
実装時の3つの注意点
①評価基準を具体的にする: 「改善してください」より「条件Xを満たしていないので修正してください」のように、フィードバックが具体的なほど再試行の質が上がります。
②最大試行回数を設ける: 無限ループ防止のため max_retries = 3 など上限を必ず設定します。停止条件の重要性はレッスン09(評価・安全・ガードレール)でも触れた通りです。
③トークンが増えることを意識する: フィードバックを毎回コンテキストに積むと全体のトークン数が膨らみます。要約したり最新N件だけ保持するなど、レッスン06(メモリ)で学んだ工夫が役立ちます。
なお、「良い文章かどうか」といった定性的な基準では評価者自体が不安定なため、リフレクションの効果が薄くなる傾向があるとされます。コードの実行結果やJSON検証など客観的な合否が取れるタスクが最も相性が良いと考えられています。
まとめ
- リフレクションは「実行→評価→フィードバック→再試行」のサイクルで、重み更新なしにエージェントの精度を高める
- Reflexionフレームワーク(Shinnら, 2023)がこのアプローチを体系化し、コーディングタスクで顕著な改善を示した
- Anthropicの「evaluator-optimizer」パターンも同じ発想に基づく
- 実装では「明確な評価基準」「試行上限」「トークン管理」の3点が鍵になる
- 定性的な基準より、客観的な合否が取れるタスクに特に効果的とされる