実践LESSON 03

この教材で学ぶこと 明確な指示、構造化、評価と改善の技法を学びます。

プロンプトエンジニアリング深掘り

参照コース: https://anthropic.skilljar.com/claude-with-the-anthropic-api(Prompt Engineering セクション)


1. 明確で直接的な指示(Being Clear and Direct)

Claude は指示通りに動くが、曖昧だと平均的な回答になる。

❌ 曖昧: 「このコードをレビューして」

✅ 具体的:
「以下の Python コードを以下の観点でレビューしてください:
1. セキュリティ上の問題(特に入力バリデーション・SQLインジェクション)
2. パフォーマンス上の問題
3. Python らしくない書き方(より Pythonic にできる箇所)

問題がない観点はスキップして、問題がある箇所のみ指摘してください。」

2. XML タグで構造化する

Claude は XML タグで区切られた入力を正確に解釈できる:

<system_context>
  本番 AWS 環境(東京リージョン)
  ECS Fargate + RDS Aurora PostgreSQL 構成
  現在障害対応中
</system_context>

<error_logs>
[2026-03-06 15:00:01] ERROR: Connection pool exhausted (max=20)
[2026-03-06 15:00:03] ERROR: Timeout waiting for connection (30s)
</error_logs>

<constraints>
- データベースの再起動は不可(業務時間中)
- 変更は最小限にする
</constraints>

<task>
原因分析と、データベース再起動なしで即時適用できる対処法を3つ提示してください。
優先度順に並べてください。
</task>

3. Few-shot プロンプト(例を与える)

Claude は例から学ぶ。複雑なフォーマットを指定する時に有効:

以下のフォーマットで Terraform の変数ブロックを書いてください。

【例1】
入力: EC2のインスタンスタイプ(デフォルト: t3.medium、本番: m5.large)
出力:
variable "instance_type" {
  description = "EC2のインスタンスタイプ"
  type        = string
  default     = "t3.medium"
  validation {
    condition     = can(regex("^[a-z][0-9][a-z]?\\.[a-z0-9]+$", var.instance_type))
    error_message = "有効なEC2インスタンスタイプを指定してください"
  }
}

【例2】
入力: RDSのストレージ容量(GB、最小20・最大1000)
出力:
variable "rds_storage_gb" {
  description = "RDSのストレージ容量(GB)"
  type        = number
  default     = 20
  validation {
    condition     = var.rds_storage_gb >= 20 && var.rds_storage_gb <= 1000
    error_message = "ストレージは20GB以上1000GB以下で指定してください"
  }
}

では以下を書いてください:
入力: 環境名(prod/stg/dev の3択、必須)

4. Chain of Thought(段階的推論)

複雑な問題には「考えてから答えさせる」:

以下のアーキテクチャ変更を検討しています。
実施する前に、段階的に考えてください。

変更内容: RDS シングルAZをMulti-AZに変更

Step 1: この変更による影響範囲を洗い出してください
Step 2: 実施中のダウンタイムを見積もってください
Step 3: ロールバック手順を考えてください
Step 4: 変更後の確認項目をリストアップしてください
Step 5: 最終的な推奨実施手順をまとめてください

5. 長いコンテキストの活用(Claude の強み)

Claude は最大200K トークン(約15万語)のコンテキストを持てる:

# Terraform ディレクトリ全体を渡して分析
import os
from pathlib import Path
import anthropic

def read_terraform_files(directory: str) -> str:
    """Terraform ファイルを全て読み込む"""
    content = []
    for path in Path(directory).rglob("*.tf"):
        content.append(f"# {path}\n{path.read_text()}")
    return "\n\n".join(content)

client = anthropic.Anthropic()
tf_content = read_terraform_files("./terraform")

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=4096,
    messages=[{
        "role": "user",
        "content": f"""以下の Terraform コード全体をレビューしてください。

{tf_content}

確認してほしいこと:
1. セキュリティ上の問題(過剰な権限・パブリックアクセス等)
2. コスト最適化の機会
3. 高可用性の観点で不足している設定
4. Terraform のベストプラクティス違反"""
    }]
)

6. プロンプト評価(Evals)

プロンプトを改善する前に評価基準を作る:

import anthropic
import json

client = anthropic.Anthropic()

# テストケースの定義
test_cases = [
    {
        "input": "S3のアクセスログを有効化する Terraform コードを書いて",
        "criteria": [
            "target_bucket が指定されている",
            "target_prefix が設定されている",
            "KMS暗号化について言及している"
        ]
    },
    # ... 他のテストケース
]

def evaluate_response(response: str, criteria: list[str]) -> dict:
    """Claude に採点させる"""
    result = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=512,
        messages=[{
            "role": "user",
            "content": f"""以下の回答が各基準を満たしているか評価してください。
各基準に対して true/false で回答してください。

回答:
{response}

基準:
{json.dumps(criteria, ensure_ascii=False)}

JSON形式で返してください: {{"results": [true/false, ...]}}"""
        }]
    )
    return json.loads(result.content[0].text)

# プロンプトのスコアを計算
def score_prompt(system_prompt: str, test_cases: list) -> float:
    total, passed = 0, 0
    for case in test_cases:
        response = client.messages.create(
            model="claude-opus-4-5",
            max_tokens=1024,
            system=system_prompt,
            messages=[{"role": "user", "content": case["input"]}]
        )
        eval_result = evaluate_response(response.content[0].text, case["criteria"])
        passed += sum(eval_result["results"])
        total += len(case["criteria"])
    return passed / total

7. インフラ業務向けプロンプトテンプレート集

# 障害調査
あなたはシニアSREエンジニアです。
以下の情報から障害の根本原因を特定し、対処法を優先度順に提示してください。
発生時刻・影響範囲・変更履歴・ログを含めて提示します。

# アーキテクチャレビュー
AWS Well-Architected Framework の5つの柱(運用上の優秀性・セキュリティ・信頼性・パフォーマンス効率・コスト最適化)の観点でレビューしてください。
各柱について「現状の問題点」と「改善提案」を具体的に記載してください。

# コード生成
以下の要件でコードを生成してください。
- セキュリティのベストプラクティスを必ず守る
- エラーハンドリングを含める
- 本番環境での使用を想定する
- コメントは必要な箇所のみ(自明な処理にコメント不要)

🔗 次のステップ