実践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つの柱(運用上の優秀性・セキュリティ・信頼性・パフォーマンス効率・コスト最適化)の観点でレビューしてください。
各柱について「現状の問題点」と「改善提案」を具体的に記載してください。
# コード生成
以下の要件でコードを生成してください。
- セキュリティのベストプラクティスを必ず守る
- エラーハンドリングを含める
- 本番環境での使用を想定する
- コメントは必要な箇所のみ(自明な処理にコメント不要)
🔗 次のステップ
- 03_API活用.md — Tool Use・RAG の実装
- ../MCP/01_MCP入門.md — MCP でプロンプトをテンプレート化