💬

Anthropicのプロンプトエンジニアリングチュートリアルから学ぶ、プロンプト設計のノウハウ

に公開

はじめに

本記事では、Anthropic社のチュートリアルをもとに、プロンプト設計のノウハウを日本語でまとめ直しました。
モデル(Claudeなど)をより正確かつ意図通りに動かすために必要なテクニックを、実際の日本語プロンプト例を交えてまとめています。

https://github.com/anthropics/prompt-eng-interactive-tutorial/tree/master

結論から

  1. 基本構造(指示・文脈・入力・出力形式)を必ず盛り込む
  2. 明確かつ端的に指示し、曖昧さを徹底排除する
  3. ロール指定で回答の口調や専門性をコントロールする
  4. データと指示をタグで分離し、モデルの誤認識を防ぐ
  5. 出力フォーマットの指定と、必要であればPrefillで書き出しを誘導する
  6. ステップバイステップ思考で推論の過程を明示し、正確性を高める
  7. Few-Shotで例示を活用し、出力パターンを示して守らせる
  8. 幻覚回避のために「根拠を先に引用させる」「限定的情報源のみ使用」などの工夫を行う

上記のポイントを意識して、こんなプロンプトを書くように意識すると回答精度がより高まる

[ロール]
あなたは 10 年以上の経験を持つ Kotlin テックリード。  
Effective Kotlin / Kotlin Coding Conventions / Clean Architecture を熟知し、コードレビューで事実根拠を示しながら改善提案する専門家です。  
回答は技術書レベルの厳密さで、敬体ではなく **簡潔な常体** を用いてください。

[背景情報]
- Kotlin 1.9 / JVM 17(サーバーサイド想定)
- ビルド: Gradle Kotlin DSL
- 単体テスト: JUnit 5 + kotlinx-coroutines-test
- 外部依存は標準ライブラリと kotlinx.serialization のみ  
- 社内規約:  
  1. Null-safety を徹底し Elvis 演算子は最小限  
  2. ログは `LoggerFactory.getLogger()` 経由  
  3. パッケージ命名は `com.example.feature.*` で階層化  
- 参考資料として **Kotlin 公式ドキュメント** と **Effective Kotlin** のみ参照可。それ以外の情報源は使用禁止。

[タスク]
1. 【入力コード】をレビューし、**バグ / 設計上の欠陥 / コーディング規約違反** を網羅的に列挙せよ。  
2. 各指摘には **(a) 問題点 → (b) 技術的根拠 → (c) 改善方針** を 1 行で示せ。  
   - 根拠は *公式ドキュメントの章番号* または *Effective Kotlin §番号* を必ず添える。  
3. 指摘を踏まえた **修正後フルコード** と **JUnit 5 テスト** を提示。  
4. 最後に **改善効果を 100 字以内** で要約。  
5. Step-by-Step:  
   1. コードを静的解析 → 2. 問題抽出 → 3. 修正設計 → 4. 最終コード生成。

[インプット]
```kotlin
import kotlinx.coroutines.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import java.net.URL
import java.time.Instant

@Serializable
data class Post(
    val userId: Int,
    val id: Int,
    val title: String,
    val body: String,
    val fetchedAt: String = Instant.now().toString()
)

class PostRepository {

    private var cachedPosts: List<Post>? = null

    suspend fun getPosts(forceRefresh: Boolean = false): List<Post> {
        if (!forceRefresh && !cachedPosts.isNullOrEmpty()) {
            println("Return cached posts (${cachedPosts!!.size})")
            return cachedPosts!!
        }
        val json = URL("https://jsonplaceholder.typicode.com/posts").readText()
        cachedPosts = Json.decodeFromString(json)
        println("Fetched fresh posts (${cachedPosts!!.size})")
        return cachedPosts!!
    }
}

fun main() = runBlocking {
    val repo = PostRepository()
    val first = repo.getPosts()
    println("First title: ${first.first().title}")
    val second = repo.getPosts()
    println("Second size: ${second.size}")
    val third = repo.getPosts(forceRefresh = true)
    println("Third fetchedAt: ${third.first().fetchedAt}")
}
[アウトプット形式]
### 1. 指摘事項
- ❶ 問題点 → 根拠 (§番号) → 改善方針

### 2. 修正後コード
```kotlin
// filename: PostRepository.kt
// …

各章の内容

初級編
第1章:プロンプトの基本構造
第2章:明確かつ端的に伝える
第3章:役割を割り当てる

中級編
第4章:データと指示を分離する
第5章:出力のフォーマットの指定とClaudeの話し方を指示
第6章:予見力(ステップ・バイ・ステップで考える)
第7章:例を使う(Few-Shotプロンプティング)

