Quick test. Open ChatGPT. Paste your CV. Paste a job posting. Type "tailor my CV to this job."
Read what comes back.
It's bad, right? Not catastrophically bad. Bad in a more annoying way. Some bullets got new adjectives. "Managed" became "spearheaded." "Worked on" became "drove." A few keywords from the JD got sprinkled in. The whole thing now reads like every other CV that went through the same pipeline. Recruiters can spot it from space.
I've been building an AI job coach for a few months (OneShot Coach, if you want to see where this ended up) and most of that time was me arguing with this exact failure mode. The fix isn't a better model or a longer prompt. It's a different framing. This post is what I figured out.
The thing GPT does wrong
When you say "tailor my CV," the model hears two tasks and only does one of them.
Task one is keyword swapping. Easy. Surface-level. Models love this.
Task two is the actual job: read the posting, figure out what they're really hiring for (not what the bullet points say, what the role needs), then find proof in the candidate's history and rewrite the relevant bits to make that proof obvious.
Task two is hard. Models won't do it unless you make them.
So you get keyword salad and you blame the model. The model is fine. The prompt is asking it to do the lazy thing.
What I tried that didn't work
A bunch of stuff, in roughly this order:
- Better adjective lists. Useless. Polished garbage is still garbage.
- "Be specific" / "use metrics." The model invents metrics. Confidently. With sources that don't exist.
- Few-shot examples of "good rewrites." Helped a little, but the model overfits to the examples and starts copying their structure even when it doesn't fit.
- Multi-step prompts (analyze, then rewrite). Better. But the analysis step kept being too generic, so the rewrite step inherited the genericness.
What finally moved the needle was changing what the model thought the task was.
The reframe
Three things, in this order:
The job posting is the spec. The CV is what's being audited against it.
Most "tailor" prompts feed the CV first, the JD second. Flip the order in your head. The model isn't polishing the CV. It's auditing the CV against a spec. Different job. Different output.
Score per section, not overall.
One global "fit score" is fortune-cookie advice. A score per section (summary, each role, skills, education) gives the user something to act on, and gives the model something it has to defend. When the model has to commit to "this bullet scores 2/5 because it doesn't speak to X," its rewrite has to actually fix X. Otherwise the score doesn't move and the model contradicts itself.
Interpret, don't transcribe.
This one took me forever. When the user says "rewrite this bullet to be stronger," a lazy model rewrites the words. A good model asks itself what the bullet is trying to prove, and whether the rewrite proves it harder. Sounds obvious. The model will not do it unless you spell it out. I have a whole rule in the production prompt that says basically "the user's words describe a goal, not a literal instruction." Without that rule, every edit feels like a thesaurus pass.
The prompt
Stripped-down version. Real one has tool calls, span anchors, and a lot of edge-case handling. This is the core:
You are a career coach auditing a CV against a specific job posting.
JOB POSTING:
{job_description}
CV:
{cv_text}
For each CV section (summary, each work experience, skills, education):
1. What is the job posting actually looking for that this section could
speak to? Be specific. Not "leadership" but "running a small team
through messy product decisions without a PM."
2. Is there evidence in the section that proves the candidate has it?
Real evidence: outcomes, scope, scale, decisions made. Not
adjectives. Not implied things.
3. If the evidence is there but buried, suggest a rewrite that surfaces
it. The rewrite must:
- Preserve every fact. No invented numbers, no invented projects,
no invented anything.
- Replace vague verbs ("managed", "worked on", "helped with") with
specific ones grounded in what actually happened.
- Lead with the outcome.
4. If the evidence isn't there, say so. Do not invent it. You can
suggest what the candidate could add IF they have it, framed as
a question.
5. Score 1-5 on how well this section speaks to this specific posting.
One sentence justifying the score.
Output as JSON, one entry per section.
Don't change the voice or the tense. Don't add buzzwords that aren't
already implied by what the candidate actually did.
The lines doing the most work, in case you skim:
- "Real evidence: outcomes, scope, scale, decisions made. Not adjectives." This single sentence kills 80% of the keyword-salad failure mode.
- "No invented numbers." Without this, the model will absolutely hallucinate "increased revenue by 23%" and then double down when you ask where that came from.
- The per-section score with a one-sentence justification. This is what stops the model from waving its hands.
What still breaks
Two things, even with all of this.
The model is too agreeable. If the user pushes back ("this bullet is fine, leave it"), the model folds. Even when the bullet is objectively weak. You have to tell the model explicitly that user disagreement doesn't reset the audit. It can soften, but it can't pretend the gap doesn't exist.
The model forgets which job it's evaluating against. After three or four turns of edits, the JD context starts to fade and rewrites drift toward "what a generic recruiter would like." Fix is repetition. Re-anchor every section's evaluation to the actual posting. Don't trust the model to remember.
The 95%
Here's the thing I didn't expect when I started.
The prompt is maybe 5% of the work. The other 95% is making this feel like a coach instead of a JSON dump. Streaming responses so suggestions appear as the model thinks. Anchoring edits to specific spans of text in the CV so the user can accept or reject inline. Autosave, because nobody wants to lose a draft. Undo. Persistence of which suggestions were accepted, so the next session doesn't re-suggest them.
That's where the actual product is. The prompt is the easy part once you get the framing right.
Use it
The prompt above is fine for personal use. Paste your CV, paste a JD, run it, get a structured audit you can actually act on. It won't be as polished as a real product but it'll be ten times more useful than "please tailor my CV."
If you do build something with it I'd love to see it. And if you'd rather skip the building part there's the version I shipped which handles cover letters and interview prep too. Same auditing logic underneath.
Top comments (0)