プロンプトを生成するプロンプト
システムプロンプトジェネレーター、ペルソナジェネレーター、タスク特化型プロンプトファクトリーを学びます。
「プロンプトを生成するプロンプト」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
プロンプトファクトリー
プロンプトファクトリーとは、特定のタスク向けに複数のプロンプトのバリエーションを生成するメタプロンプトです。1つのプロンプトを書く代わりに、タスクと制約を指定すると、テストして選択できる候補のセットが生成されます。
システムプロンプトのバリエーション生成
同じ役割に対して、トーンやコミュニケーションスタイルがそれぞれ異なるN個のシステムプロンプトのバリエーションを生成するようモデルに指示します。これが、システムプロンプトのA/Bテストの出発点になります。
import anthropic
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
VARIANT_FACTORY_PROMPT = '''Generate {num_variants} different system prompt variants
for a coding assistant targeting junior developers.
Each variant should have a distinctly different approach:
- Variant 1: Friendly and encouraging mentor style
- Variant 2: Concise and technical style
- Variant 3: Socratic method (asks guiding questions instead of giving answers)
- Variant 4: Game-based, uses analogies and rewards
- Variant 5: Strict teacher who corrects mistakes firmly but fairly
For each variant output:
{{"id": 1, "style": "<style name>", "prompt": "<full system prompt>"}}
Return as a JSON array.'''
def generate_prompt_variants(num_variants=5):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=3000,
messages=[{'role': 'user', 'content':
VARIANT_FACTORY_PROMPT.format(num_variants=num_variants)}]
)
return json.loads(response.content[0].text)
variants = generate_prompt_variants(5)
for v in variants[:2]:
print(f'Variant {v["id"]} ({v["style"]}): {v["prompt"][:80]}...')タスク特化型プロンプトテンプレートジェネレーター
プロンプトテンプレートジェネレーターは、特定のタスクタイプ向けにパラメーター化されたテンプレートを生成します。出力されるのは一度しか使わないプロンプトではなく、再利用可能なテンプレートです。
TEMPLATE_FACTORY_PROMPT = '''Create a production-ready prompt template for the following task.
Task type: {task_type}
Domain: {domain}
Target audience: {audience}
Requirements for the template:
1. Use {{variable}} placeholders for all input values
2. Include role/persona definition
3. Specify exact output format
4. Add quality constraints
5. Include a worked example using {{example_input}} placeholder
Also output:
- variables: list of all {variable} placeholders and their descriptions
- suggested_model: which Claude/GPT model tier is appropriate
- estimated_tokens: rough estimate of output token count
Return as JSON: {{template, variables, suggested_model, estimated_tokens}}'''
def generate_task_template(task_type, domain, audience):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=1500,
messages=[{'role': 'user', 'content':
TEMPLATE_FACTORY_PROMPT.format(
task_type=task_type,
domain=domain,
audience=audience
)}]
)
return json.loads(response.content[0].text)
template = generate_task_template(
task_type='summarization',
domain='legal contracts',
audience='non-lawyer business executives'
)
print('Template preview:', template['template'][:200], '...')
print('Variables:', template.get('variables', [])[:3])ペルソナプロンプトファクトリー
ペルソナファクトリーは、システムプロンプト、対話例、アンチパターン(そのペルソナが決して言ったり行ったりしてはいけないこと)を含む、完全なペルソナ定義を生成します。
PERSONA_FACTORY_PROMPT = '''Design a complete AI assistant persona for: {application}.
Output a JSON object with these keys:
- name: persona name
- tagline: one-sentence description
- system_prompt: full system prompt (150-250 words)
- communication_style: 4-5 sentences describing how this persona communicates
- example_good_response: example of an ideal response to a typical user question
- example_bad_response: example of a response that would break character or violate guidelines
- persona_rules: list of 5 behavioral rules specific to this persona
- forbidden_phrases: list of 5 phrases this persona would never use
Make the persona distinct, consistent, and aligned with the application context.'''
def generate_persona(application):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
PERSONA_FACTORY_PROMPT.format(application=application)}]
)
return json.loads(response.content[0].text)
persona = generate_persona('a mental wellness check-in app for university students')
print('Persona:', persona['name'])
print('Tagline:', persona['tagline'])
print('System prompt preview:', persona['system_prompt'][:150], '...')テストケースジェネレーター
メタプロンプティングを使うと、プロンプトの品質を評価するための多様なテストケースを生成できます。テストケースファクトリーは、一般的な利用例、エッジケース、敵対的な入力を網羅するユーザー入力を生成します。
TEST_CASE_FACTORY = '''Generate {num_cases} test cases for evaluating an AI assistant.
Assistant description: {assistant_description}
For each test case provide:
- id: number
- category: one of [typical, edge_case, adversarial, off_topic, ambiguous]
- user_message: the input message
- expected_behavior: what a good response should do (not the response itself)
- failure_modes: what wrong responses might look like
Distribution: 5 typical, 3 edge cases, 2 adversarial, 2 off-topic, 3 ambiguous.
Return as JSON array.'''
def generate_test_cases(assistant_description, num_cases=15):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=3000,
messages=[{'role': 'user', 'content':
TEST_CASE_FACTORY.format(
num_cases=num_cases,
assistant_description=assistant_description
)}]
)
return json.loads(response.content[0].text)
test_cases = generate_test_cases(
'A Python coding tutor for beginners that explains errors in simple language'
)
for tc in test_cases[:3]:
print(f'[{tc["category"]}] {tc["user_message"][:60]}...')Few-Shot例ジェネレーター
Few-shot例を手作業で作成するには、多くの時間がかかります。Few-shot例ファクトリーは、タスクの説明と任意のシード例からFew-shot例を生成します。
FEW_SHOT_FACTORY = '''Generate {num_examples} high-quality few-shot examples for:
Task: {task_description}
Each example must:
- Be realistic and representative of the actual task
- Show the exact input-output format
- Cover different sub-types or difficulty levels
- Be labeled: [Easy], [Medium], or [Hard]
Format exactly as:
---EXAMPLE {n}---
Input: <input>
Output: <output>
[Difficulty: Easy/Medium/Hard]
Make examples progressively more complex from first to last.'''
def generate_few_shot_examples(task_description, num_examples=5):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
FEW_SHOT_FACTORY.format(
task_description=task_description,
num_examples=num_examples
)}]
)
return response.content[0].text
examples = generate_few_shot_examples(
'Classify customer emails into: Complaint, Question, Praise, Refund Request'
)
print(examples[:500], '...')Chain-of-Thoughtプロンプトジェネレーター
Chain-of-thought(CoT)プロンプトを生成するには、ファクトリーが推論の構造と推論チェーンの例の両方を生成する必要があります。これは、完全に構造化されたCoTプロンプトを出力する、より複雑なメタプロンプトです。
COT_PROMPT_FACTORY = '''Design a chain-of-thought prompt for solving: {problem_type}
The prompt must:
1. Define the step-by-step reasoning process specific to this problem type
2. Include a worked example showing the full reasoning chain
3. Use "Think step by step" or equivalent CoT trigger phrase
4. End with a clear output specification
Output format:
{
"cot_trigger": "the trigger phrase",
"reasoning_steps": ["step 1 description", "step 2 description", ...],
"worked_example": {
"problem": "...",
"reasoning": "Step 1: ... Step 2: ... etc.",
"answer": "..."
},
"full_prompt_template": "the complete template with {problem} placeholder"
}'''
def generate_cot_prompt(problem_type):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=1500,
messages=[{'role': 'user', 'content':
COT_PROMPT_FACTORY.format(problem_type=problem_type)}]
)
return json.loads(response.content[0].text)
cot = generate_cot_prompt('debugging Python runtime errors')
print('CoT steps:', cot['reasoning_steps'][:3])
print('Trigger:', cot['cot_trigger'])プロンプトのバリエーション選択とスコアリング
複数のプロンプトのバリエーションを生成したら、テスト前にスコアリング用のメタプロンプトを使って品質順にランク付けします。これにより候補を事前に絞り込み、必要な実行時API呼び出しの回数を減らせます。
SCORING_PROMPT = '''You are evaluating prompt variants for quality.
Rate each variant on these criteria (1-5):
1. Clarity: Is the task and output format clearly defined?
2. Completeness: Are all necessary instructions present?
3. Constraints: Are appropriate constraints and guardrails in place?
4. Conciseness: Is there unnecessary length that dilutes the prompt?
5. Robustness: Would this handle edge cases and adversarial inputs?
For each variant output:
{"id": <id>, "scores": {clarity: N, completeness: N, constraints: N,
conciseness: N, robustness: N}, "total": N, "rationale": "<2 sentences>"}
Return JSON array sorted by total score descending.
Variants to evaluate:
{variants_json}'''
def rank_prompt_variants(variants):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
SCORING_PROMPT.format(
variants_json=json.dumps(variants, indent=2)
)}]
)
return json.loads(response.content[0].text)
ranked = rank_prompt_variants(variants)
print('Top variant:', ranked[0]['id'], '| Score:', ranked[0]['total'])
print('Rationale:', ranked[0]['rationale'][:100])プロンプトの発散:最大限の多様性を生成
プロンプトのバリエーションを生成する際は、品質と同じくらい多様性が重要です。明示的な多様性の指示を使い、モデルがほとんど同じバリエーションを生成するのを防ぎます。
DIVERSITY_FACTORY = '''Generate 5 MAXIMALLY DIVERSE prompt variants for:
Task: {task_description}
Diversity requirements:
- Each variant must use a DIFFERENT cognitive approach:
1. Direct instruction approach
2. Role-based persona approach
3. Example-first (few-shot) approach
4. Constraint-based (tell what NOT to do) approach
5. Output-format-first approach (start by defining desired output)
- No two variants should share more than 20% of their wording
- Each variant should be completable without reference to the others
For each variant tag it with its approach name.
Return as JSON array: [{"approach": "...", "prompt": "..."}]'''
def generate_diverse_variants(task_description):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=3000,
messages=[{'role': 'user', 'content':
DIVERSITY_FACTORY.format(task_description=task_description)}]
)
return json.loads(response.content[0].text)
diverse = generate_diverse_variants('Answering customer questions about product returns')
for v in diverse:
print(f'Approach: {v["approach"]} | Prompt: {v["prompt"][:60]}...')プロンプトファクトリーパイプラインの構築
完全なプロンプトファクトリーパイプラインは、生成、スコアリング、多様性のチェック、出力を組み合わせ、すぐに使えるプロンプト候補のセットを作成します。
def prompt_factory_pipeline(task_description, num_candidates=5, top_k=3):
print(f'[1/4] Generating {num_candidates} diverse prompt variants...')
variants = generate_diverse_variants(task_description)
print('[2/4] Scoring prompt quality...')
ranked = rank_prompt_variants(variants)
print('[3/4] Selecting top candidates...')
top_candidates = ranked[:top_k]
print('[4/4] Generating test cases for evaluation...')
test_cases = generate_test_cases(task_description, num_cases=10)
output = {
'task': task_description,
'candidates': top_candidates,
'test_cases': test_cases,
'recommendation': (
f'Start A/B testing with top 3 candidates. '
f'Run each against {len(test_cases)} test cases. '
f'Promote the highest-scoring candidate to production.'
)
}
print('Pipeline complete.')
return output
# result = prompt_factory_pipeline(
# 'Summarizing customer support tickets for a priority queue'
# )
# print(result['recommendation'])プロンプト生成におけるアンチパターン
プロンプトファクトリーには失敗しやすいパターンがあります。これらのアンチパターンを理解すると、より優れたメタプロンプトと候補プロンプトを作成できます。
PROMPT_FACTORY_ANTIPATTERNS = {
'Generic variants': {
'problem': 'All variants say the same thing in slightly different words',
'cause': 'No diversity instruction in the meta-prompt',
'fix': 'Explicitly specify different approaches or styles for each variant'
},
'Hallucinated instructions': {
'problem': 'Generated prompt references APIs, rules, or facts that do not exist',
'cause': 'Model fills gaps in its knowledge with plausible-sounding content',
'fix': 'Review all domain-specific claims; add validation step'
},
'Missing edge case coverage': {
'problem': 'Generated prompts only handle happy path, not failures',
'cause': 'Meta-prompt did not specify adversarial/edge case requirements',
'fix': 'Explicitly ask for edge case handling in the meta-prompt'
},
'Over-length inflation': {
'problem': 'Generated prompts are verbose and repetitive',
'cause': 'Model padds output without conciseness constraint',
'fix': 'Add word count constraint: "between 100-200 words"'
}
}
for pattern, info in PROMPT_FACTORY_ANTIPATTERNS.items():
print(f'{pattern}:')
print(f' Fix: {info["fix"]}')確認問題
コーディングアシスタントのA/Bテスト用に、5個のシステムプロンプトのバリエーションが必要です。バリエーションが本当に異なるものになるようにするには、どのようなメタプロンプトの指示が最適でしょうか。
プロンプトファクトリーのまとめ
プロンプトファクトリーは、メタプロンプティングを使って候補プロンプトを大規模に生成します。
- バリエーションファクトリー:A/Bテスト用に、多様なバリエーションをN個生成します
- テンプレートファクトリー:タスクの説明からパラメーター化されたテンプレートを生成します
- ペルソナファクトリー:システムプロンプトと例を含む、完全なペルソナ定義を生成します
- テストケースファクトリー:一般的な入力、エッジケース、敵対的なテスト入力を生成します
- Few-shotファクトリー:指定した難易度レベルの入出力例のペアを生成します
- スコアリング用メタプロンプト:実行時のテスト前に、生成された候補をランク付けします
- 多様性の要件:ほとんど同じバリエーションにならないよう、異なるアプローチを指定します
よくある質問
「プロンプトを生成するプロンプト」レッスンは無料ですか?
はい。「プロンプトを生成するプロンプト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「プロンプトを生成するプロンプト」で何を学びますか?
システムプロンプトジェネレーター、ペルソナジェネレーター、タスク特化型プロンプトファクトリーを学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「プロンプトを生成するプロンプト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メタプロンプティングとは
- プロンプトを生成するプロンプト
- 自己改善型プロンプトシステム
- 自己改善における評価と選択