上級編
第8章:幻覚(ハルシネーション)を避ける
第9章:複雑なプロンプトの構築(業界別ユースケース)

  • チャットボット向けの複雑なプロンプト
  • コーディング向けの複雑なプロンプト

第1章:プロンプトの基本構造

良いプロンプトには、次の4つの要素を明確に含めるのが基本

  • 指示(Instruction)
    • モデルに「何をしてほしいか」を端的に伝える文。
    • 例:「次の文章を日本語に翻訳してください。
  • 文脈・前提(Context)
    • タスクを正しく遂行するための背景情報や制約条件。
    • 例:「この文章はビジネスメールの一部です。丁寧な言い回しを維持してください。」
  • 入力データ(Input)
    • モデルに処理させたい具体的な情報(テキストや数字など)。
    • 例:「Thank you for your inquiry. We will respond within 24 hours.」
  • 出力形式の指定(Output Format)
    • モデルの回答をどんな形でほしいかを明示するルール。
    • 例:「出力は箇条書きで3項目にまとめてください。」

プロンプト例

【指示】
次のビジネスメールを英語から日本語に翻訳してください。

【文脈】
・相手は取引先担当者です
・フォーマルな表現を使ってください

【入力】
Thank you for your inquiry. We will respond within 24 hours.

【出力形式】
・日本語訳を1文でまとめる
・必要なら「弊社」「御社」などの敬語を補って丁寧に

第2章:明確かつ端的に指示する

モデルは“余計な行間を読む”ことができないため、曖昧さを一切排除し、具体的かつシンプルな言葉で指示を伝える必要がある。

  • 具体的に数・形式を指定する
    • NG例:「要約してください」
    • OK例:「3つのポイントに絞って、各ポイントを2文以内の箇条書きで要約してください」
  • 一度に複数のタスクを入れすぎない
    • 「一行で要約して、その後に意見も書いて、そのあとに関連する統計データを探して…」といった冗長な指示は避ける。
    • まずは「要約に集中させる」を明確にする。必要なら、続きは別プロンプトで行う。
  • 数値や形式を明示する
    • 「200字以内で」「箇条書きで」「5段階評価で」など、出力の形や制限をはっきり指定する
  • モデルは暗黙知を持たない
    • 「あの資料を参考に」とだけ書いても、モデルはどれか分からない。プロンプト内に全文を貼るか、ファイル名や要点を具体的に記載する。

プロンプト例

❌悪い例

この文章を要約してください。

⭕️良い例(明確な指示)

【指示】
以下の文章を3つのポイントに分けて、各ポイントを2文以内で要約してください。

【入力】
(ここに要約したい文章を貼り付ける)

【出力形式】
・ポイント1:〇〇
・ポイント2:〇〇
・ポイント3:〇〇

第3章:ロールの割り当て(Role Prompting)

AIに「あなたは〇〇の専門家です」「あなたはカスタマーサポート担当です」など、特定の役割(ロール)を明示的に与えることで、さまざまなメリットを享受できる

AIは与えられた役割になりきって回答するため、より目的に合った、質の高い出力が得られます。

ロールプロンプティングのメリット

  • 専門性の向上:分野ごとの専門家ロールで、より正確で専門的な回答が得られる
  • トーンやスタイルの調整:親切・丁寧・カジュアル・ユーモラスなど、目的に合った口調で回答できる
  • 特定の視点での回答:顧客目線、開発者目線など、立場を指定できる
  • タスク適応力の向上:校正、レビュー、相談など、タスクに合った役割で精度が上がる

プロンプト例

例1:専門家ロール

【指示】
あなたは経験豊富なマーケティングコンサルタントです。
以下の新商品について、ターゲット顧客層と効果的なプロモーション戦略を提案してください。

【入力】
(新商品の説明)

【出力形式】
・ターゲット顧客層
・プロモーション戦略(具体的な手法を複数)

例2:クリエイティブなロール

【指示】
あなたは人気小説家です。以下のテーマで、読者の興味を引く物語の冒頭部分を書いてください。

【入力】
テーマ:未来都市での探偵物語

【出力形式】
物語の冒頭(500字程度)

このように「ロール→指示→出力形式」をセットで与えると、モデルはまるでその職業の人間になりきって回答してくれます。


第4章:データと指示を分離する

AIは、どこまでがデータでどこからが命令なのかが曖昧だと、誤った解釈や意図しない出力をしやすくなります。
そのため、データ部分と指示部分を明確に区切ることで、AIが正確にタスクを理解し、期待通りの結果を返しやすくなります。

実践のポイント

  • データと指示を区切る方法
    • データ部分と指示部分の間に「—」や「【データ】」「【指示】」などの区切りを入れる
    • XML風タグ(例: <data>… </data>)でデータ部分を囲む
    • 先にデータを提示し、その後に「このデータを使って〇〇してください」と明記する

