モデルの思考過程を導く:Chain of Thoughtプロンプト

2025/07/31に公開されました。
2025/07/31に更新されました。

この記事では、Chain of Thoughtプロンプトの基本から具体例、Vertex AI上での実践コードまでを解説し、日常的な数値計算や論理問題の解決をステップごとに明確化することで、モデルの出力精度と透明性を高める手法を紹介します。


author: segcp

はじめに

多くの場面で、言語モデルは最終的な答えだけを返し、その過程(中間ステップ)を示しません。この「ブラックボックス」的挙動では、論理の飛躍や誤りを発見しにくくなり、出力結果の信頼性が下がることがあります。Chain of Thought(CoT)プロンプトは、モデルに対して「どのように考えたか」をステップごとに示させる手法です。思考過程を明示的に示すことで、回答精度の向上や透明性の強化などが期待できます。

この記事では次の内容を解説します。

  1. CoTプロンプトが性能向上に寄与する理由
  2. 効果的なCoTプロンプトの構成要素
  3. CoTなし・ありの比較例
  4. Vertex AIで実践するコード例
  5. まとめ

1. Chain of Thoughtが重要な理由

言語モデルは大量のテキストからパターンを学習しますが、複数段階の推論を内部で適切に処理できないことがあります。CoTプロンプトを用いると、次のような利点があります。

  • 隠れたミスを発見:思考ステップを順に表示することで、論理の飛躍や計算誤りを前もって把握できる。
  • 精度の向上:数量計算や複雑な論理問題での見落としが減り、正答率が上がる。
  • 透明性の確保:各ステップを監査できるため、結果の解釈や検証が容易。

特に、モデルの温度(temperature)を低く設定することで、一貫した出力が得やすくなり、CoTの効果がさらに高まります。

2. 効果的なCoTプロンプトの構成

CoTプロンプトは大きく3つの要素で構成されます。

  1. 指示ブロック:ステップごとに思考を書くようモデルに指示
  2. 例示:詳細なステップを含む例題を提示
  3. 問題と回答セクション:実際の問いを示し、「推論ステップ1」「推論ステップ2」…ラベルを用意

プロンプトのテンプレート(Template)

あなたは…の専門家です。各推論ステップを順に書いてから、最終的な答えを示してください。

例題:
問題: [例題]
推論ステップ 1: [1つ目の推論]
推論ステップ 2: [2つ目の推論]

回答: [答え]

では、次を解いてください:
問題: [実際の質問]
推論ステップ 1:

おすすめポイント

  • 「推論ステップ1」や「推論ステップ2」などの番号付きラベルを使用してください。
  • モデルが手順をスキップしないように、十分な詳細を記述してください。
  • 実行時にはtemperature00.2に設定してください。

3. CoTなし/ありの比較例

以下の二例は、直接的なプロンプトでいかに誤答を誘発しやすいかを示し、CoTプロンプトで正しい過程を踏ませる例です。

A. コールセンター処理率比較

シナリオ:オペレーターAさんとオペレーターBさんの1時間あたり処理コール数を比較します。

❌ CoTなしプロンプト

オペレーターAさんは1時間で30件、45分で25件対応しました。
オペレーターBさんは1時間で40件、30分で20件対応しました。
どちらの処理率が高いですか?

想定誤答例:オペレーターAさんの方が速い。

誤りの理由:オペレーターAさんの最初の区間(30件÷1h=30件/h)とBの最初の区間(40件÷1h=40件/h)だけを比較したり、区間レートを単純平均したりすると、次のような誤解が可能性があります。

  • A平均 = ( (30 ÷ 1) + (25 ÷ 0.75) ) ÷ 2 ≈ 31.65件/h
  • B平均 = ( (40 ÷ 1) + (20 ÷ 0.5) ) ÷ 2 = 40件/hと誤判定します。
    実際は(合計55件 ÷ 1.75h ≈31.43件/h)と(60件 ÷ 1.5h =40件/h)を比較すべきですが、CoTなしでは計算過程が省略されがちです。

✅ CoTありプロンプト

