「Claude APIを使ってみたけど、なんか回答がイマイチ…」「もっとこういう答え方をしてほしいのに」と感じたことはありませんか?

そのモヤモヤ、システムプロンプトの設計で一気に解決できるかもしれません!

Claude APIには「システムプロンプト」と呼ばれる、AIへの事前指示を書く専用のフィールドがあります。ここをしっかり設計するだけで、回答の品質・一貫性・使いやすさが劇的に変わります。

今回は、システムプロンプトの基本から、役割・制約・出力形式それぞれの設計パターンまで、Pythonのサンプルコードを交えながら丁寧に解説していきます。

📌 対象読者:Claude APIを使い始めた初〜中級者の方

システムプロンプトとは?まず「役割」をざっくり理解しよう

AI prompt design
AI prompt design / Photo by Google DeepMind via Pexels

システムプロンプトとは、会話が始まる前にAIへ渡す「前提指示」のことです。

イメージとしては、新入社員に最初に渡すマニュアルのようなもの。「あなたはこういう役割で、こういうルールで動いてください」と事前に伝えておく仕組みです。

ユーザーが送るメッセージとは別フィールドで設定できるので、会話のたびに毎回指示を書く必要がなく、一度書けば全会話に一貫して適用されるのが大きなメリットですよね。

Claude APIのPythonコードでは、こんな形で渡します:

import anthropic

client = anthropic.Anthropic()

# システムプロンプトを設定してメッセージを送る
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    system="あなたはPython専門のプログラミング講師です。初心者にも分かりやすい言葉で丁寧に説明してください。",  # ← ここがシステムプロンプト
    messages=[
        {"role": "user", "content": "forループの使い方を教えてください"}
    ]
)

print(response.content[0].text)

ポイントをまとめるとこんな感じです👇

  • system パラメータに文字列で指示を書く
  • messagesuser ロールとは完全に分離されている
  • 会話履歴に追加されないため、トークン消費を抑えながら全会話に適用できる

【設計パターン①】役割(ペルソナ)を明確に定義する

システムプロンプトの中で最も効果が高いのが、AIに具体的な役割を与えることです。

「あなたはAIアシスタントです」という曖昧な指示より、「あなたはPython歴10年のバックエンドエンジニアで、コードレビューを専門としています」のように具体的に設定するほうが、ずっと質の高い回答が返ってきます。

役割定義のコツは3つです:

  1. 職種・専門領域を明示する(例:「Pythonの専門家」「法律の素人向けアドバイザー」)
  2. 経験や知識レベルを添える(例:「10年以上の経験を持つ」「初心者目線で」)
  3. スタンス・姿勢を指定する(例:「批判的思考で指摘する」「背中を押す前向きなコメントをする」)
import anthropic

client = anthropic.Anthropic()

# 具体的な役割設定の例
system_prompt = """
あなたはPython歴10年のシニアバックエンドエンジニアです。
コードレビューを専門としており、以下のスタンスで回答してください:

- バグ・セキュリティリスクは必ず指摘する
- 改善案はコード例とともに提示する
- 良い点もセットでフィードバックする
- 初心者にも伝わる言葉を選ぶ
"""

user_code = """
def get_user(user_id):
    query = f"SELECT * FROM users WHERE id = {user_id}"
    return db.execute(query)
"""

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    system=system_prompt,
    messages=[
        {"role": "user", "content": f"このコードをレビューしてください:\n{user_code}"}
    ]
)

print(response.content[0].text)

上のコード、SQLインジェクションのリスクが含まれていますよね。役割を明確に定義したシステムプロンプトを使うと、こういったセキュリティ問題をしっかり指摘してくれるようになります。

【設計パターン②】制約(やってはいけないこと)を設定する


役割の次に重要なのが制約の設定です。AIはデフォルトでは広い範囲の話題に答えようとします。用途に合わせて「これはやらない」を明確にすることで、アプリとして一貫した動作を実現できます。

制約を書くときのポイントは「否定形よりも肯定形で書く」こと。

❌ 悪い例:「政治の話はしないでください」
✅ 良い例:「回答はプログラミングと技術に関する質問のみに限定してください。それ以外の話題は丁重にお断りください」

肯定的な言い回しのほうが、AIが意図を正確に解釈しやすくなります。

import anthropic

client = anthropic.Anthropic()

