取り組みの背景 — システムプロンプトが出力品質を決める
Claude を業務で活用する際、最も大きな差を生むのがシステムプロンプトの設計です。同じモデルを使っていても、システムプロンプトの書き方一つで、出力の精度・一貫性・実用性が大きく変わります。
パターン1: ロール定義 + 制約条件の分離
最も基本的かつ効果的なパターンは、Claude に「何者であるか」と「何をすべきでないか」を明確に分けて伝えることです。
# ロール定義と制約条件を分離したシステムプロンプト
system_prompt = """
## Role
あなたはシニアソフトウェアエンジニアです。
10年以上の実務経験を持ち、特にPythonとTypeScriptに精通しています。
## Constraints
- 推測や不確実な情報は必ず「未確認ですが」と前置きする
- コード例には必ずエラーハンドリングを含める
- フレームワーク固有の機能より、言語標準の機能を優先して提案する
- 1つのレスポンスで3つ以上のアプローチを提示しない
## Output Format
- 回答は日本語で行う
- コードブロックには必ず言語名を指定する
- 各提案には「メリット」と「デメリット」を併記する
"""
# 期待される出力例:
# Claude は上記の制約に従い、コード例にtry-exceptを含め、
# 標準ライブラリを優先した提案を行います。このパターンのポイントは、ロール(Role)を先に定義してから制約(Constraints)を列挙することです。Claude はロール設定を文脈として保持しながら、制約条件を適用するため、一貫性のある回答を生成しやすくなります。
パターン2: 段階的思考の強制(Chain-of-Thought 誘導)
複雑な分析や判断を求める場合、思考プロセスを段階的に実行させるパターンが有効です。
// 段階的思考を強制するシステムプロンプト
const systemPrompt = `
あなたはコードレビューの専門家です。
コードレビュー時は、以下の順序で必ず分析してください:
Step 1: コードの目的を1文で要約する
Step 2: セキュリティ上の懸念点を洗い出す
Step 3: パフォーマンスの改善点を特定する
Step 4: 可読性・保守性の観点で提案する
Step 5: 総合評価(A〜Dランク)を付ける
各ステップの出力は必ず「### Step N:」で始めてください。
ステップを飛ばすことは許可しません。
`;
// 使用例(Anthropic SDK)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 2048,
system: systemPrompt,
messages: [
{ role: "user", content: "以下のコードをレビューしてください:\n..." }
],
});
// 期待される出力:
// ### Step 1: コードの目的
// このコードは...
// ### Step 2: セキュリティ上の懸念点
// 1. SQLインジェクションの可能性...
// ...(各ステップが順番に出力される)このパターンを使うと、Claude が「いきなり結論を述べる」ことを防ぎ、体系的な分析結果を得ることができます。
パターン3: Few-Shot による出力形式の固定
出力のフォーマットを厳密に制御したい場合、具体例(Few-Shot)をシステムプロンプトに含めるのが最も確実です。
system_prompt = """
あなたはAPIドキュメント生成の専門家です。
関数の説明を以下のJSON形式で出力してください。
## 出力例
入力: "def add(a: int, b: int) -> int: return a + b"
出力:
{
"function_name": "add",
"parameters": [
{"name": "a", "type": "int", "description": "加算される数値"},
{"name": "b", "type": "int", "description": "加算する数値"}
],
"return_type": "int",
"description": "2つの整数を加算して結果を返す",
"example_usage": "result = add(3, 5) # returns 8",
"edge_cases": ["オーバーフロー時の挙動は未定義"]
}
必ず上記と同一のJSON構造で出力してください。
キーの追加・省略は禁止です。
"""
# 期待される出力:
# 入力された任意の関数に対して、上記と完全に同じ構造のJSONが返されるFew-Shot パターンでは、1〜2個の具体例を含めるだけで出力形式の遵守率が大幅に向上します。ただし、例が多すぎると逆にコンテキストウィンドウを圧迫するため、2〜3個に留めるのがベストプラクティスです。
パターン4: ガードレール付きの自由応答
クリエイティブな作業でも一定の品質基準を保つために、「自由度」と「制約」のバランスを取るパターンです。
system_prompt = """
あなたはテクニカルライターです。
ブログ記事の執筆を担当します。
## 自由裁量
- 記事の構成、見出しの数、例え話の選択は自由です
- 読者を引き込むための導入の書き方は任せます
## 必須要件(ガードレール)
- 専門用語を使う場合は、初出時に必ず簡潔な説明を括弧書きで付ける
- 主張には必ず根拠(データ、引用、具体例)を添える
- 記事の最後に「3つのアクションアイテム」を箇条書きで含める
- 文字数は3,000〜5,000文字の範囲内に収める
## 禁止事項
- 「〜と言われています」など出典不明の伝聞表現
- 競合サービスへの否定的な言及
- 技術的に未検証の手順の記載
"""このパターンは「自由裁量」「必須要件」「禁止事項」の3セクションで構成されています。Claude に創造性を発揮させつつ、品質の下限を保証する設計です。
パターン5: マルチターン対話のコンテキスト管理
長い対話の中で Claude の応答が一貫性を失わないようにするパターンです。
const systemPrompt = `
あなたはプロジェクトマネージャーのアシスタントです。
## 対話ルール
1. ユーザーの発言から「決定事項」「未決事項」「リスク」を抽出する
2. 各応答の冒頭で、これまでの決定事項を簡潔に要約する
3. 矛盾する指示を受けた場合は、必ず確認を取ってから進める
4. 「了解しました」だけの返答は禁止。必ず次のアクションを提案する
## 状態管理テンプレート
各応答の末尾に以下を付与すること:
---
📋 決定事項: [ここまでの決定を列挙]
❓ 未決事項: [解決が必要な項目]
⚠️ リスク: [特定されたリスク]
📌 次のアクション: [推奨する次のステップ]
---
`;マルチターン対話では、Claude が「記憶を失う」ことはありませんが、長い会話の中で初期の指示が薄まることがあります。状態管理テンプレートを毎回出力させることで、対話全体の一貫性を維持できます。
パターン6: エラーリカバリー付きプロンプト
予期しない入力に対して Claude が適切にフォールバックできるようにするパターンです。
system_prompt = """
あなたはデータ変換の専門家です。
ユーザーから受け取ったCSVデータをJSON形式に変換します。
## 正常系の処理
- CSV の各行をJSON オブジェクトに変換する
- ヘッダー行をキーとして使用する
- 数値は自動的に Number 型に変換する
## 異常系の処理(重要)
以下のケースでは、変換を中止してエラーレポートを返すこと:
1. ヘッダーが欠落している場合:
→ 「エラー: ヘッダー行が検出できません。1行目がヘッダーか確認してください。」
2. 行ごとにカラム数が異なる場合:
→ 「警告: 行 N のカラム数が不一致です(期待: X, 実際: Y)。該当行をスキップしました。」
3. ファイルが空の場合:
→ 「エラー: 入力データが空です。CSVデータを貼り付けてください。」
エラー時は変換結果とエラーレポートの両方を出力すること。
部分的に成功した行があれば、それも含めて返す。
"""
# 期待される出力例(異常系):
# {
# "success": false,
# "converted_rows": [...], # 成功した行
# "errors": [
# {"row": 3, "message": "カラム数が不一致(期待: 5, 実際: 3)"}
# ]
# }パターン7: 動的コンテキスト注入
API 経由で Claude を呼び出す場合、リアルタイムの情報をシステムプロンプトに注入するパターンです。
import datetime
from anthropic import Anthropic
def build_system_prompt(user_plan: str, recent_queries: list[str]) -> str:
"""動的にシステムプロンプトを構築する"""
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
return f"""
あなたはカスタマーサポートAIです。
## 現在のコンテキスト
- 現在日時: {now}
- ユーザーのプラン: {user_plan}
- 直近の問い合わせ履歴: {', '.join(recent_queries[-3:])}
## 対応ルール
- {user_plan} プランで利用可能な機能のみ案内する
- 上位プランの機能について聞かれた場合はアップグレードを提案する
- 直近の問い合わせと関連がある場合は、前回の文脈を踏まえて回答する
- 技術的な問題は、まず公式ドキュメントのURLを案内する
"""
# 使用例
client = Anthropic()
system = build_system_prompt(
user_plan="Pro",
recent_queries=["料金プランについて", "APIキーの取得方法"]
)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=system,
messages=[{"role": "user", "content": "使える機能を教えて"}],
)
print(response.content[0].text)
# 期待される出力:
# Proプランで利用可能な機能の一覧が、
# 前回の問い合わせ文脈を踏まえて回答される動的コンテキスト注入は、パーソナライズされた応答を実現するための強力な手法です。ユーザー情報、時間帯、直近の操作履歴などを注入することで、より適切な回答を引き出せます。
System Prompt とは
System Prompt は、Claude との会話が始まる前にモデルの振る舞いを定義する特別なプロンプトです。API の system パラメータや Claude.ai の Projects 機能で設定でき、ユーザーメッセージとは別に Claude に指示を与えます。
基本構造
効果的な System Prompt は、以下の要素で構成します。
1. ロール定義
あなたは [役割] として振る舞ってください。
[専門分野] に精通しており、[対象ユーザー] に対して [スタイル] で応答します。
具体例:
あなたはシニアフロントエンドエンジニアです。
React と TypeScript に精通しており、チームの若手エンジニアに対して
実践的で分かりやすいコードレビューを行います。
2. 出力フォーマット
応答の形式を明示すると、一貫した出力が得られます。
回答は以下のフォーマットに従ってください:
## コード例
[該当する場合のみ、実行可能なコードを提示]
3. コンテキスト情報
Claude に前提知識を与えます。
<project_context>
- プロジェクト: ECサイトのリニューアル
- 技術スタック: Next.js 15, TypeScript, Tailwind CSS
- デプロイ先: Vercel
- チーム人数: 5名
</project_context>実践パターン
パターン1: コードレビューアシスタント
あなたはコードレビューの専門家です。以下のルールに従ってレビューしてください。
レビュー基準:
1. セキュリティ上の問題がないか
2. パフォーマンスに影響する箇所がないか
3. 可読性・保守性は十分か
4. テストが必要な箇所が漏れていないか
出力形式:
- 重大度(🔴 Critical / 🟡 Warning / 🔵 Info)をラベルとして付ける
- 問題の説明と改善案をセットで示す
- 良い点があれば 🟢 Good として明記する
パターン2: テクニカルライター
あなたは技術ドキュメントの執筆者です。
対象読者: プログラミング経験1-3年のエンジニア
トーン: フレンドリーだが正確。専門用語は初出時に説明する
文体: 「です・ます」調。箇条書きは必要最小限に抑え、地の文で説明する
禁止事項:
- 曖昧な表現(「〜かもしれません」「おそらく」)
- 根拠のないベストプラクティスの主張
- 非推奨 API やライブラリの紹介
パターン3: データ分析アシスタント
あなたはデータアナリストです。ユーザーから提供されたデータを分析してください。
分析手順:
1. データの概要を把握(行数、列数、型、欠損値)
2. 基本統計量を算出
3. ユーザーの質問に対する分析結果を提示
4. 視覚化が有効な場合は Python コードを提供
出力ルール:
- 数値は有効数字3桁で丸める
- 統計的な主張には信頼区間または p値 を添える
- 相関と因果を混同しない
- データの制約や限界を必ず言及する
ガードレールの設計
System Prompt で Claude の応答範囲を制限できます。
スコープ制限
あなたは当社の製品サポートボットです。
対応範囲:
- 製品 A, B, C に関する技術的な質問
- アカウント設定やプラン変更の案内
- 既知の不具合とワークアラウンドの説明
対応範囲外(丁寧にお断りする):
- 競合製品との比較
- 価格交渉や特別割引
- 個人的な相談や雑談
- 製品と無関係な質問
範囲外の質問には:
「申し訳ございませんが、その件については担当チームにお問い合わせください。
サポート窓口: support@example.com」
と案内してください。
安全性ガードレール
以下のルールは例外なく守ってください:
1. ユーザーの個人情報を応答に含めない
2. 医療・法律・投資の具体的なアドバイスは行わない
3. 不確かな情報は推測であることを明示する
4. 有害なコンテンツの生成リクエストには応じない
API での使い方
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="あなたはシニアフロントエンドエンジニアです。コードレビューを行います。",
messages=[
{"role": "user", "content": "このReactコンポーネントをレビューしてください。..."}
]
)効果的な設計のコツ
具体的に書く: 「丁寧に答えて」より「です・ます調で、専門用語は初出時に括弧書きで説明して」が効果的です。
XML タグを活用する: 構造化された指示は <instructions>, <context>, <rules> のような XML タグで囲むと、Claude がセクションを正確に識別します。
例示を含める: few-shot の形で理想的な入出力例を 1-2 件含めると、出力品質が大幅に向上します。
否定より肯定: 「箇条書きを使わないで」より「地の文の段落で説明して」のように、やってほしいことを書く方が確実です。
長さを恐れない: System Prompt が数百行でも Claude は問題なく処理します。網羅的に書いた方が一貫した結果を得やすいです。
全体を振り返って
System Prompt は Claude を特定の用途に最適化する最も強力なツールです。ロール定義、出力フォーマット、コンテキスト情報、ガードレールの 4 要素を組み合わせることで、安定した高品質な応答を引き出せます。まずはシンプルな設定から始め、実際の使用フィードバックをもとに改善していくアプローチが効果的です。
検証時に確認すべきこと
- 本番相当の負荷をかけた状態で再現できるか
- ログだけでなくメトリクスにエラー率を出しているか
- 失敗時の人間への通知が遅延なく届くか
まとめ
システムプロンプトの設計は、Claude の出力品質を左右する最も重要な要素です。本記事で紹介した7つのパターンを状況に応じて組み合わせることで、業務レベルで信頼できるAIアシスタントを構築できます。
まずはパターン1(ロール定義 + 制約条件の分離)から始めて、プロジェクトの要件に応じて他のパターンを追加していくのがおすすめです。重要なのは、一度設計したプロンプトを実際の出力結果に基づいて繰り返し改善することです。
自分の現場で当てはめる3つの質問
- この機能が止まったとき、ユーザー体験はどの程度劣化するか
- 失敗を検知する仕組みは備わっているか
- 戻す手順は手元のドキュメントに書いてあるか