プロンプトエンジニアリングの精度向上には、Few-Shot(例示)、Chain-of-Thought(推論過程の明示)、Self-Consistency(複数回答の集約)の3技法が効果絶大です。基本プロンプトで限界を感じたら、順番に適用していくとよいでしょう。ただしコスト増とレイテンシ悪化は不可避であり、精度と性能のトレードオフを常に意識する必要があります。
なぜ高度なプロンプト技法が必要か
基本的なプロンプトテクニック(明確な指示、ロール設定、出力形式)で多くのタスクは解決できます。しかし、複雑な推論、論理計算、専門的な判断を要するタスクでは、基本テクニックだけでは限界が来ます。ここで登場するのが高度なプロンプト技法です。Few-Shot、Chain-of-Thought、Self-Consistencyなどの技法は、LLMの潜在的な能力を引き出す「加速器」の役割を果たします。
注意すべきは、これらの技法はコストとレイテンシを増加させるということです。Few-Shotは例示のぶんトークンが増え、CoTは推論過程を出力するのでトークンが膨らみ、Self-Consistencyは複数回呼び出すのでコストが倍増します。プロンプトエンジニアリング入門、ハルシネーション対策、LLM評価方法の記事と合わせて、トレードオフを踏まえた設計が求められます。
Few-Shot Prompting――例示で精度を上げる
Few-Shot Promptingは、プロンプトに入出力のペアをいくつか例示し、LLMにパターンを学習させてから本番の入力を与える技法です。「ゼロから推論させる」より「例を見せてから推論させる」方が、期待フォーマットへの追従性が劇的に上がります。分類タスク、抽出タスク、フォーマット変換タスクで特に効果的です。
from openai import OpenAI
client = OpenAI()
prompt = """以下の例に倣い、問い合わせをカテゴリに分類してください。
問い合わせ: 「注文がまだ届きません」 → 配送
問い合わせ: 「請求金額が間違っています」 → 請求
問い合わせ: 「返品したい商品があります」 → 返品
問い合わせ: 「サイトでログインできない」 → """
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
例示の数は3〜5が理想的です。多すぎるとコンテキストを圧迫し、少なすぎるとパターン認識が不十分になります。また、例示は入力パターンの多様性を反映させるのが重要で、似た例ばかりだと応用が効きません。
Chain-of-Thought(CoT)――思考過程を明示させる
Chain-of-Thought(CoT)は、LLMに「答えを出す前に推論過程を書き出させる」技法です。単純に見えますが、複雑な計算や論理推論のタスクでは、CoTの有無で回答精度に大きな差が生まれます。特に数学問題、論理パズル、多段階の意思決定で効果絶大です。「ステップバイステップで考えてください」という魔法のような一文が、LLMの性能を引き上げます。
from openai import OpenAI
client = OpenAI()
question = "りんご3個は180円です。5個買ったとき、10%の会員割引を適用するといくらになりますか?"
cot_prompt = f"""次の問題を、順を追って考えてから最終答えを出してください。
問題: {question}
考え方:
1. りんご1個あたりの価格を計算
2. 5個ぶんの合計を計算
3. 10%引きを適用
最終答え:
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": cot_prompt}]
)
print(response.choices[0].message.content)
CoTの副次的な効果として、LLMの推論過程が可視化されるため、誤答時のデバッグが容易になる点も挙げられます。どこで判断を誤ったかが追跡できるので、プロンプト改善のヒントになります。
Self-Consistency――複数回答から最善を選ぶ
Self-Consistencyは、同じプロンプトを複数回実行し、得られた複数の回答から最も一致するものを選ぶ技法です。LLMの出力は非決定的なので、一度の回答では外れ値になることがあります。複数回サンプリングして多数決を取ることで、安定性と精度を両立できます。
from collections import Counter
from openai import OpenAI
client = OpenAI()
def self_consistency(prompt, n=5):
answers = []
for _ in range(n):
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.7
)
answers.append(response.choices[0].message.content.strip())
counter = Counter(answers)
return counter.most_common(1)[0][0]
result = self_consistency("りんご3個が180円、5個買うといくら?", n=5)
print(result)
コストはサンプル数だけ線形に増えるため、5〜7回程度が現実的です。高価値な判断が必要な場面(医療、法務、金融)で使うのが費用対効果の高い選択です。
その他の高度な技法(Tree of Thought、ReAct等)
さらに高度な技法として、Tree of Thought(ToT)、ReAct、Step-Back Prompting等があります。ToTは思考を木構造に展開し、複数の経路を試して最良の結論を選びます。ReActはReasoningとActionを交互に実行し、ツール使用と推論を統合します。Step-Backはまず抽象的な問いに戻り、そこから具体的な答えを導きます。
| 技法 | 原理 | 精度向上度 | コスト影響 | 実装難易度 | 適したタスク |
|---|---|---|---|---|---|
| Few-Shot | 例示による学習 | 中 | 小 | 低 | 分類・抽出 |
| CoT | 推論過程の明示 | 高 | 中 | 低 | 論理・計算 |
| Self-Consistency | 複数回答の集約 | 中〜高 | 大(N倍) | 中 | 高価値判断 |
| Tree of Thought | 木構造探索 | 高 | 大 | 高 | 計画立案 |
| ReAct | 推論+ツール | 高 | 中〜大 | 高 | エージェント |
| Step-Back | 抽象化 | 中 | 小 | 低 | 複雑な質問 |
| ユースケース | 推奨技法 | 理由 |
|---|---|---|
| 問い合わせ分類 | Few-Shot | パターン学習で安定 |
| 数学・計算問題 | CoT+Self-Consistency | 推論過程の検証 |
| 複雑な戦略立案 | Tree of Thought | 多経路の比較検討 |
| ツール活用エージェント | ReAct | 推論と実行の統合 |
| 要約・分析 | Step-Back+CoT | 抽象化してから具体化 |
重要なのは、技法の組み合わせは慎重にという点です。Few-Shot+CoT+Self-Consistency+ToTを全部載せると、コストが指数的に膨らみます。問題の難易度に応じて、必要最小限の技法だけを選ぶのが賢明です。
まとめ
- Few-Shotは例示による学習で分類・抽出精度を高める
- CoTは推論過程を明示させて論理問題の精度を上げる
- Self-Consistencyは複数サンプルの集約で安定性を確保する
- コストと精度のトレードオフを踏まえ、必要最小限の技法を選ぶ
よくある質問
Chain-of-Thoughtプロンプトとは
LLMに推論過程をステップバイステップで出力させることで、複雑な問題の回答精度を向上させる技法です。「考えを段階的に示してください」のような指示を追加するだけで効果があります。
Few-Shotプロンプトで何例示せばよいですか
一般的に3から5例が効果的です。例が多すぎるとコンテキストを圧迫し、少なすぎるとパターンの学習が不十分になります。入力パターンの多様性を意識して代表的な例を選定してください。
これらの技法はどのLLMでも使えますか
はい、Transformer系のLLM(GPT、Claude、Gemini等)で広く効果が確認されています。ただし、モデルの性能によって効果の度合いは異なります。小規模モデルではCoTの効果が限定的な場合があります。