なぜ分けるのか? 

  • AIの誤認識を防ぐ
    • データと指示が混ざっていると、AIがどこまでを情報として扱い、どこからを命令として解釈すればよいか分からなくなり、誤った出力をしやすくなります。
  • 複雑なタスクや長文データでも精度が上がる
    • 特に長文や複数データを扱う場合、区切りを明確にすることでAIの理解度が大きく向上します。

プロンプト例

  • 例1:区切り線を使う
【データ】
---
東京都の人口は約1400万人です。大阪府の人口は約880万人です。
---
【指示】
上記のデータをもとに、東京と大阪の人口差を計算し、簡単に説明してください。

  • 例2:タグを使う
<data>
2024年の売上高は1,200万円、利益は300万円でした。
</data>
【指示】
上記データから利益率(利益÷売上高)を計算し、パーセントで答えてください。


第5章:出力のフォーマットの指定とClaudeの話し方を指示

AIに「どんな形で答えてほしいか」を具体的に指示することで、
• 箇条書き
• 表形式
• JSON形式
• 文章のトーンや話し方
など、出力の見た目やスタイルを自在にコントロールできることを解説しています。

なぜフォーマット指定が重要か? 

  • 出力の見やすさ・使いやすさが大きく向上する
  • 後工程(コピペやデータ処理)がしやすくなる
  • AIが意図を誤解しにくくなる

出力フォーマットの指定

  • 箇条書きで答えさせたい場合
【指示】
以下の内容を3つのポイントに分けて、箇条書きでまとめてください。
  • JSON形式で答えさせたい場合
【指示】
次の情報をJSON形式で出力してください。キーは「title」「summary」「tags」とします。

Claudeの「話し方」や「表現スタイルを指定する」

  • フォーマル/カジュアル/親しみやすい/専門的 など、トーンを明示する
【指示】
以下の内容を、親しみやすい口調で説明してください。
  • 話し言葉/書き言葉の指定
【指示】
以下の内容を、会話調で説明してください。

第6章:予見力(ステップ・バイ・ステップで考える)

AI(特にClaudeなどの大規模言語モデル)に「一気に答えを出させる」のではなく、「順を追って考えさせる」(=ステップ・バイ・ステップ思考)ことで、

  • 複雑な問題や推論
  • 数学的な計算
  • 複数条件の判断

などでより正確で納得感のある回答を得る方法を解説しています。

なぜ「段階的思考」が重要か? 

  • AIが複雑な問題を一度に解決しようとすると、誤答や飛躍が起きやすい
  • 途中の思考過程を明示させることで、論理の飛躍やミスを防げる
  • 人間が答えを検証しやすくなる

ステップ・バイ・ステップ思考の指示例

  • 「段階的に考えてください」や「ステップごとに説明してください」と明記する
【指示】
以下の条件をもとに、どの選択肢が最適かをステップ・バイ・ステップで考えて、理由も説明してください。

【条件】
A案:コストが安いが納期が遅い
B案:コストは高いが納期が早い

  • 複雑なタスクや推論が必要な場合に特に有効
    • 数学の文章題
    • 複数条件の判断
    • 論理的な説明や分析

第7章:例示を活用したFew-Shotプロンプティング

AIに「いくつかの例(サンプル)」をプロンプト内で与えることで、

  • 出力のパターンを学習させる
  • 一貫性のある回答を引き出す
  • 複雑なタスクや分類、フォーマット指定を守らせる

といった効果が得られる Few-Shot Prompting(フューショット・プロンプティング) のテクニックを解説しています。

Few-Shot Promptingのメリット 

  • AIが例示されたパターンを学習しやすくなる
  • 出力の一貫性やフォーマット遵守率が上がる
  • 分類や要約、フォーマット変換など幅広いタスクで有効

Few-Shot Promptingのポイント 

  • 例(サンプル)を2~5件程度、プロンプト内に明示する
  • 例示と同じ形式で新しい入力に対する出力を求める
  • 出力フォーマットや分類基準を守らせたいときに特に有効

プロンプト例

  • 例1:メール分類タスク
【指示】
以下のサポートメールをカテゴリ分類してください。カテゴリは「A:仕様問い合わせ」「B:不良品報告」「C:返品・返金依頼」「D:その他」の4種類です。まずは例を示します。

【例1】
<email>
件名:ブレンダーの使い方について  
本文:新しく購入したブレンダーですが、どのように花瓶の掃除に使えますか?  
</email>
→ 出力:A

【例2】
<email>
件名:ブレンダーが動きません  
本文:昨日届いたブレンダーが全く電源が入らず困っています。交換してください。  
</email>
→ 出力:B

