Self-Consistency
CoTは手軽に利用できてかつ強力なテクニックですが、弱点があります。それは、人間に例えると「たった一度の思考しか許されない」ということです。一度誤った思考ルートに入ってしまうと、それを途中で訂正できず、そのまま結論まで間違えてしまうことが少なからずあります。Self-Consistency(自己整合性)はそんなCoTの弱点を補った、拡張版のCoTです。
やり方は単純で、「CoTを複数回実行し、多数決で最終結論を決める」というものです。以下のプロンプトで問題を解かせてみましょう。
以下の問題に答えてください。 # 問題 3年前、私は父のちょうど半分の年齢になりました。私は現在28歳です。父は現在何歳ですか? # 出力形式 JSON # 出力項目 - thought: 思考過程(string) - answer: 回答(number)
すると、回答は以下のようになりました。
{ "thought": "私が3年前には25歳だったことから、父のちょうど半分の年齢であることがわかる。したがって、父の年齢は50歳である。", "answer": 50 }
CoTを適用したにも関わらず、回答を間違えています。問題の性質によっては、単独のCoTでは解決しづらい場合もあるのです。
では、Self-Consistencyを適用し、これを複数回実行してみます。ChatGPT APIを用いる場合、「n」というパラメーターを指定することで、複数の返答を同時に受け取ることができます。実装は以下のようになります。
import json import statistics from openai import OpenAI prompt = """以下の問題に答えてください。 # 問題 3年前、私は父のちょうど半分の年齢になりました。私は現在28歳です。父は現在何歳ですか? # 出力形式 JSON # 出力項目 - thought: 思考過程(string) - answer: 回答(number) """ # ChatGPT APIで回答を生成する client = OpenAI("<APIキー>") response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{'role': 'user', 'content': prompt}], response_format={"type": "json_object"} temperature=1, n=3 ) # 回答を全て表示する for choice in response.choices: print(choice.message.content) # 多数決を取る answers = map(lambda c : json.loads(c.message.content).get("answer"), response.choices) final_answer = statistics.mode(answers) # 最終回答を表示する print("回答:", final_answer)
ここで、ChatGPT APIを実行する際、「n=3」を指定する事で、3件の回答を同時生成しています。この時、temperatureを低くし過ぎると、回答内容が全て同じになってしまうため注意してください。また、多数決はPython標準ライブラリの「statistics」を使用して取得しています。
こちらを実行すると、ChatGPT APIから返ってくる3件の回答は以下のようになりました。
{ "thought": "私が3年前に父のちょうど半分の年齢だったということから、3年前の私の年齢は28歳 - 3歳 = 25歳でした。つまり、3年前の父の年齢は25歳 * 2 = 50歳でした。したがって、現在の父の年齢は50歳 + 3歳 = 53歳です。", "answer": 53 } { "thought": "3年前、私の年齢は28歳-3=25歳だった。その時、私は父のちょうど半分の年齢だったので、父の年齢は25歳×2=50歳だった。したがって、現在、父の年齢は50歳+3=53歳である。", "answer": 53 } { "thought": "3年前、私は25歳であり、その時の父の年齢は50歳でした。父の年齢はその後も変わらず、50歳のままなので、父は現在も50歳です。", "answer": 50 }
3件のうち2件が正解しています。ここから多数決を取ると、最終回答は以下のようになります。
回答: 53
無事に正しい答えを導けました。このように複数の経路で思考を行うようにすると、より確実性が高く、一貫した結果を得られます。回答の数を増やせばその効果はより堅牢なものとなりますが、それに伴いトークン使用量が増加し、コストも高くなります。Self-Consistencyを採用する必要性や、生成する回答の数などは、システムの要件に応じて慎重に決定しましょう。
CoTの理論を応用したテクニックはこの他にも多数発表されています。より複雑な問題に対応可能とされているものもありますので、もしご興味があれば調べてみてください。