Chain-of-Thought
Chain-of-Thought(以下CoT)は2022年にGoogleの研究者らによる論文で提案されたテクニックで、LLMにある程度の思考能力を付与する方法として非常によく用いられています。その方法は簡単で、最終的なアウトプットの前に、思考過程を言葉で説明させるというものです。
CoTの効果を確かめるために、ChatGPTに「日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか?」という問題を解かせてみましょう。
まずはCoTを使わない状態、即ち、思考過程を一切挟まずに、いきなり答えを出させるとどうなるか確認してみます。ここでは、先ほどのFew-shotプロンプティングを用いて解答形式を指定します。
Q: タコの足の数とイカの足の数の合計はいくつですか? A: 18 Q: 日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか? A:
1行目と2行目はFew-shotプロンプティングのための例題と回答です。敢えて数字だけを答えるように仕向けています。3行目の質問文がここで本来答えて欲しい内容です。これを実行するとどうなるでしょうか?
48
このように正解とは全く違う答えが返ってきました。たまたま間違えたわけではなく、繰り返し実行してみても正答率はほぼ0%になるはずです。日本の都道府県の数も、徳川幕府の将軍の数も、人間の両手の指の数も全てChatGPTは知っているはずなのに、それらの合計を上手く答えることができません。これが、「LLMは自身の知識を自由に参照できない」や「LLMは思考する能力を持たない」ということです。今回はわかりやすい例で試していますが、これと同じ現象は普段ChatGPTなどを利用している時にも多かれ少なかれ発生していると考えられます。
次に、CoTを適用して、思考過程を言葉でアウトプットさせながら回答を導くように仕向けてみます。
Q: タコの足の数とイカの足の数の合計はいくつですか? A: タコの足の数は8本、イカの足の数は10本なので、合計は18です。 Q: 日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか? A:
前回同様Few-shotプロンプティングを用いていますが、今回は2行目の解答例を変更して、回答に至る過程からアウトプットするようにしています。こちらを実行すると、以下のような回答が返ってきます。
日本の都道府県の数は47、徳川幕府の将軍の人数は15、人間の両手の指の数は10本なので、合計は72です。
今度は正しい答えが導き出せました。足し合わせる3つの要素を具体的な数字に変換していく作業は、人間であれば口には出さずに頭の中で行うことが多いと思いますが、LLMにはそれができません。しかし、このように解答に至るまでの文脈上に言葉としてアウトプットしてあれば、それを擬似的な「思考」として利用することができます。これがChain-of-Thought(思考の連鎖)です。
今回の例ではFew-shotプロンプティングによって答え方を指定しましたが、思考過程を出力するよう仕向けることさえできれば、この方法でなくても問題ありません。より簡単な方法としては、通常の質問文の末尾に「ステップバイステップで考えてください(Let’s think step by step)」という一文を加えるだけで、同じような出力が得られることも知られています。そちらの手法はZero-shot Chain-of-Thoughtと呼ばれています。
JSON出力でCoTを使う方法
前回の記事で紹介したように、ChatGPT APIを既存システムのパーツとして利用する場合は、回答をJSON形式で得ることが多いと思います。その場合、回答は思考過程を含まずに答えの部分だけ取得したいケースがほとんどでしょう。そのような場合でも以下のような方法でCoTが適用可能です。
以下の問題に答えてください。 # 問題 日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか? # 出力形式 JSON # 出力項目 - thought: 思考過程(string) - answer: 回答(number)
このように、回答をJSON形式で出力するよう指示しました。今回はFew-shotプロンプティングは使用せずに、出力項目の一つとして思考過程を入れるようにしています。
{ "thought": "日本の都道府県の数は47、徳川幕府の将軍の人数は15人、1人の人間の両手の指の数は10本なので、それぞれを合計して計算すると、47 + 15 + 10 = 72 となります。", "answer": 72 }
この方法でも正しい答えが導けています。このように、JSONで出力する場合でも、本来目的とする項目より前に、その結論に至るための思考過程を出力させることで、CoTを実現できます。この例では、「thought」が「answer」よりも前に出力されていることが重要です。LLMは回答文を冒頭から順番に生成していきますが、前に出力された内容は後ろに出力される内容に影響を与えます。それは出力形式がJSON等であっても変わりません。また、今回は思考過程を一つの項目で書き出しましたが、必要であれば複数の項目に分けても良いでしょう。