問題: 職員Eさんは1時間で45件、30分で20件の処理を行いました。職員Fさんは45分で35件、1時間で30件の処理を行いました。1時間あたりの平均処理率が高いのはどちらですか?
推論ステップ1: Eの合計件数と合計時間を計算:45 + 20 = 65件、1h + 0.5h = 1.5h
推論ステップ2: Eの平均処理率:65 ÷ 1.5 ≈ 43.33件/h
推論ステップ3: Fの合計件数と合計時間を計算:35 + 30 = 65件、0.75h + 1h = 1.75h
推論ステップ4: Fの平均処理率:65 ÷ 1.75 ≈ 37.14件/h
推論ステップ5: 比較:43.33 vs 37.14
回答: 職員Eさんの方が速い(43.33件/h vs 37.14件/h)

問題: オペレーターAさんは1時間で30件、45分で25件対応しました。オペレーターBさんは1時間で40件、30分で20件対応しました。1時間あたりの平均処理率が高いのはどちらですか?
推論ステップ 1:
...
回答:

想定正答:オペレーターBさんの方が速い (40件/h vs 31.43件/h)

正答までの想定ステップ:

  • 推論ステップ1: Aの合計件数と合計時間を計算: 30 + 25= 55件, 1h + 0.75h= 1.75h
  • 推論ステップ2: Aの平均率: 55 ÷ 1.75 ≈ 31.43件/h
  • 推論ステップ3: Bの合計件数と合計時間を計算: 40 + 20= 60件, 1h + 0.5h= 1.5h
  • 推論ステップ4: Bの平均率: 60 ÷ 1.5= 40件/h
  • 推論ステップ5: 比較: 31.43 vs 40

B. プリンター速度比較

シナリオ:プリンターXとプリンターYの1分あたり印刷枚数を比較します。

❌ CoTなしプロンプト

プリンターXは2分で30枚、3分で50枚印刷。  
プリンターYは1.5分で25枚、2.5分で40枚印刷。  
どちらが速いですか?

想定誤答例:プリンターXの方が速い。

誤りの例:区間ごとに「枚数 ÷ 時間」で処理速度を求めたあと、重み付けせずに単純平均してしまうことがあります。

  • プリンターX: 30 ÷ 2= 15枚/分, 50 ÷ 3= 16.7枚/分 → 平均≈ 15.85枚/分
  • プリンターY: 25 ÷ 1.5≈ 16.7枚/分, 40 ÷ 2.5= 16枚/分 → 平均≈ 16.35枚/分

✅ CoTありプロンプト

問題:
コピー機Mは4分で60枚、2分で20枚印刷しました。コピー機Nは3分で45枚、3分で50枚印刷しました。全体の平均印刷速度はどちらが速いですか?
推論ステップ1: Mの合計枚数と時間を計算:60 + 20 = 80枚、4 + 2 = 6分
推論ステップ2: Mの平均速度:80 ÷ 6 ≈ 13.33枚/分
推論ステップ3: Nの合計枚数と時間を計算:45 + 50 = 95枚、3 + 3 = 6分
推論ステップ4: Nの平均速度:95 ÷ 6 ≈ 15.83枚/分
推論ステップ5: 比較:13.33 vs 15.83
回答: コピー機Nの方が速い(15.83枚/分 vs 13.33枚/分)
問題: プリンターXは2分で30枚、3分で50枚印刷。プリンターYは1.5分で25枚、2.5分で40枚印刷。全体の平均印刷速度はどちらが速いですか?
推論ステップ 1:
...
回答:

想定正答:プリンターYの方が速い (16.25枚/分vs 16枚/分)

正答までの想定ステップ:

  • 推論ステップ1: Xの合計枚数と時間: 30 + 50 = 80枚, 2 + 3 = 5分
  • 推論ステップ2: Xの平均速度: 80 ÷ 5 = 16枚/分
  • 推論ステップ3: Yの合計枚数と時間: 25 + 40 = 65枚, 1.5 + 2.5 = 4分
  • 推論ステップ4: Yの平均速度: 65 ÷ 4 = 16.25枚/分
  • 推論ステップ5: 比較: 16 vs 16.25

C. 平均速度の落とし穴

シナリオ:異なる速度での移動距離を合算し、全体の平均速度を計算します。

