プロンプト Chain‑of‑Thought (CoT)
軽量モデルへ代表的なプロンプト手法を実際のコードで試しモデルの反応を確認します
記事作成日:2025-12-02, 著者: Hi6
このガイドはなぜ必要か?
現代のLLM(大規模言語モデル)は、正しく誘導されて初めて複雑な推論タスクを解決できます。以下に示す手法は、信頼性・説明可能性・高性能システム構築の「標準的ケア」として確立されています。それぞれが、モデルへの指示量や内部で考えるか外部ツールと対話するかという点で異なります。
影響力が大きい6つの手法を深掘り:
Chain-of-Thought(CoT)とは?
概要
Chain-of-Thought は、LLM に「思考の過程を明示的に書くように促す」手法。
→ モデルが「まずこう考える → 次にこう考える → 最後にこう答える」の流れで、論理的・段階的な思考を出力することで、複雑な問題の精度・信頼性が向上する。
- 「どうやって考えるか」をモデルに説明することで、答えの妥当性を高める。
- 特に、数学・論理・推論・多段階タスクに有効。
2️⃣ 基本構造(テンプレート)
Task: [タスクの簡潔な説明]
Example 1:
Input: [問題文]
Thought: [段階ごとの思考]
Output: [最終答え]
Example 2:
Input: [別の問題文]
Thought: ...
Output: ...
Now solve:
Input: [ユーザーが入力する問題]
Thought:
Output:
- Input:解きたい問題
- Thought:思考過程(「まず○○、次に△△」など)
- Output:最終答え
3️⃣ 実際の使い方例
📐 数学・計算問題
Task: 以下の数式を解いてください。思考過程を「Thought」で説明し、「Output」に答えを記載してください。
Example 1:
Input: 15 ÷ 3 + 4 × 2
Thought: まず割り算 → 5。次に掛け算 → 8。最後に足し算 → 13。
Output: 13
Now solve:
Input: (9 - 2)² / 7
Thought: 9-2 = 7。平方 → 49。除算 → 7。
Output: 7
🧠 推論・ロジック問題
Task: 以下の文章を読んで質問に答えてください。思考過程を「Thought」で説明し、「Output」に答えを記載してください。
Example 1:
Input: ジョンは20歳、メアリーはジョンより5歳年上です。
Question: メアリーは何歳ですか?
Thought: ジョンの年齢 = 20。メアリーは +5 → 25。
Output: 25歳
Now solve:
Input: アリスはボブより2倍の年齢です。アリスが30歳なら、ボブはいくつ?
Question: ボブは何歳ですか?
Thought: アリス = 2 × ボブ → 30 = 2 × ボブ → ボブ = 15。
Output: 15歳
🌱 学習教材作成
Task: 次の「文章理解」問題を作ってください。思考過程を「Thought」で説明し、「Output」に答えを記載してください。
Example 1:
Input: 山田さんは毎朝7時に起き、8時に会社へ向かいます。
Question: 山田さんは何時に会社に着くのですか?
Thought: 起床 → 7:00、移動時間 1h → 8:00。
Output: 8時
Now solve:
Input: 佐藤さんは毎日9時に歯医者へ行きます。そこから10時に家に帰ります。
Question: 佐藤さんは何時に家に着きましたか?
Thought: 歯医者 → 9:00、戻る時間 1h → 10:00。
Output: 10時
4️⃣ 実装のポイント
| 項目 | ポイント |
|---|---|
| トークン数 | Thought が長くなると制限に引っかかる可能性。必要な情報だけを抜粋。 |
| フォーマット統一 | Input:, Thought:, Output: を必ず揃える。 |
| 思考の段階 | ①「何を求めるか」→②「どんな操作を行うか」→③「結果」 → という順序で書く。 |
| 例数 | 2〜3 件がベスト。多すぎてもトークンオーバー、少なすぎても学習効果が低い。 |
| エラー検出 | 思考過程に誤りがあれば、後から修正しやすい。 |
| ユーザー入力の位置 | Input: の直後にユーザーが問題を入れる。Question: は固定の指示か、必要ならユーザーも入力できるようにする。 |
5️⃣ よくある質問と回答
| 質問 | 回答 |
|---|---|
| CoT を使わない場合は? | シンプルなタスク(単純計算や短文要約)は Zero‑Shot で十分ですが、複雑な推論では CoT が効果的。 |
| Thought の長さが制限に引っかかったら? | 「思考の要点」だけを抜き出す、または「ステップごとに短く分割する」。 |
| 自動で Thought を生成したい場合? | Generate a step-by-step reasoning のような指示を入れることで、自動化できる。 |
| 複数言語で使える? | 可能。日本語・英語の両方で同じフォーマットを使えば、言語間の CoT が学習できる。 |
6️⃣ 実装例(Python + Ollama)
import ollama
# ---------- 入力データ ----------
user_problem = "田中さんは毎朝8時に起きて、15分で朝食を食べます。その後、通学のバスに乗って学校に着くまでに20分かかります。学校の授業は9時からです。"
user_query = "田中さんは何時何分に学校に着きますか?"
# ---------- プロンプトテンプレート ----------
sys_template = """
Task: 以下の文章を読んで質問に答えてください。思考過程を「Thought」で説明し、「Output」に答えを記載してください。
Example 1:
Input: 田中さんは毎朝5時に起きて、30分で朝食を食べます。その後、通学のバスに乗って学校に着くまでに30分かかります。学校の授業は9時からです。
Question: 田中さんは何時何分に学校に着きますか?
Thought: 5時 + 30分 + 30分 = 6時
Output: 6時に学校に着きます。
"""
user_template = """
Now solve:
Input: {user_input}
Question: {user_question}
Thought:
Output:
"""
user_prompt = user_template.format(
user_input=user_problem,
user_question=user_query
)
# ---------- Ollama へ送信 ----------
client = ollama.Client(host="http://127.0.0.1:11434")
response = client.chat(
model="qwen3-vl:8b",
messages=[
{"role": "system", "content": sys_template},
{"role": "user", "content": user_prompt}
]
)
print(response["message"]["content"])
出力結果: Thought: 8時 + 15分 = 8時15分。その後、20分かかるので、8時15分 + 20分 = 8時35分。 Output: 8時35分に学校に着きます。
🎯 まとめ
- **CoT は「思考過程を明示」**することで、精度・透明性が向上。
- 基本テンプレート:
Input → Thought → Outputを例で示し、最後に実際の問題を解く構造。 - ポイント:トークン制限、フォーマット統一、思考段階の順序化。
- 使いどころ:数式・論理推論・文章理解など、多段階でミスが発生しやすいタスクに最適。
これをベースにプロンプトを作成すれば、CoT を最大限に活かした回答が得られます! 🚀