プロンプトエンジニアリングの実務コツ|出力が安定する設計パターン

プロンプトエンジニアリングの実務コツ|出力が安定する設計パターン

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

プロンプトをうまく書けるようになりたい、という話をよく聞きます。ただ多くの場合、書き方ではなく設計が先に必要です。この記事では、Claude Code CLIをPythonのサブプロセスから呼び出してバッチ処理に組み込んだ経験と、Stable Diffusion WebUI APIを使った画像生成の自動化をもとに、実務で再現できるプロンプトの設計パターンをまとめます。

なぜ「なんとなく書いたプロンプト」は崩れるのか

アドホックに書いたプロンプトは一度うまくいっても再現性がありません。特に自動化ワークフローに組み込む場合、出力フォーマットが毎回ぶれると後続の処理が壊れます。

実務でプロンプトを「設計する」とは、実行前に以下の3つを決めることだと考えています。

項目 決めること
入力の型 何を渡すか(テキスト・画像・構造化データ)
出力の型 何が返るか(JSON・Markdown・plain text)
制約の列挙 何をしてはいけないか

この3つが揃っていないと、AIが曖昧な部分を勝手に補完するため出力が不安定になります。逆に言えば、この3つを最初に固めるだけで、後続コードの設計がかなり楽になります。

出力を安定させる基本パターン

役割と制約を冒頭に宣言する

プロンプトの先頭に「あなたは〇〇です」と役割を置き、直後に制約を列挙します。

あなたは商品説明文のライターです。
以下を必ず守ってください:
- 200文字以内で書く
- 価格・送料には触れない
- 一般論・まとめ文は書かない

制約をプロンプトの末尾に置くと、長いコンテキストで「流れる」ことがあります(少なくとも私の経験上そう感じます)。冒頭に置くほうが効きやすい印象ですが、モデルやバージョンによって異なる可能性があります。

出力フォーマットをサンプルで明示する

「JSONで返してください」だけでは不十分です。フィールド名・型・ネスト構造をサンプルで示します。

以下のJSONフォーマットで出力してください。
前後に説明文やコードフェンスを付けないこと。

{
  "title": "タイトル文字列",
  "tags": ["タグ1", "タグ2"],
  "body": "本文テキスト"
}

「コードフェンスを付けないこと」を明示するのには理由があります。Pythonのサブプロセスで受け取ったとき、```json と ``` が混じっていると json.loads() がエラーになります。クリーニング処理を毎回書くより、最初に明示するほうが楽です。

禁止を「する」ではなく「しない」で書く

「簡潔に書く」より「3文を超えない」、「正確に書く」より「数値を出す場合は出典を添える」というように、禁止を具体的な行動で書くと違反が減ります。

# 曖昧(避ける)
適切な長さで正確に書いてください。

# 具体的(使う)
- 回答は3文以内
- 「など」「〜のような」は使わない
- 自分で計測していない数値を出さない

「する」指示は解釈の余地を残します。「しない」指示は境界が明確なので、違反の判定もしやすくなります。

Claude Code CLIをPythonサブプロセスで呼ぶ

記事生成をバッチ化するために、Claude Code CLIを claude -p オプションでPythonのサブプロセスから呼び出しています。APIキーは使っていません。

import subprocess
import json

def run_claude(prompt: str) -> str:
    result = subprocess.run(
        ["claude", "-p", prompt],
        capture_output=True,
        text=True,
        timeout=120,
    )
    if result.returncode != 0:
        raise RuntimeError(result.stderr)
    return result.stdout.strip()

# JSONを返すプロンプトの場合
raw = run_claude(my_prompt)
data = json.loads(raw)

プロンプトを文字列で組み立てて渡し、標準出力で受け取ります。出力フォーマットをプロンプト側で固めておくと、このパースが安定します。

注意点として タイムアウト があります。生成が長いプロンプトはデフォルト設定で落ちることがあります。timeout=120(秒)を起点に、プロンプトの長さに合わせて調整してください。環境によって異なります。

バッチで複数件を処理する場合、ループ内でそのまま連続実行するとリクエストが詰まることがあります。time.sleep(3) 程度のインターバルを挟むのが無難です(適切な値は環境によって異なります)。

cronに組み込む場合の手順は Claude Code CLIのcron定期実行を設定する手順 にまとめています。

画像生成AIのプロンプト設計

Stable Diffusion WebUIを --api 付きで起動し、HTTPの txt2img エンドポイントから画像を生成しています。テキスト生成とは少し異なる構成が必要です。

ポジティブプロンプトの組み立て順の目安:

品質タグ, スタイル, 主題, 構図, 照明, 背景

例:

masterpiece, best quality, photorealistic,
product photo, white sneakers, front view,
soft shadow, pure white background

品質タグを先頭に置くのはモデルのバイアスとして働くためですが、チェックポイントによって効果は変わります。使っているモデルで検証してください。

ネガティブプロンプトの固定セット:

商品画像として使う場合、文字・透かし・低品質は確実に除外します。

low quality, blurry, watermark, text, signature, logo

APIからPythonで叩くときの最小構成:

import requests

payload = {
    "prompt": "masterpiece, best quality, white sneakers, product photo",
    "negative_prompt": "low quality, blurry, text, watermark",
    "steps": 20,
    "cfg_scale": 7,
    "width": 512,
    "height": 512,
    "sampler_name": "DPM++ 2M Karras",
}

response = requests.post(
    "http://localhost:7860/sdapi/v1/txt2img",
    json=payload,
)
images = response.json()["images"]  # base64エンコード済み

ポート 7860 はWebUIのデフォルト値です。--api オプションなしで起動するとエンドポイントが存在しないため、起動コマンドを確認してください。

LCM-LoRAで高速生成する場合は設定が別途必要です。LCM-LoRAで高速生成する設定手順に、サンプラー・ステップ数・CFGの組み合わせをまとめています。

まとめ

プロンプトエンジニアリングを実務に組み込む最初の一歩は、出力フォーマットを固定することです。返ってくる形が決まれば後処理が書けます。後処理が書ければバッチ処理に組み込めます。

まず手元のワークフローで「AIの出力を次のコードに渡している箇所」を1つ選んで、そのプロンプトに出力フォーマットのサンプルを追加してみてください。それだけで安定性がかなり変わります。

この記事で触れたもの

よくある質問

プロンプトエンジニアリングは独学できますか?

実際に動かして試すしかありません。まず出力フォーマットを固定するプロンプトを1本書いて、後処理コードと組み合わせて動かしてみてください。理論より実装が先です。

ChatGPTとClaudeでプロンプトの書き方は変わりますか?

モデルによって傾向は異なります。制約の受け取り方や役割宣言の効き方に差があるため、同じプロンプトで両方に投げて出力を比較するのが一番確実です。

プロンプトは日本語と英語どちらで書くべきですか?

Stable Diffusionなど画像生成系は英語が基本です。ClaudeなどのLLMは日本語で書いて問題ありません。出力言語と指示言語は独立しているため、日本語で指示して英語で出力させることも可能です。