"let's think step by step" 技術を使って、以下の問題をAIに解かせる:
レベル1: ゼロショットCoTを適用する問題: あるチームには8人がいて、各自1日6時間働く。プロジェクトには240人時間の作業が必要。チームが12人に成長すると、何日早く完了できるか?
完全なプロンプト("let's think step by step" を含む)を書き、AIがどの中間ステップを示すか予測しなさい。
学習目標:
- 思考の連鎖(chain-of-thought)がどう機能し、なぜ有効かを理解する
- "let's think step by step"でAIの推論を誘導する方法を学ぶ
- どのタスクがCoTに適しているかを見極める
前提: << レッスン3: Few-Shot学習 | 次: レッスン5 >>
数学の文章題をAIに聞くと「42」と答えが返ってきた。確認すると答えは正しい。しかし似た問題に変えると答えが間違ってしまう。何が起きたのか?モデルが推測したか、たまたま正しい数字にたどり着いた壊れた推論パスを辿っただけかもしれない。
複数ステップの推論を必要とするタスク(数学の問題、論理パズル、複雑な分析)では、AIに推論ステップを示させる方が直接答えを求めるよりも信頼性が高い1 2。これが思考の連鎖(CoT)プロンプティングの核心的なアイデアである:結論を実際にチェックできる中間ステップに分解する。
思考の連鎖(CoT)プロンプティングは、最終的な答えを出す前にモデルに中間推論ステップを示させる技術である1。研究の言葉を借りれば、思考の連鎖プロンプティングは "enables complex reasoning capabilities through intermediate reasoning steps"(中間推論ステップを通じて複雑な推論能力を可能にする)1。直感はシンプルだ:"Chain of Thought prompting encourages the model to think through the problem in a step-by-step manner, which is supposed to mimic how humans break down complex problems"(思考の連鎖プロンプティングは、人間が複雑な問題をどう分解するかを模倣するように、モデルに段階的に問題を考え抜かせる)2。数学の問題を解くために紙に式と中間結果を書き出すのと同じことだ。
2つのアプローチを比較してみよう:
❌ CoTなし:
AIはこう出力するかもしれない:
答えが間違っていても、どのステップがずれたのか分からない。
✅ CoTあり:
AIの出力:
すべてのステップが可視化されているので、1つが間違っていてもすぐに見つけてプロンプトを修正できる。
研究によると、複数ステップの推論を含むタスクでは、CoTが精度を大幅に向上させる1。一部のタスクでは、CoTと実例付きデモンストレーションを組み合わせることで、精度がさらに最大28.2%向上する2。
プロンプトの最後に1行追加するだけ:"let's think step by step"(段階的に考えよう)1 2。
この1行だけでモデルの段階的推論モードが発動する。例を提供する必要はなく、モデルが自分で問題を分解する。
例が推論フォーマットとステップの詳細度を示し、モデルがそのスタイルを真似る。
CoTは複数ステップの推論を必要とするタスクに最適である2:
✅ 数学と論理推論
✅ 因果分析
✅ 計画と意思決定
✅ コードデバッグ
適さない場面:
❌ 単純な事実検索: 「Pythonはいつ最初にリリースされたか?」— 推論不要 ❌ 創作: 詩、物語 — 推論ステップが創造的な流れを壊す ❌ フォーマット変換: JSON → CSV — 機械的な操作、推論不要
経験則:自分でタスクをするときに紙にステップを書き出すなら、CoTに適している。
CoTなし(信頼できない結論):
結論だけで、理由がない。
CoTあり(明確な推論):
AIが示す:
すべての推論ステップがチェック可能なので、1つが間違っていてもすぐに分かる。
問題:
AIの出力:
この段階的な消去法を示すことで、論理が完璧かどうかをチェックしやすくなる。
複雑な問題をいくつかのサブ問題に分解する。
仮説をリストアップし、1つずつチェックする。
賛成と反対の理由をリストアップし、結論を出す。
CoTは万能薬ではない。いくつかの限界がある:
1. 長さと時間が増える
推論ステップを示すと出力が長くなり、より多くのトークンを消費し、応答時間が長くなる。
価値がある場合: 複雑なタスクでは、精度を得るために2~3倍のトークンを使うのは良いトレードオフ。 価値がない場合: 単純なタスク(「今日は何曜日か」)では、推論ステップは純粋な無駄。
2. 推論ステップ自体が間違っている可能性がある
AIが示すステップは合理的に見えても、論理に穴がある可能性がある。推論が正しいかどうかを依然としてチェックする必要がある。
CoTの価値は、エラーを可視化することだ。AIが直接答える場合、エラーはブラックボックスに隠れる。ステップが示されると、エラーはあるステップで表面化し、見つけて修正しやすくなる。
3. 直感に頼るタスクには適さない
一部のタスク(創作、芸術の評価)は全体的な感覚に依存しており、ステップに強制すると全体が壊れる。
思考の連鎖プロンプティングは、AIに直接答えにジャンプするのではなく推論ステップを示させる。プロンプトに "let's think step by step" を追加するか、推論を含む例を提供することで、複数ステップの推論タスクでの精度を大幅に向上させることができる。
CoTは数学推論、論理分析、因果推論、複雑な意思決定 — 複数の思考ステップを必要とするすべてに適している。推論を可視化してチェック可能にする。出力の長さは増えるが、複雑なタスクでは見返りがコストをはるかに上回る。
次のレッスンでは、プロンプトをデバッグして改善する方法を扱う:AIの出力が期待と一致しないとき、どのように体系的に問題を見つけて修正するか。
次のレッスン プロンプトのデバッグと改善 >>
問題: あるチームには8人がいて、各自1日6時間働く。プロジェクトには240人時間の作業が必要。チームが12人に成長すると、何日早く完了できるか?
完全なプロンプト("let's think step by step" を含む)を書き、AIがどの中間ステップを示すか予測しなさい。
完全な推論ステップを示す2つの例(1つはO(n)、1つはO(n²))を含むFew-Shot CoTプロンプトを設計しなさい。
問題: あるコーヒーショップは朝に23杯、正午に17杯、午後に朝の2倍の量のコーヒーを売った。その日全体で何杯売ったか?
答え:86杯問題: あるコーヒーショップは朝に23杯、正午に17杯、午後に朝の2倍の量のコーヒーを売った。その日全体で何杯売ったか?
Let's think step by step:Let's think step by step:
1. 朝の売上: 23杯2. 正午の売上: 17杯3. 午後は朝の2倍: 23 × 2 = 46杯4. 1日の合計: 23 + 17 + 46 = 86杯
答え: 86杯問題: 5人の作業員が5日かかってプロジェクトを終えるとき、10人の作業員なら何日かかるか?
Let's think step by step:例:問題: 車が時速60kmで走る。3時間でどれだけ進むか?推論:- 速度 = 60 km/h- 時間 = 3時間- 距離 = 速度 × 時間 = 60 × 3 = 180 km答え: 180 km
では、この問題を解いてください:問題: 車が時速80kmで2.5時間走り、その後時速60kmでさらに1時間走る。合計でどれだけ進むか?推論:このコードにパフォーマンスの問題があるか?
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```
答え: はい、パフォーマンスの問題がありますこのコードのパフォーマンス問題を分析してください。段階的に説明してください:1. ループ構造を特定する2. 時間計算量を計算する3. 具体的なボトルネックを指摘する4. 最適化を提案する
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```パフォーマンス分析:
1. ループ構造: - 外側のループ: 各要素を反復、O(n) - 内側のループ: 各要素について残りの要素を反復、O(n) - 全体: ネストされたループ、O(n²)
2. 時間計算量: - メインループ: O(n²) - `items[i] not in duplicates`チェック: 最悪ケースでO(m)、mはこれまで見つかった重複の数 - 合計計算量: O(n² × m)
3. パフォーマンスのボトルネック: - ネストされたループが大きな入力(n > 1000)で非常に遅くなる - リストに対する`not in`の線形スキャンがさらに遅くする
4. 最適化: - リストの代わりにsetを使って重複を保存し、チェックをO(m)からO(1)に削減 - またはCounterを使ってすべての2回以上出現する要素を1回のパスで見つけ、O(n)に削減3人 — A、B、C — がコンテストに参加する。分かっていること:- Aは1位ではない- Bは最下位ではない- Cは1位でも最下位でもない
順位はどうなるか?
Let's reason step by step:Let's reason step by step:
1. Cの条件から始める: - Cは1位でも最下位でもない - したがってCは2位でなければならない
2. AとBを固定する: - Aは1位ではない - Bは最下位ではない - Cはすでに2位なので、1位と3位がAとBに残る
3. 残りの順位を割り当てる: - Aは1位ではないので、Aは3位 - Bは最下位(3位)ではないので、Bは1位
答え: B 1位、C 2位、A 3位問題: あるソフトウェアプロジェクトには5人のエンジニアがいて、各自1日6時間働き、120人日の作業が必要。8人のエンジニアに拡大すると、何日早く完了できるか?
Let's compute step by step:1. 現在の体制で何日かかるか?2. 人を追加した後は何日か?3. 何日早くなるか?このコードが"TypeError: unsupported operand type(s)"をスローする。考えられる原因は?
Let's check the possible causes one by one:1. 演算子の両側の変数の型をチェックする2. 演算にNone値が関与していないかチェックする3. 文字列と数値が混在していないかチェックするマイクロサービスアーキテクチャとモノリスのどちらを使うべきか?
Let's analyze it from two angles:
マイクロサービスの理由:1. ...2. ...
モノリスの理由:1. ...2. ...
総合判断:現在のチームサイズとプロジェクトの複雑さに基づき、...を推奨します