プロンプトエンジニアリング
LLM から望ましい出力を得るためのプロンプト設計技法
AI設計パターン
プロンプトエンジニアリングとは
プロンプトエンジニアリングは、大規模言語モデル (LLM) に対して適切な指示 (プロンプト) を設計し、望ましい出力を安定的に得るための技法である。同じモデルでもプロンプトの書き方で出力品質が大きく変わるため、生成 AI を活用するシステムでは必須のスキルになっている。
主要なテクニック
| テクニック | 説明 | 効果 |
|---|---|---|
| Zero-shot | 例示なしで指示 | シンプルなタスク向き |
| Few-shot | 入出力の例を数個提示 | 出力形式の安定化 |
| Chain of Thought (CoT) | 「ステップごとに考えて」と指示 | 推論精度の向上 |
| System Prompt | モデルの役割・制約を定義 | 一貫した振る舞い |
| 出力形式の指定 | JSON、Markdown 等を明示 | パース可能な出力 |
Few-shot の例
以下の文を「ポジティブ」「ネガティブ」「ニュートラル」に分類してください。
例1: 「この製品は素晴らしい」 → ポジティブ
例2: 「配送が遅すぎる」 → ネガティブ
例3: 「昨日届きました」 → ニュートラル
分類対象: 「価格は高いが品質は良い」 →
例示を与えることで、モデルは出力形式とタスクの意図を正確に理解する。
Chain of Thought (CoT)
複雑な推論タスクでは、「ステップごとに考えてください」と指示するだけで精度が向上する。
❌ 「100 人のうち 30% が合格し、合格者の 20% が優秀賞。優秀賞は何人?」
→ モデルが直感的に誤答するリスク
✅ 「ステップごとに計算してください。
1. 合格者数を求める
2. 優秀賞の人数を求める」
→ 30人 × 20% = 6人 (正答率が向上)
Bedrock での実装パターン
const response = await bedrockClient.send(new InvokeModelCommand({
modelId: 'amazon.nova-lite-v1:0',
body: JSON.stringify({
messages: [
{
role: 'user',
content: [{ text: prompt }]
}
],
system: [{ text: 'あなたは技術文書の要約を行うアシスタントです。JSON 形式で回答してください。' }],
inferenceConfig: {
maxTokens: 1024,
temperature: 0.1 // 低い温度で安定した出力
}
})
}));
temperature を低く設定すると出力が安定し、高く設定すると創造的になる。分類・抽出タスクは 0〜0.3、文章生成は 0.5〜0.8 が目安。
よくある落とし穴
- プロンプトが曖昧: 「良い文章を書いて」ではなく「200 文字以内で、技術者向けに、箇条書きで」と具体的に指定する
- コンテキストウィンドウの超過: 長すぎるプロンプトはモデルの入力上限を超える。要約や RAG で必要な情報だけを渡す
- ハルシネーション対策の欠如: モデルの出力を無検証で使うと、事実と異なる情報が混入する。出力の検証ロジックを必ず組み込む
関連書籍も参考になる。