❌ CoTなしプロンプト

自動車が1時間50km/h、次に0.5時間75km/hで走行しました。  
平均速度は?

想定誤答例:“62.5km/h”

誤りの理由:単純平均 (50 + 75) ÷ 2 = 62.5とし、時間の重み付けを無視してしまうことがあります。

✅ CoTありプロンプト

問題: バスが0.6時間で36km、1.2時間で60km移動しました。全体の平均速度は?
推論ステップ1: 合計距離を計算:36 + 60 = 96km
推論ステップ2: 合計時間を計算:0.6 + 1.2 = 1.8時間
推論ステップ3: 平均速度:96 ÷ 1.8 ≈ 53.33km/h
回答: 約53.33km/h
問題: 自動車が1時間50km/h、次に0.5時間75km/hで走行しました。平均速度は?
推論ステップ 1:
...
回答:

想定正答:約58.33km/h。

正答までの想定ステップ:

  • 推論ステップ1: 合計距離: 50 + 75×0.5 = 50 + 37.5 = 87.5km
  • 推論ステップ2: 合計時間: 1 + 0.5 = 1.5時間
  • 推論ステップ3: 平均速度: 87.5 ÷ 1.5 ≈ 58.33km/h

4. Vertex AIでの実装コード例

以下は、検証に使用できるPythonのサンプルコードです。Google ColabとVertex AIのGeminiモデルを使って、Chain of Thoughtプロンプトを試せるようにしています。

① 必要なパッケージをインストール

import subprocess, sys, importlib.util

def ensure_package(pkg: str):
    if importlib.util.find_spec(pkg) is None:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", pkg])
ensure_package("google-genai")
ensure_package("ipython")

② Colab認証

import sys
if "google.colab" in sys.modules:
    from google.colab import auth
    auth.authenticate_user()

③ プロジェクト設定

import os
from google import genai
from vertexai.generative_models import GenerationConfig

PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT") or "my-gcp-project"
if PROJECT_ID in ("", "my-gcp-project", "[your-project-id]"):
    raise EnvironmentError(
        "⚠️ PROJECT_ID が未設定です。\n"
        "  ▶ 環境変数 GOOGLE_CLOUD_PROJECT をセットするか\n"
        "  ▶ ソースコード内の PROJECT_ID の「my-gcp-project」を自分のProject IDに書き換えてください。"
    )
REGION = os.getenv("VERTEX_REGION") or "us-east1"
client = genai.Client(vertexai=True, project=PROJECT_ID, location=REGION)
models = client.models

④ CoTプロンプト実行関数定義

def run_prompt(prompt: str, model_id: str = "gemini-2.0-flash-001", temperature: float = 0, max_output_tokens: int = 300):
    config = GenerationConfig(temperature=temperature)
    result = models.generate_content(model=model_id, contents=prompt, config=config)
    from IPython.display import Markdown, display
    text = getattr(result, "text", str(result))
    display(Markdown(f"### ✨ Result\n{text}"))

⑤ 自分のプロンプトを検証

cot_prompt = """
ここにあなた自身のChain of Thoughtプロンプトを入力してください。
"""
run_prompt(cot_prompt)

※ 上記コードではgemini-2.0-flash-001を書いてありますが、Vertex AIのGemini APIでは他にも複数のモデルが提供されています。ユースケースに応じて適切なモデルを選択してください。
利用可能なモデル一覧は以下の公式ページをご参照ください: Geminiモデル一覧

まとめ

Chain of Thoughtプロンプトは、モデルの思考過程を明確化し、複雑な推論や計算ミスを減らします。明確な指示、例示、ステップラベル、そして低温度設定を組み合わせることで、Vertex AIのGeminiモデルに対して信頼性の高い結果を得られます。自分のユースケースに合わせてプロンプトを試し、洗練させていきましょう。

参考

https://developers.google.com/machine-learning/resources/prompt-eng
https://research.google/blog/language-models-perform-reasoning-via-chain-of-thought/
https://research.google/pubs/towards-understanding-chain-of-thought-prompting-an-empirical-study-of-what-matters/
https://ai.google.dev/gemini-api/docs/prompting-strategies?authuser=1

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。