自己反省(Self-Reflection)とは、大規模モデルがまず答えを書き出し、それを振り返ってチェックし、間違いを見つけて答え直す仕組みのことである。書式の誤りや計算ミスの一部は直せるが、モデルがもともと知らないことは直せないし、反省の回数が多ければ多いほどよいわけでもない。
自己反省の仕組み:まず答え、次に検証し、最後に修正する
自己反省は通常3つのステップで進む。まずモデルが答えを1つ生成する。次に評価の段階で、その答えが合格かどうかを判断する。判断材料は外部からのフィードバック(コードが動かない、テストが通らないなど)でも、モデル自身がシミュレーションするチェックでもよい。最後に「どこが間違っていたか、次はどう変えるか」を文章に書き起こして記憶に保存し、次の回答ではまずこの注意書きを読んでから取りかかる。2023年にShinnらが提案したReflexionフレームワークは、この考え方の代表例である。答えを生成するアクター、採点する評価器、反省文を書く自己反省モデルの3つからなり、重みを変えるのではなく言語フィードバックによってエージェントを向上させる。HumanEvalプログラミングテストで91%の1回目正答率を達成し、GPT-4単体の80%を上回った。同じ手法はAlfWorldタスクでベースラインを約22ポイント上回り、HotPotQAでも約20%向上した。これらの数字が示すのは、反省は「正誤の基準が明確なタスク」には確かに有効だということであり、ただしフィードバック信号そのものが信頼できることが前提である。
自己反省とチェーン・オブ・ソートは別物である
チェーン・オブ・ソートは「先に考えてから答える」手法で、モデルが答えにたどり着く前に推論の手順を書き出し、途中の計算ミスを減らす。自己反省は「答えてから検証する」手法で、答えはすでに存在し、反省の段階ではその出来上がった答えの質を評価する。両者は組み合わせて使える。まずチェーン・オブ・ソートで丁寧に答え、次に自己反省でもう一度チェックするのだ。両者を混同すると「長く考えた」ことを「チェックした」ことと取り違えやすい。もう一つのよくある混同は、自己反省を学習とみなすことである。Reflexionのような手法はモデルの重みを変えず、記憶に保存された文章の注意書きを変えるだけである。
3つの誤解と、役に立つかどうかを見極める方法
1つ目の誤解は、モデルが反省すれば「分かった」と思い込むことである。反省が変えるのは表現と手順であって、知識そのものではない。モデルが知らない事実については、反省しても誤った答えをより流暢な言葉で繰り返すだけで、かえって自信を深めることさえある。2つ目の誤解は、反省の回数が多ければ多いほどよいと思い込むことである。外部からの検証がなければ、繰り返しの反省は最初の偏りを増幅し、小さな誤りを大きな誤りに変えてしまう。堅実なやり方は停止条件を設けることだ。コンパイル成功やテスト通過といった外部シグナルを待つか、反省を最大2〜3回までに限定して、到達したら止める。3つ目の誤解は、自己反省を事実確認のツールだと思うことである。得意なのは書式、計算、コードなど、その場で検証できる誤りである。自由回答型の質問や事実に関する質問には、すぐに使える判定者が存在しないため、反省は役に立たない。ある場面に自己反省が向いているかどうかは、1つの問いだけ見ればよい。モデル自身に頼らずに答えを検証できるか。できるなら、自己反省をオンにする価値がある。できないなら、モデルが自分で自分を論破することを期待するのではなく、まず外部ツールや人による確認を行うべきである。