AI入門ガイド
良いプロンプトの書き方:5つの部分とビフォーアフターの例
曖昧な一行のリクエストを、タスク、コンテキスト、フォーマット、例、ルールを含むプロンプトに変え、OpenAI互換APIを通して送信します。

あなたのモデルは、月曜日には顧客メールを3段落で要約し、火曜日には2つの箇条書きで要約します。同じプロンプト、同じモデルです。これが一行のリクエストがすることです。すべての決定をモデルに任せ、モデルは毎回異なる決定を下します。
優れたプロンプトは5つの質問に答えます。何をするか(タスク)、何を扱うか(コンテキスト)、答えはどのような形であるべきか(フォーマット)、良い答えとはどのようなものか(例)、何を避けるべきか(制約)です。以下では、1つの曖昧なリクエストが構造化されたものになり、OpenAI互換のCheapTokens APIを通り、長いプロンプトが請求額に何を加えるかがわかります。
なぜ「このメールを要約して」はギャンブルなのか#
「このメールを要約して」と入力するとき、あなたはすでに頭の中に答えを持っています。一文で、どれほど緊急か、次に何をすべきか。モデルはその絵を見ることができません。だから推測し、その推測はすべて合理的です。それらを合わせると、実行するたびに異なる答えが得られ、答えを読み取るスクリプトには安定して解析できるものがありません。
OpenAIのプロンプトエンジニアリングガイド(2026年10月27日閲覧)は、この考えを簡潔に述べています。プロンプトエンジニアリングとは効果的な指示を書くことであり、GPTモデルはタスクを達成する方法を明示的に指示するとより良く機能します。この習慣はテキストに限りません。2026年10月26日、あるTelegramチャンネルが30秒の生成動画のプロンプトを共有しました。それはブロックに分割されていました。シーン、ビジュアルスタイル、対話、音声と除外事項、技術仕様です。異なるタスク、同じ動きです。作者はすべての決定をモデルに任せるのではなく、事前に明示しました。
自分で試す試してみましょう:「このメールを要約して」からモデルは何を推測しなければならないでしょうか?答えを表示
長さ(一行かページか)、読者(あなたか顧客か)、答えの形(散文、箇条書き、JSON)、何が重要か、メールに書かれていない場合にどうするか。これらはすべてプロンプトが解決できることです。
5つの部分を平易な言葉で#
新しい同僚の初日にブリーフィングすることを考えてみてください。「これに対処して」では推測になります。仕事、資料、希望する形式、サンプル、「してはいけないこと」を書いた付箋があれば、意図したものが得られます。
タスクは1つの動詞と1つの目的語です。「メールを要約し、緊急度を評価して」。文字通りに。 「このメールを手伝って」はタスクではありません。
コンテキストはモデルが扱う資料です。メール、製品説明、ポリシー。モデルはトレーニングで学んだことと、あなたが貼り付けたものだけを知っています。貼り付けたテキストは、<email>…</email>のようなXMLスタイルのタグやマークダウンヘッダーなどの区切り文字で囲み、指示がテキストと混同されないようにします。OpenAIのガイドは両方を提案しています。
フォーマットは答えがどのような形かです。「summary、urgency、next_stepというキーを持つJSON」または「3つの箇条書き、それぞれ最大12語」。コードが返信を読む場合に最も重要です。
例は、望む出力を持つ1つの入力です。ガイドは、多様な入力と望ましい出力をカバーする少数ショットの例を推奨しています。1つの例は良いスタートです。入力が大きく異なる場合は2つ目を追加します。
制約は「してはいけないこと」です。メールの事実のみを使用し、欠けている場合は「unknown」と書き、返金や割引はしない。

順序も少し重要です。同じガイドによると、開発者またはシステムメッセージは通常、アイデンティティ、指示、例、コンテキストの順に進み、コンテキストはリクエスト間で変わるため最後近くに属します。ルールはシステムメッセージに入れ、入力はユーザーメッセージに入れます。
ペアを合わせる
プロンプトの各部分を、それが答える質問と一致させましょう
左の項目をタップしてから、そのペアをタップ
- タスクモデルは何をすべきか?
- コンテキストどの資料を扱うか?
- フォーマット答えはどのような形であるべきか?
- 例良い答えとはどのようなものか?
- 制約何をしてはいけないか?
ビフォーアフター:顧客メール#
これが一行のリクエストと、5つの部分すべてを含む同じリクエストの比較です。メール自体がコンテキストであり、ユーザーメッセージに入り、<email>タグで囲まれます。
比較する
1つのリクエスト、2つのプロンプト
ビフォー
Summarize this email.アフター
You summarize customer emails for a support team.
Task: Summarize the email in the <email> tags and rate how urgent it is.
Format: Reply with JSON only, using the keys "summary" (one sentence), "urgency" ("low", "medium" or "high") and "next_step" (one short sentence).
Example:
<email>Hi, order 1042 was due Monday and it's Thursday. Where is it?</email>
{"summary": "Order 1042 is three days late and the customer asks where it is.", "urgency": "medium", "next_step": "Check the carrier tracking for order 1042 and reply with the status."}
Rules:
- Use only what the email says. If something is missing, write "unknown".
- Don't offer refunds or discounts.
- Output nothing outside the JSON.「アフター」を上から下に読むと、各部分を指摘できます。冒頭の行とタスク、フォーマット行、例、ルール。メールは意図的にテキストから欠落しています。リクエストごとに変わるため、別に運ばれます。

