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の理論を応用したテクニックはこの他にも多数発表されています。より複雑な問題に対応可能とされているものもありますので、もしご興味があれば調べてみてください。