【入力】
<email>
件名:返金のお願い  
本文:購入から4か月経ちましたが、まだ返金が完了していません。状況を教えてください。  
</email>

【出力形式】
「カテゴリ:X」のみを一行で記載してください。


第8章:幻覚(Hallucination)の回避

「事実と異なる内容」や「根拠のない情報(ハルシネーション)」を出力しないようにするためのプロンプト設計のコツを解説しています。

ハルシネーションを防ぐためのポイント 

  • 「分からないときは分からない」と答えさせる
    • 例:「情報が不足している場合は『分かりません』と返答してください」と明記する
  • 根拠を先に引用させる
    • 例:「まず、根拠となる文章を引用し、その後で回答してください」
  • 限定された情報源のみを使わせる
    • 例:「以下の文章以外は一切参照せずに答えてください」と明記する
  • 事実に基づいて回答するように指示する
    • 例:「事実が不明な場合は憶測で答えず、『情報が不足しているため回答できません』と記載してください」

プロンプト例

  • 例1:分からないときは分からないと答えさせる
【指示】
もし情報が不足している場合は「分かりません」と返答してください。
  • 例2:根拠を引用させる 
【指示】
以下のレポートから、2022年度の売上高を抜き出し、その数値を回答してください。
・まず <scratchpad> タグの中に「売上高に関する文章」をそのまま引用してください。
・次に <answer> タグの中で数値だけを報告してください。
・もし該当箇所が見つからない場合は「該当なし」と答えてください。
  • 例3:限定された情報源のみを使わせる
【指示】
本質問に回答するために、提供したドキュメント以外の情報は使用しないでください。もし回答できない場合はその旨を記載してください。

第9章:複雑なプロンプトの構築(ユースケース)

これまで学んだプロンプトエンジニアリングのテクニック(明確な指示、ロール指定、データと指示の分離、出力フォーマット指定、ステップバイステップ思考、例示、ハルシネーション回避など)を組み合わせて、現実の業務やアプリケーションで使える「複雑なプロンプト」を自分で設計する方法を解説しています。

プロンプト例

例1. チャットボットのプロンプト設計

  • ユーザーからの問い合わせに対して、正確かつ親切な回答を返すチャットボットを作る
【ロール】
あなたはカスタマーサポート担当のチャットボットです。親切で丁寧な口調で回答してください。

【指示】
ユーザーからの質問に対して、まずは要点を簡潔にまとめて答え、その後に詳細な説明を加えてください。もし情報が不足している場合は「分かりません」と返答してください。

【データ】
<faq>
Q: 商品の返品方法を教えてください。
A: 商品の返品は、商品到着後30日以内であれば可能です。返品フォームに必要事項を記入し、同封の伝票を使って返送してください。
</faq>

【入力】
Q: 商品の保証期間はどれくらいですか?

【出力形式】
1. 要点(1文)
2. 詳細説明(2~3文)

例2. コーディング支援のプロンプト設計

  • ユーザーが書いたコードのバグを見つけて修正案を提案するAIアシスタント
【ロール】
あなたは 10 年以上の経験を持つ Kotlin テックリードです。  
Effective Kotlin・Kotlin Coding Conventions・Android/KMP ベストプラクティスに精通し、バグ検出と設計改善を得意とします。  
レビュー対象は “業務用モジュール” であり、実運用を想定した品質を担保してください。

【背景】
- Kotlin 1.9 / JVM 17 を使用(Android 対応の場合は minSdk 24)  
- 主要ライブラリ:標準ライブラリのみ(追加導入は提案があれば記述)  
- 単体テストは **JUnit 5** + **kotlinx-coroutines-test** を採用  
- 可読性・拡張性を重視し、**KDoc と型の Null-Safety** を必ず付与  
- ビルドツールは **Gradle Kotlin DSL**(`build.gradle.kts`)

【タスク】
1. 以下の Kotlin コードをレビューし、**バグ・アンチパターン・設計上の問題点** を網羅的に指摘してください。  
2. 各指摘には **「理由」** と **「改善方針」** を 1〜2 行で付けてください。  
3. 指摘を踏まえて **修正後の完全なコード** を提示してください。  
4. 修正コードに対する **JUnit 5 用ユニットテスト** を生成してください(正常系/異常系の 2 ケース以上)。  
5. 最後に **改善点の効果を 100 文字以内で要約** してください。  

【入力コード】
```kotlin
fun addNumbers(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    println(addNumbers(2))
}

おわりに

この記事では、Anthropic社の「Anthropic 1P」チュートリアルに沿って、プロンプト精度向上のための実践的なノウハウを日本語でまとめました。
これらを組み合わせることで、モデルが常に意図どおりに動作しやすくなり、品質の高い生成物を得やすくなります。

Jambo Tech Blog

Discussion