APIを通して送信する#
指示は決して変わらないので、定数に住み、最初に行きます。メールは変わるので、最後に行きます。これがスクリプト全体で、CheapTokensを指すOpenAI Python SDKを使用しています。モデルはDeepSeek-V4-Flashです。380Kコンテキスト、回答あたり最大32,768出力トークン、いつでも同じ価格。ベースURLとモデルIDはCheapTokensドキュメントから取得してください。まだキーがない場合は、最初のAPIリクエストが手順を説明します。
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
SYSTEM_PROMPT = """You summarize customer emails for a support team.
Task: Summarize the email in the <email> tags and rate how urgent it is.
Format: Reply with JSON only, using the keys "summary" (one sentence), "urgency" ("low", "medium" or "high") and "next_step" (one short sentence).
Example:
<email>Hi, order 1042 was due Monday and it's Thursday. Where is it?</email>
{"summary": "Order 1042 is three days late and the customer asks where it is.", "urgency": "medium", "next_step": "Check the carrier tracking for order 1042 and reply with the status."}
Rules:
- Use only what the email says. If something is missing, write "unknown".
- Don't offer refunds or discounts.
- Output nothing outside the JSON.
"""
email = "Hello, I was charged twice for my subscription this month. Please fix it before Friday, my card is almost at its limit."
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"<email>\n{email}\n</email>"},
],
)
reply = response.choices[0].message.content
print(json.loads(reply))
print(response.usage.prompt_tokens, response.usage.completion_tokens)フォーマット行が役割を果たした場合、返信はsummary、urgency、next_stepを持つ1つのJSONオブジェクトで、json.loadsがそれを辞書に変換します。エラーが発生した場合、モデルはJSONを余分なテキストで包んでいます。最後のルールを厳しくするか、2つ目の例を追加してください。最後の行は、入力と出力のトークン数を出力します。これが次のセクションの話題です。
余分な言葉のコスト#
トークンは単語の一部です。送信するもの(入力)とモデルが書くもの(出力)に対してトークンごとに支払い、出力の方が高価です。詳細は入力トークンと出力トークンをご覧ください。
1日1,000通のメールを扱うサポートボットを実行し、メールが約300トークンだとします。一行のリクエストは約10トークンの指示を追加するので、約310が入力されます。自由形式の要約が約250トークン得られると仮定します。上記のシステムプロンプトは約200トークンで、<email>タグに約10トークン追加されるので、約500が入力されます。フォーマット行が答えを約80トークンのJSONに保つと仮定します。DeepSeek-V4-Flashでは、一行のリクエストでメールあたり$0.00003、構造化プロンプトで$0.000016です。プロンプトは長くなりましたが、リクエストは安くなりました。長い部分は入力で、短縮した部分は出力だからです。スクリプトを実行して、これらの仮定を自分のprompt_tokensとcompletion_に置き換えてください。
これが1日1,000通のメールでの構造化プロンプトをモデル別に示したものです。入力と出力を合計すると、このワークロードではCheapTokensがOpenRouterの参照価格より安くなります。現在の価格は価格ページにあります。
| モデル | 入力 $/1M | 出力 $/1M | リクエストあたり | 1,000 リクエスト | OpenRouter、1,000 リクエスト |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000013 | $0.0132 | $0.0234 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000016 | $0.0155 | $0.0462 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000037 | $0.037 | $0.444 |
リクエストあたり 500 入力トークンと 80 出力トークン。100万トークンあたりの価格は現行のもので、当社の料金体系に合わせて変動します。OpenRouter 列は同じワークロードの参考価格を示しています。
自分で確認#
スクリプトがプロンプトを再利用するときに最も効果を発揮する習慣についての質問です。構造が機能したら、次のノブはシステムメッセージと温度です。システムプロンプトと温度で説明しています。
クイックチェック
スクリプトは毎回新しいメールで同じ指示を送信します。メールはどこに入れるべきですか?
答えを表示
答え: 最後に、指示と例の後に
指示はリクエスト間で同じままで、メールは変わります。OpenAIのガイドは、変わるコンテキストをプロンプトの最後近くに置くことを提案しています。



