Senior prompt engineer
Use when the user asks to optimize prompts, design prompt templates, evaluate LLM outputs with an eval set, measure RAG retrieval quality, validate agent/tool configurations, analyze token usage, or design structured-output contracts.
How to use it
Claude Code
- Run the line below. It pulls the whole folder into
~/.claude/skills/senior-prompt-engineer, including the files SKILL.md points to. - Describe your job in plain words. Claude Code follows the skill from there.
npx degit alirezarezvani/claude-skills/engineering-team/skills/senior-prompt-engineer#main ~/.claude/skills/senior-prompt-engineerFor one project only, change the path to .claude/skills/senior-prompt-engineer. This skill also uses baseline.json, prompt.txt, optimized.txt, examples.json, retrieved.json, eval_set.json — copying SKILL.md alone won't be enough. See the folder on GitHub.
Claude (web or desktop app)
- On this page open ⋯ → Download .md.
- Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
- Pick the file and Save. Claude shows the name and description and runs a security scan.
- Check the skill is switched on.
- Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
- ChatGPT: make a Project and paste it into Instructions.
- Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Source of Senior prompt engineer
Show the full text140 lines
| name | description |
|---|---|
| senior-prompt-engineer | Use when the user asks to optimize prompts, design prompt templates, evaluate LLM outputs with an eval set, measure RAG retrieval quality, validate agent/tool configurations, analyze token usage, or design structured-output contracts. Covers eval-driven prompt iteration, RAG metrics (relevance, faithfulness, coverage), agent workflow validation, and token/cost budgeting — all model-agnostic, with three stdlib Python tools. |
Senior Prompt Engineer
Eval-driven prompt engineering, RAG quality measurement, and agent workflow validation. Everything here is model-agnostic by design: techniques are framed by what they do, not by which model generation they were observed on, and the tools never hardcode model IDs or pricing — you supply your provider's current rates when you want dollar figures.
Operating Rules
- Never change a prompt without a baseline. Capture metrics first (
--analyze --output baseline.json), then compare every iteration against it. - Eval set before optimization. 10–20 representative cases with expected outputs minimum. If the user has no eval set, build one with them before touching the prompt — optimizing against vibes is the #1 failure mode.
- Prefer platform features over prompt hacks. If the provider offers native structured outputs / JSON schema enforcement, tool-use APIs, or prompt caching, use those instead of "respond ONLY with JSON" incantations. Prompt-level format enforcement is the fallback, not the default.
- Current-generation models need less scaffolding. Don't add chain-of-thought boilerplate, role framing, or few-shot examples reflexively — frontier models often do worse with redundant scaffolding. Add each element only when the eval set shows it helps.
- Cost numbers are always user-supplied. Look up the provider's current per-Mtok pricing and pass it via
--price-per-mtok(never trust a cached price table — including any you remember).
Tools (exact CLIs, all stdlib)
1. Prompt Optimizer — scripts/prompt_optimizer.py
Static analysis: token estimate, clarity/structure scores (0–100), ambiguity + redundancy detection, few-shot example extraction.
# Full analysis (human-readable report)
python3 scripts/prompt_optimizer.py prompt.txt --analyze
# Save machine-readable baseline for later comparison
python3 scripts/prompt_optimizer.py prompt.txt --analyze --json --output baseline.json
# Token estimate; cost only if you supply your provider's current rate
python3 scripts/prompt_optimizer.py prompt.txt --tokens --model claude --price-per-mtok 3.00
# Whitespace/redundancy-trimmed version
python3 scripts/prompt_optimizer.py prompt.txt --optimize --output optimized.txt
# Extract Input/Output few-shot pairs to JSON
python3 scripts/prompt_optimizer.py prompt.txt --extract-examples --output examples.json
# Compare a revision against the saved baseline
python3 scripts/prompt_optimizer.py optimized.txt --analyze --compare baseline.json
--model accepts any string; only the tokenizer family is inferred (names containing "claude" → 3.5 chars/token, otherwise 4.0). Exit 0 on success, 1 on missing file.
2. RAG Evaluator — scripts/rag_evaluator.py
Measures retrieval and grounding quality from two JSON files (formats printed in --help).
python3 scripts/rag_evaluator.py --contexts retrieved.json --questions eval_set.json
python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --k 10 --json
python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --output report.json --verbose
python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --compare baseline_report.json
Reports context relevance, precision@k, coverage, answer faithfulness, groundedness. Treat relevance < 0.80 as a retrieval problem (chunking/embedding/filtering), not a prompt problem — fix retrieval before rewriting the generation prompt.
3. Agent Orchestrator — scripts/agent_orchestrator.py
Validates agent configs (YAML/JSON): tool wiring, missing required config, loop risk, token estimates.
python3 scripts/agent_orchestrator.py agent.yaml --validate
python3 scripts/agent_orchestrator.py agent.yaml --visualize --format mermaid
python3 scripts/agent_orchestrator.py agent.yaml --estimate-cost --runs 100 \
--input-price-per-mtok 3.00 --output-price-per-mtok 15.00
Without the two price flags, --estimate-cost reports token estimates only. The model: field in the config is informational — any model name is accepted.
Workflows
Prompt Optimization (eval-gated)
- Baseline:
python3 scripts/prompt_optimizer.py current_prompt.txt --analyze --json --output baseline.json - Diagnose from the report: ambiguous verbs ("analyze", "handle"), redundant blocks, missing output contract, token waste.
- Apply one change at a time, in this order of leverage:
Symptom Fix Malformed/unparseable output Native structured outputs / JSON schema if the API supports it; explicit schema-in-prompt otherwise Inconsistent answers across runs Tighten instructions + add 2–3 contrastive examples (one near-miss showing what NOT to do) Misses edge cases Enumerate the edge cases explicitly; add a "when uncertain, do X" rule Token bloat on repeated calls Move stable prefix (system rules, examples) first so prompt caching applies; trim redundancy Wrong reasoning on hard cases Ask for stepwise reasoning in a scratch field the consumer ignores, or use the provider's extended-thinking mode - Re-analyze and compare:
python3 scripts/prompt_optimizer.py revised.txt --analyze --compare baseline.json - Eval gate (must pass before shipping): run the revised prompt over the eval set, write per-case pass/fail to
eval_results.json, then assert:
Pair this structural gate with your task-level eval: the revision must not lose any previously-passing eval case (no-regression rule).python3 scripts/prompt_optimizer.py revised.txt --analyze --json --output revised.json \ && python3 -c " import json, sys r = json.load(open('revised.json')); b = json.load(open('baseline.json')) ok = r['clarity_score'] >= b['clarity_score'] and r['token_count'] <= b['token_count'] * 1.10 sys.exit(0 if ok else 1)" echo "gate exit=$?" # 0 = ship; 1 = regression, iterate again
Few-Shot Example Design
- Define the task contract first (input shape, output shape, edge-case policy).
- Start with zero examples and measure — current models often need none. Add examples only for failure clusters the eval reveals.
- When adding: 3–5 max, ordered simple → edge → negative (what NOT to extract), formatted identically to the real output contract.
- Validate consistency:
python3 scripts/prompt_optimizer.py prompt_with_examples.txt --extract-examples --output examples.jsonand inspect that every extracted pair parses against your schema. - Re-run the eval set; if a case passes only because it resembles an example, add a held-out variant to the eval set.
Structured Output Design
- Write the JSON Schema first (types, enums, required, maxLength).
- Prefer API-native enforcement: structured-outputs / response-schema / tool-call parameters guarantee shape; prompt text cannot.
- Fallback (API without schema support): include the schema rendered as field-by-field rules + one valid example, and instruct "output only the JSON object".
- Gate: pipe 10 eval outputs through a schema validator (
python3 -c "import json,sys; [json.loads(l) for l in sys.stdin]"at minimum); 10/10 must parse, else return to step 2.
RAG Tuning Loop
- Build
questions.json(id, question, reference answer) and capture current retrievals tocontexts.json. python3 scripts/rag_evaluator.py --contexts contexts.json --questions questions.json --output rag_baseline.json- Fix the lowest metric first: relevance → chunking/embeddings/metadata filters; faithfulness → grounding instructions + "answer only from context" + citation requirement; coverage → retrieval k / query expansion.
- Gate:
python3 scripts/rag_evaluator.py --contexts new_contexts.json --questions questions.json --compare rag_baseline.json— every metric must be ≥ baseline; any regression blocks the change.
Agent Config Review
python3 scripts/agent_orchestrator.py agent.yaml --validate— must exit with VALIDATION PASSED; fix every error and warning (missing tool config, unbounded iterations, loop risk).- Check context discipline: each tool description ≤ 1–2 sentences, tool count minimal for the job, stable system prompt placed first (cache-friendly), iteration cap + early-exit condition present.
- Budget:
--estimate-cost --runs Nwith your current prices; if cost/run exceeds budget, cut tools or context before downgrading the model.
References
| File | Contains | Load when user asks about |
|---|---|---|
references/prompt_engineering_patterns.md |
10 prompt patterns with input/output examples | "which pattern?", few-shot design, decomposition, meta-prompting |
references/llm_evaluation_frameworks.md |
Eval metrics, scoring methods, A/B testing | "how to evaluate?", "measure quality", "compare prompts" |
references/agentic_system_design.md |
Agent architectures (ReAct, Plan-Execute, Tool Use) | "build agent", "tool calling", "multi-agent" |
Related Skills
engineering-team/skills/senior-ml-engineer— model deployment and serving (this skill stops at the prompt/eval layer)engineering/rag-architect— RAG system architecture (this skill measures RAG quality; that one designs the pipeline)engineering/agent-designer— full agent system design (this skill validates configs; that one designs the architecture)
| 1 | |
| 2 | name "senior-prompt-engineer" |
| 3 | description Use when the user asks to optimize prompts, design prompt templates, evaluate LLM outputs with an eval set, measure RAG retrieval quality, validate agent/tool configurations, analyze token usage, or design structured-output contracts. Covers eval-driven prompt iteration, RAG metrics (relevance, faithfulness, coverage), agent workflow validation, and token/cost budgeting — all model-agnostic, with three stdlib Python tools. |
| 4 | |
| 5 | |
| 6 | # Senior Prompt Engineer |
| 7 | |
| 8 | Eval-driven prompt engineering, RAG quality measurement, and agent workflow validation. Everything here is **model-agnostic by design**: techniques are framed by what they do, not by which model generation they were observed on, and the tools never hardcode model IDs or pricing — you supply your provider's current rates when you want dollar figures. |
| 9 | |
| 10 | ## Operating Rules |
| 11 | |
| 12 | **Never change a prompt without a baseline.** Capture metrics first (`--analyze --output baseline.json`), then compare every iteration against it. |
| 13 | **Eval set before optimization.** 10–20 representative cases with expected outputs minimum. If the user has no eval set, build one with them before touching the prompt — optimizing against vibes is the #1 failure mode. |
| 14 | **Prefer platform features over prompt hacks.** If the provider offers native structured outputs / JSON schema enforcement, tool-use APIs, or prompt caching, use those instead of "respond ONLY with JSON" incantations. Prompt-level format enforcement is the fallback, not the default. |
| 15 | **Current-generation models need less scaffolding.** Don't add chain-of-thought boilerplate, role framing, or few-shot examples reflexively — frontier models often do worse with redundant scaffolding. Add each element only when the eval set shows it helps. |
| 16 | **Cost numbers are always user-supplied.** Look up the provider's current per-Mtok pricing and pass it via `--price-per-mtok` (never trust a cached price table — including any you remember). |
| 17 | |
| 18 | ## Tools (exact CLIs, all stdlib) |
| 19 | |
| 20 | ### 1. Prompt Optimizer — `scripts/prompt_optimizer.py` |
| 21 | |
| 22 | Static analysis: token estimate, clarity/structure scores (0–100), ambiguity + redundancy detection, few-shot example extraction. |
| 23 | |
| 24 | |
| 25 | # Full analysis (human-readable report) |
| 26 | python3 scripts/prompt_optimizer.py prompt.txt --analyze |
| 27 | |
| 28 | # Save machine-readable baseline for later comparison |
| 29 | python3 scripts/prompt_optimizer.py prompt.txt --analyze --json --output baseline.json |
| 30 | |
| 31 | # Token estimate; cost only if you supply your provider's current rate |
| 32 | python3 scripts/prompt_optimizer.py prompt.txt --tokens --model claude --price-per-mtok 3.00 |
| 33 | |
| 34 | # Whitespace/redundancy-trimmed version |
| 35 | python3 scripts/prompt_optimizer.py prompt.txt --optimize --output optimized.txt |
| 36 | |
| 37 | # Extract Input/Output few-shot pairs to JSON |
| 38 | python3 scripts/prompt_optimizer.py prompt.txt --extract-examples --output examples.json |
| 39 | |
| 40 | # Compare a revision against the saved baseline |
| 41 | python3 scripts/prompt_optimizer.py optimized.txt --analyze --compare baseline.json |
| 42 | |
| 43 | |
| 44 | `--model` accepts any string; only the tokenizer family is inferred (names containing "claude" → 3.5 chars/token, otherwise 4.0). Exit 0 on success, 1 on missing file. |
| 45 | |
| 46 | ### 2. RAG Evaluator — `scripts/rag_evaluator.py` |
| 47 | |
| 48 | Measures retrieval and grounding quality from two JSON files (formats printed in `--help`). |
| 49 | |
| 50 | |
| 51 | python3 scripts/rag_evaluator.py --contexts retrieved.json --questions eval_set.json |
| 52 | python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --k 10 --json |
| 53 | python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --output report.json --verbose |
| 54 | python3 scripts/rag_evaluator.py --contexts ctx.json --questions q.json --compare baseline_report.json |
| 55 | |
| 56 | |
| 57 | Reports context relevance, precision@k, coverage, answer faithfulness, groundedness. Treat relevance < 0.80 as a retrieval problem (chunking/embedding/filtering), not a prompt problem — fix retrieval before rewriting the generation prompt. |
| 58 | |
| 59 | ### 3. Agent Orchestrator — `scripts/agent_orchestrator.py` |
| 60 | |
| 61 | Validates agent configs (YAML/JSON): tool wiring, missing required config, loop risk, token estimates. |
| 62 | |
| 63 | |
| 64 | python3 scripts/agent_orchestrator.py agent.yaml --validate |
| 65 | python3 scripts/agent_orchestrator.py agent.yaml --visualize --format mermaid |
| 66 | python3 scripts/agent_orchestrator.py agent.yaml --estimate-cost --runs 100 \ |
| 67 | --input-price-per-mtok 3.00 --output-price-per-mtok 15.00 |
| 68 | |
| 69 | |
| 70 | Without the two price flags, `--estimate-cost` reports token estimates only. The `model:` field in the config is informational — any model name is accepted. |
| 71 | |
| 72 | ## Workflows |
| 73 | |
| 74 | ### Prompt Optimization (eval-gated) |
| 75 | |
| 76 | **Baseline:** `python3 scripts/prompt_optimizer.py current_prompt.txt --analyze --json --output baseline.json` |
| 77 | **Diagnose** from the report: ambiguous verbs ("analyze", "handle"), redundant blocks, missing output contract, token waste. |
| 78 | **Apply one change at a time**, in this order of leverage: |
| 79 | | Symptom | Fix | |
| 80 | |---------|-----| |
| 81 | | Malformed/unparseable output | Native structured outputs / JSON schema if the API supports it; explicit schema-in-prompt otherwise | |
| 82 | | Inconsistent answers across runs | Tighten instructions + add 2–3 contrastive examples (one near-miss showing what NOT to do) | |
| 83 | | Misses edge cases | Enumerate the edge cases explicitly; add a "when uncertain, do X" rule | |
| 84 | | Token bloat on repeated calls | Move stable prefix (system rules, examples) first so prompt caching applies; trim redundancy | |
| 85 | | Wrong reasoning on hard cases | Ask for stepwise reasoning *in a scratch field the consumer ignores*, or use the provider's extended-thinking mode | |
| 86 | **Re-analyze and compare:** `python3 scripts/prompt_optimizer.py revised.txt --analyze --compare baseline.json` |
| 87 | **Eval gate (must pass before shipping):** run the revised prompt over the eval set, write per-case pass/fail to `eval_results.json`, then assert: |
| 88 | |
| 89 | python3 scripts/prompt_optimizer.py revised.txt --analyze --json --output revised.json \ |
| 90 | && python3 -c " |
| 91 | import json, sys |
| 92 | r = json.load(open('revised.json')); b = json.load(open('baseline.json')) |
| 93 | ok = r['clarity_score'] >= b['clarity_score'] and r['token_count'] <= b['token_count'] * 1.10 |
| 94 | sys.exit(0 if ok else 1)" |
| 95 | echo "gate exit=$?" # 0 = ship; 1 = regression, iterate again |
| 96 | |
| 97 | Pair this structural gate with your task-level eval: the revision must not lose any previously-passing eval case (no-regression rule). |
| 98 | |
| 99 | ### Few-Shot Example Design |
| 100 | |
| 101 | Define the task contract first (input shape, output shape, edge-case policy). |
| 102 | Start with **zero examples** and measure — current models often need none. Add examples only for failure clusters the eval reveals. |
| 103 | When adding: 3–5 max, ordered simple → edge → negative (what NOT to extract), formatted identically to the real output contract. |
| 104 | Validate consistency: `python3 scripts/prompt_optimizer.py prompt_with_examples.txt --extract-examples --output examples.json` and inspect that every extracted pair parses against your schema. |
| 105 | Re-run the eval set; if a case passes only because it resembles an example, add a held-out variant to the eval set. |
| 106 | |
| 107 | ### Structured Output Design |
| 108 | |
| 109 | Write the JSON Schema first (types, enums, required, maxLength). |
| 110 | **Prefer API-native enforcement**: structured-outputs / response-schema / tool-call parameters guarantee shape; prompt text cannot. |
| 111 | Fallback (API without schema support): include the schema rendered as field-by-field rules + one valid example, and instruct "output only the JSON object". |
| 112 | Gate: pipe 10 eval outputs through a schema validator (`python3 -c "import json,sys; [json.loads(l) for l in sys.stdin]"` at minimum); 10/10 must parse, else return to step 2. |
| 113 | |
| 114 | ### RAG Tuning Loop |
| 115 | |
| 116 | Build `questions.json` (id, question, reference answer) and capture current retrievals to `contexts.json`. |
| 117 | `python3 scripts/rag_evaluator.py --contexts contexts.json --questions questions.json --output rag_baseline.json` |
| 118 | Fix the **lowest metric first**: relevance → chunking/embeddings/metadata filters; faithfulness → grounding instructions + "answer only from context" + citation requirement; coverage → retrieval k / query expansion. |
| 119 | Gate: `python3 scripts/rag_evaluator.py --contexts new_contexts.json --questions questions.json --compare rag_baseline.json` — every metric must be ≥ baseline; any regression blocks the change. |
| 120 | |
| 121 | ### Agent Config Review |
| 122 | |
| 123 | `python3 scripts/agent_orchestrator.py agent.yaml --validate` — must exit with VALIDATION PASSED; fix every error and warning (missing tool config, unbounded iterations, loop risk). |
| 124 | Check context discipline: each tool description ≤ 1–2 sentences, tool count minimal for the job, stable system prompt placed first (cache-friendly), iteration cap + early-exit condition present. |
| 125 | Budget: `--estimate-cost --runs N` with your current prices; if cost/run exceeds budget, cut tools or context before downgrading the model. |
| 126 | |
| 127 | ## References |
| 128 | |
| 129 | | File | Contains | Load when user asks about | |
| 130 | |------|----------|---------------------------| |
| 131 | | `references/prompt_engineering_patterns.md` | 10 prompt patterns with input/output examples | "which pattern?", few-shot design, decomposition, meta-prompting | |
| 132 | | `references/llm_evaluation_frameworks.md` | Eval metrics, scoring methods, A/B testing | "how to evaluate?", "measure quality", "compare prompts" | |
| 133 | | `references/agentic_system_design.md` | Agent architectures (ReAct, Plan-Execute, Tool Use) | "build agent", "tool calling", "multi-agent" | |
| 134 | |
| 135 | ## Related Skills |
| 136 | |
| 137 | `engineering-team/skills/senior-ml-engineer` — model deployment and serving (this skill stops at the prompt/eval layer) |
| 138 | `engineering/rag-architect` — RAG system architecture (this skill measures RAG quality; that one designs the pipeline) |
| 139 | `engineering/agent-designer` — full agent system design (this skill validates configs; that one designs the architecture) |
| 140 |
Discussion
Browse more free Claude skills or everything in Development.