導入
ChatGPTなどの大規模言語モデル(LLM)は、単純な質問応答や文章生成では高い能力を発揮します。しかし、複数段階の計算が必要な数学的問題、複雑な条件分岐を含む論理推論、または複数の情報源を統合する必要があるタスクにおいては、一貫性のない誤った回答を生成することが少なくありません。このような「推論の失敗」は、モデルが最終的な答えを直接生成しようとするために、途中の思考過程が曖昧化または省略されてしまうことが主な原因です。本記事では、この課題を克服するための強力なプロンプト技術「Chain-of-Thought (CoT)」に焦点を当て、その原理と実践的な活用方法を詳しく解説します。
原因説明:なぜ複雑な推論で失敗するのか?
LLMは、膨大なテキストデータから統計的なパターンを学習しています。単純なタスクでは、このパターンマッチングが非常に有効に機能します。しかし、複雑な推論が必要な場合、モデルは「最も確からしい次の単語」を順次生成するだけで、人間のように体系立った思考のステップを内部で構築・管理しているわけではありません。その結果、以下のような問題が発生します。1. 計算の飛躍: 途中式を省略し、直感的(しかし誤った)答えを出力する。2. 条件の見落とし: 問題文のすべての条件を同時に考慮できず、一部を無視する。3. 文脈の喪失: 長い推論の過程で、最初に設定した前提を見失う。これらの失敗は、モデルに「考え方」そのものを明示的に指示しないことが根本的な原因です。Chain-of-Thoughtプロンプティングは、この「思考のブラックボックス」を開き、推論過程を可視化・構造化することで問題を解決します。
解決方法:Chain-of-Thought (CoT) プロンプティングの実践
Chain-of-Thoughtプロンプティングの核心は、モデルに対して「ステップバイステップで考えなさい」と指示し、さらにそのお手本となる推論例(Few-Shot Example)を提示することにあります。これにより、モデルは単に答えを当てるのではなく、答えに至る論理的な道筋を生成するように誘導されます。
基本コンセプト:Zero-Shot CoT と Few-Shot CoT
CoTには主に二つのアプローチがあります。Zero-Shot CoTは、明示的な例を提示せず、単に「ステップバイステップで考えましょう」という指示文を追加するだけの簡便な方法です。一方、Few-Shot CoTは、問題と、その段階的な解決過程を示した例をプロンプト内に埋め込み、モデルに解き方を「お手本」として見せる方法です。後者の方が一般的に精度が高く、複雑なタスクに有効です。
実装ステップとコード例
ここでは、PythonとOpenAI APIを使用したFew-Shot CoTの実装例を示します。複雑な割り算の文章題を解かせることを想定します。
import openai
client = openai.OpenAI(api_key="YOUR_API_KEY")
def solve_problem_with_cot(user_problem):
# Few-Shot CoT のためのデモンストレーション例をプロンプトに埋め込む
system_message = """あなたは優秀な数学の家庭教師です。複雑な文章題を解くときは、必ず以下の手順でステップバイステップで推論し、最後に答えを導き出してください。
1. 問題文から数値と条件をすべて抽出する。
2. 解決に必要な演算や順序を計画する。
3. 一つ一つのステップを計算し、中間結果を明示する。
4. すべてのステップを統合して最終答えを出す。"""
few_shot_examples = """
例題1:
問題: レストランに30人の客がいます。最初の10人が去り、その後、新しいグループが到着して客の数が3倍になりました。今、レストランには何人いますか?
推論:
ステップ1: 初期の客数は30人。
ステップ2: 10人が去ったので、 30 - 10 = 20人になる。
ステップ3: 残った20人の3倍の客数になったので、 20 * 3 = 60人。
ステップ4: したがって、現在の客数は60人です。
答え: 60
例題2:
問題: 公園に白いバラが24本、赤いバラは白いバラの半分の本数あります。黄色いバラは赤いバラと白いバラの合計より5本少ないです。公園には全部で何本のバラがありますか?
推論:
ステップ1: 白いバラ = 24本。
ステップ2: 赤いバラ = 白いバラの半分 = 24 / 2 = 12本。
ステップ3: 赤と白の合計 = 24 + 12 = 36本。
ステップ4: 黄色いバラ = 合計 - 5 = 36 - 5 = 31本。
ステップ5: 全部のバラ = 白(24) + 赤(12) + 黄(31) = 67本。
答え: 67
"""
# ユーザーからの問題と組み合わせて最終プロンプトを作成
prompt = f"{system_message}\n\n{few_shot_examples}\n\nでは、以下の問題を解いてください。上記と同じ形式で「推論:」と「答え:」を必ず含めて出力してください。\n問題: {user_problem}"
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
temperature=0.2, # 推論タスクでは低めの温度設定が有効
max_tokens=500
)
return response.choices[0].message.content
# 実行例
user_input = "図書館に漫画が120冊あります。小説は漫画の2/3の冊数です。雑誌は漫画と小説の合計冊数より40冊少ないです。全ての本の合計は何冊ですか?"
result = solve_problem_with_cot(user_input)
print(result)
プロンプト設計の高度なヒント
- 明確な区切り記号を使用する: 「推論:」「ステップ1:」「答え:」などのラベルを使い、モデルの出力構造を強制します。
- タスクに適した例を選ぶ: デモンストレーション例は、解決して欲しい問題と同種の難易度・構造を持つものを選びます。
- 出力形式を指定する: 「…の形式で出力してください」と指示することで、後段のプログラムによる回答の自動抽出が容易になります。
- 温度(Temperature)パラメータを低く設定する: 創造性よりも一貫性が重要な推論タスクでは、0.2程度の低い値に設定すると、決まった形式に従った出力が得られやすくなります。
- 「思考」と「最終回答」を分離する: プロンプトで「まず理由を説明し、その後で結論を述べなさい」と指示することで、モデルが結論に飛びつくのを防ぎます。
ビジネスでの応用例:経費精算ルールの判定
CoTは数学問題だけでなく、複雑なビジネスルールの適用にも有効です。例えば、従業員の経費申請が会社規定に合致するかどうかを判定するシステムを考えます。
business_prompt = """
以下の会社規定と経費申請内容に基づき、この申請が承認されるかどうかを判定してください。
判定はステップバイステップで行い、各規定を順番に確認してください。
会社規定:
1. 食事経費は1回あたり5,000円まで。
2. 交通費は実費精算だが、グリーン車利用は不可。
3. 領収書の添付が必須。
申請内容:
- 目的: 顧客との打ち合わせ
- 食事代: 6,500円 (領収書あり)
- 交通費: 新幹線自由席 12,000円 (チケットの写しあり)
推論:
"""
# このプロンプトをChatGPTに送信すると、以下のような構造化された推論が期待できる。
# ステップ1: 食事代6,500円は規定1の5,000円上限を超えている。→ 条件違反。
# ステップ2: 交通費は新幹線自由席であり、グリーン車ではない。→ 条件合致。
# ステップ3: 領収書とチケット写しの添付がある。→ 条件合致。
# ステップ4: 規定1に違反しているため、この申請は承認されない。
# 答え: 承認不可(食事代が上限超過)
まとめ
Chain-of-Thoughtプロンプティングは、ChatGPTなどLLMの「推論のブラックボックス」を開き、複雑な問題解決能力を大幅に向上させる実用的な技術です。重要なのは、モデルに答えだけを求めず、答えに至る過程そのものを生成させるという発想の転換にあります。Few-Shot Exampleを用いて解き方のお手本を示し、出力形式を明確に指示することで、計算ミスや論理の飛躍を劇的に減らすことができます。この技術は、数学的問題解決、ビジネスルールの評価、技術的なトラブルシューティングなど、あらゆる段階的思考を必要とする場面で強力な武器となります。プロンプト設計に少しの工夫を加えるだけで、AIアシスタントの精度と信頼性を次の段階へと引き上げることができるのです。
🚀 プロンプト技術をさらに磨くなら
プロンプトエンジニアリングの実践には、高性能なAIモデルへのアクセスが不可欠です。
- ChatGPT Plus — GPT-4o/o1による高度な推論が利用可能
- Claude Pro — 長文コンテキストと精密な指示理解に強い