SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド

あなたのChatGPTをもっと賢く! APIで使える実践プロンプトエンジニアリング

生成AIで自社サービスをパワーアップしよう!「ChatGPT API」活用ガイド 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

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」というパラメーターを指定することで、複数の返答を同時に受け取ることができます。実装は以下のようになります。

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

次のページ
プロンプトインジェクションとその対策例

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド連載記事一覧

もっと読む

この記事の著者

株式会社ブリューアス AI-TEAM(カブシキガイシャブリューアス エーアイチーム)

 モバイルのアプリを中心にUI/UXデザインから開発保守まで、幅広い実績を持つ会社です。専門的な知識と豊富な開発経験を活かし、AIとサービスの統合を推進しています。 Brewus.inc

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19220 2024/03/25 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング