生成AI入門 2026.04.19
プロンプトとは?Claude・ChatGPTで質問の質を上げる5つのコツ【コード例付き】
プロンプトとは
プロンプトとは、生成AIに対して「何をしてほしいか」を伝えるテキストです。AIから返ってくる答えの質は、プロンプトの書き方で大きく変わります。
# prompt_comparison.py
# 良いプロンプトと悪いプロンプトの差を実際に確認する
import anthropic
client = anthropic.Anthropic()
def ask(prompt: str) -> str:
response = client.messages.create(
model="claude-haiku-4-5-20251001", # 試験用にHaikuを使用(低コスト)
max_tokens=512,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
# ❌ 曖昧なプロンプト
vague = ask("料理を教えて")
print("曖昧なプロンプトの結果:", vague[:200])
# ✅ 具体的なプロンプト
specific = ask(
"30分で作れる夫婦2人分の夕食レシピを1つ教えてください。"
"冷蔵庫にはキャベツと人参があります。"
"予算は500円以内。辛いものは避けてください。"
"材料リストと手順を箇条書きで出力してください。"
)
print("具体的なプロンプトの結果:", specific[:200])
コツ1:役割を設定する(System Prompt)
# role_prompting.py
# APIでは system パラメータで役割を固定できる
import anthropic
client = anthropic.Anthropic()
def ask_with_role(role: str, user_message: str) -> str:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=512,
system=role, # 役割をシステムプロンプトで設定
messages=[{"role": "user", "content": user_message}]
)
return response.content[0].text
# 同じ質問でも役割で答えが変わる
question = "Pythonのリストとタプルの違いを教えて"
print("=== 初心者向け解説 ===")
answer_beginner = ask_with_role(
"あなたはプログラミング未経験者向けに教えるやさしい先生です。専門用語を避け、日常的な比喩で説明してください。",
question
)
print(answer_beginner)
print("\n=== 上級者向け解説 ===")
answer_expert = ask_with_role(
"あなたはPythonのコアデベロッパーです。内部実装・メモリ効率・パフォーマンスの観点から簡潔に説明してください。",
question
)
print(answer_expert)
コツ2:出力形式を指定する
# output_format.py
# ❌ 形式未指定(毎回バラバラな構造が返ってくる)
result = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=256,
messages=[{"role": "user", "content": "FastAPIのメリットを教えて"}]
)
# ✅ 形式を明示(後続処理がしやすくなる)
result = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=512,
messages=[{"role": "user", "content": """
FastAPIのメリットを以下のJSON形式で3つ出力してください:
{
"merits": [
{"title": "メリット名", "description": "説明(1文)", "use_case": "適した場面"}
]
}
JSON以外の文章は不要です。
"""}]
)
import json
data = json.loads(result.content[0].text)
for m in data["merits"]:
print(f"✅ {m['title']}: {m['description']}")
コツ3:ピンク象問題を避ける(否定形→肯定形)
# pink_elephant_problem.py
# 「〇〇しないで」は逆効果になりやすい
client = anthropic.Anthropic()
def compare_negation(task: str):
# ❌ 否定形(避けてほしいことを言う)
negative = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=128,
messages=[{"role": "user", "content": f"以下の文章を要約してください。箇条書きにしないでください。\n\n{task}"}]
)
# ✅ 肯定形(してほしいことを言う)
positive = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=128,
messages=[{"role": "user", "content": f"以下の文章を2〜3文の流れるような文章で要約してください。\n\n{task}"}]
)
print(f"否定形: {negative.content[0].text}")
print(f"肯定形: {positive.content[0].text}")
compare_negation("Pythonは1991年に生まれたプログラミング言語で、読みやすい構文と豊富なライブラリが特徴です。")
コツ4:コンテキスト(背景情報)を渡す
# context_prompting.py
# 背景があると、AIは状況に合った答えを返せる
PROMPT_WITH_CONTEXT = """
# 背景
- 私は5人のスタートアップのCTOです
- 現在Ruby on Railsのモノリスをマイクロサービスに移行中
- チームのPythonスキルは低め
- AWSをメインに使っている
# 質問
バックエンドAPIに FastAPI か Django REST Framework のどちらを採用すべきですか?
200字以内で推薦と理由を教えてください。
"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=512,
messages=[{"role": "user", "content": PROMPT_WITH_CONTEXT}]
)
print(response.content[0].text)
コツ5:具体例を示す(Few-Shot)
# few_shot_prompting.py
# 例を1〜2つ見せると、書き方の癖をAIが学習する
PROMPT_FEW_SHOT = """
以下の形式でGitコミットメッセージを生成してください。
例1:
変更: ユーザー登録フォームにメールバリデーションを追加
コミット: feat: add email validation to user registration form
例2:
変更: データベース接続のタイムアウト時間を30秒から60秒に変更
コミット: fix: increase DB connection timeout to 60s
---
変更: ログイン時の失敗回数を記録してアカウントロック機能を追加
コミット:
"""
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=64,
messages=[{"role": "user", "content": PROMPT_FEW_SHOT}]
)
print(response.content[0].text.strip())
# 期待: feat: add account lockout after multiple login failures
まとめ:プロンプトの4要素テンプレート
# prompt_template.py
# 再利用できるプロンプトテンプレート
def build_prompt(
role: str,
task: str,
context: str,
output_format: str,
) -> str:
return f"""
# 役割
{role}
# タスク
{task}
# 背景・制約
{context}
# 出力形式
{output_format}
""".strip()
# 使用例
prompt = build_prompt(
role="シニアエンジニアとして、コードレビューの指摘をしてください",
task="以下のPythonコードの問題点を指摘してください",
context="対象は初心者エンジニアが書いたコードです。厳しすぎず、学習に繋がるフィードバックをお願いします",
output_format="問題点を箇条書きで3つ以内、各問題に改善案を1文で添えてください"
)
print(prompt)
あわせて読みたい
- Claude CodeとContext Skillsで開発効率を上げる7つのテクニック
- Claude APIプロキシサーバーをFastAPI+Dockerで作る【curlテスト付き】
- Claude Sonnet APIコスト完全解説|トークン計算・バッチ割引・月額試算