# 制約を含むシステムプロンプト
system_prompt = """
あなたはPython学習サポートBotです。

【担当範囲】
- Pythonの文法・ライブラリに関する質問
- エラーメッセージの解説とデバッグサポート
- コードの改善提案

【対応しないこと】
- Pythonと無関係な質問には「Pythonに関する質問にのみお答えできます」と伝えてください
- 具体的なコードを書いてほしいだけの依頼には、まず考え方のヒントを提示してください
- 個人情報・機密情報が含まれるコードへの言及は避けてください
"""

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=512,
    system=system_prompt,
    messages=[
        {"role": "user", "content": "今日のランチのおすすめを教えてください"}
    ]
)

# 制約によって、範囲外の質問には誘導が返ってくる
print(response.content[0].text)

【設計パターン③】出力形式(フォーマット)を指定する

「毎回回答の形式がバラバラで扱いにくい…」という経験はありませんか?

これも出力フォーマットの指定でほぼ解決できます。特にMarkdown・JSON・箇条書きなど、後続の処理やUI表示に合わせたフォーマットを指定するのが実践では超重要です。

フォーマット指定のベストプラクティスはこちら👇

  • 「〜の形式で答えてください」と具体的に書く
  • 可能なら出力例を1つ添える(few-shot)
  • 「余分な説明文は不要です」など不要な要素も明示する
import anthropic
import json

client = anthropic.Anthropic()

# 出力フォーマットを明確に指定するシステムプロンプト
system_prompt = """
あなたはPythonのエラー解析エキスパートです。
エラーメッセージを受け取ったら、必ず以下のJSON形式のみで回答してください。
余分な説明文や前置きは不要です。

出力形式:
{
  "error_type": "エラーの種類(例:TypeError)",
  "cause": "原因の説明(1〜2文)",
  "fix": "修正方法の説明(1〜2文)",
  "fixed_code": "修正後のコード例(文字列)"
}
"""

error_message = """
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Line 5: result = count + user_input
"""

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=512,
    system=system_prompt,
    messages=[
        {"role": "user", "content": f"このエラーを解析してください:\n{error_message}"}
    ]
)

# JSON形式で返ってくるのでそのままパースできる
result_text = response.content[0].text
try:
    result = json.loads(result_text)
    print("エラー種類:", result["error_type"])
    print("原因:", result["cause"])
    print("修正方法:", result["fix"])
except json.JSONDecodeError:
    print("フォーマット外の回答:", result_text)

システムプロンプトを組み合わせるときの構成テンプレート

役割・制約・出力形式の3要素を組み合わせると、実用的なシステムプロンプトが完成します。

以下は汎用的に使えるテンプレートです:

system_prompt = """
# 役割
あなたは〇〇の専門家です。〇〇な経験を持ち、〇〇を得意としています。

# 対象ユーザー
Python初〜中級者を対象に、難しい言葉を避けて丁寧に説明してください。

# 担当する質問の範囲
- 〇〇に関する質問
- 〇〇のサポート

# 対応しないこと
- 範囲外の質問には「〇〇に関する質問のみお答えできます」と伝えてください

# 回答フォーマット
1. 結論を最初に1文で書く
2. 理由・詳細を箇条書きで3点以内にまとめる
3. コードが必要な場合はコードブロックで示す
4. 最後に「試してみてください!」で締める
"""

このテンプレートを自分のユースケースに合わせてカスタマイズするだけで、すぐに使える品質のシステムプロンプトが作れます。

システムプロンプト設計でよくある失敗パターン ⚠️

最後に、設計でやりがちなミスをまとめておきます。確認しておきましょう。

  • 指示が曖昧すぎる:「丁寧に答えてください」だけでは足りない。何がどう「丁寧」なのかを具体化する
  • 矛盾した指示を入れる:「簡潔に答えてください」「詳しく説明してください」を同時に書くと混乱する
  • 指示が長すぎる:ルールが多すぎるとAIが守りきれなくなる。重要な3〜5項目に絞る
  • 出力例を書かない:フォーマット指定は言葉だけより、例を1つ添えると格段に精度が上がる

まとめ


今回は、Claude APIのシステムプロンプト設計について、3つの設計パターン(役割・制約・出力形式)を中心に解説しました。

ポイントをおさらいすると、役割を具体的に定義し、制約は肯定形で書き、出力形式は例付きで指定する、この3つを押さえるだけで回答品質はぐっと上がります。

「むずかしそう」と思っていたプロンプト設計も、テンプレートを使えばすぐ試せますよね。ぜひ今日から自分のプロジェクトに組み込んでみてください!🚀

Claude APIのさらに実践的な活用方法(構造化出力・ストリーミング・チャットボット設計など)は、このブログの関連記事でも詳しく解説しています。一緒に学んでいきましょう!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。