AI-Generated Job Descriptions: How to Attract Strong Candidates
What are AI-generated job descriptions?
AI-generated job descriptions are vacancy postings created by feeding raw hiring manager input into an LLM with a structured two-step prompt — generation followed by a critical review pass — to produce descriptions that filter candidates rather than attract volume. The key technique is replacing vague responsibilities with 3-5 specific first-90-day tasks, which causes qualified candidates to self-select and unqualified ones to opt out.
TL;DR
- -78% of LinkedIn applications come from unqualified candidates; vague JDs are the root cause, not applicant quality
- -Describe 3-5 specific first-90-day tasks instead of vague responsibilities — candidates self-select accurately
- -Split requirements into max 5 must-haves and max 5 nice-to-haves; LinkedIn data shows women apply only at 100% match vs men at 60%
- -Two-prompt architecture: Step 1 generates the JD from raw hiring manager input; Step 2 runs a critical review pass
- -Forbidden phrase list in the prompt is essential — without it LLMs reproduce 'fast-growing', 'proactive team player' clichés
78% of LinkedIn job applications come from candidates who don’t meet the role’s requirements. On major job boards the situation is similar: recruiters spend an average of 23 hours per week screening irrelevant resumes. The root cause is the job descriptions themselves. Vague descriptions attract high-volume applications. Keyword-bloated postings scare off strong candidates and attract people who’ve learned to game ATS filters.
This article covers using LLMs to generate job descriptions that act as filters — attracting the right candidates and cutting out irrelevant applications. Prompts, templates, and concrete before/after examples of typical job postings transformed. The same approach of structured generation from raw data described in the context engineering guide.
Why Standard Job Descriptions Don’t Work
A typical job description is assembled from three sources: a template from a previous hire, a requirements list from the team lead, and a corporate company description from HR. The result is predictable.
A list of requirements instead of a description of the work. “5+ years of experience, Python, SQL, Docker, Kubernetes, CI/CD, Terraform, AWS/GCP, PostgreSQL, Redis, RabbitMQ, Kafka.” The candidate sees 12 technologies and has no idea which ones are used daily and which were added “just in case.” Strong specialists skip the posting if they don’t check 100% of the boxes. Weaker ones apply to everything.
Corporate language. “We’re a fast-growing company, a market leader in our segment, looking for a proactive team player with strong multitasking skills.” Zero substance. These phrases are copy-pasted from posting to posting and convey nothing about what the job actually involves.
No task context. The candidate doesn’t know what they’ll be doing in their first month. Doesn’t know what problems the team is solving. Doesn’t know why the position opened up. Without this, decisions are made on salary range and company name.
Hidden ATS filters. Applicant Tracking Systems filter by keywords. Recruiters add more keywords to widen the funnel. Candidates learn to embed keywords in white-on-white text. Both sides are optimizing for the algorithm, not for hiring quality.
What Makes a Job Description Work
Research consistently shows a clear correlation between job description structure and application quality.
Specific tasks instead of vague responsibilities. Not “developing high-load systems,” but “migrate the billing monolith (PostgreSQL, 50M transactions/month) to an event-driven architecture over 6 months.” The candidate immediately gauges: is this interesting? Can I handle it? Do I want to?
Separating must-have from nice-to-have. 3–5 hard requirements, 3–5 preferred ones. LinkedIn research shows women apply only when they meet 100% of requirements, while men apply at 60%. A clear split broadens pipeline diversity.
Transparent conditions. Salary range, work format, team size, production stack. Every hidden parameter increases irrelevant applications: candidates invest time in interviews and decline at the offer stage.
The team’s voice, not HR’s. Job postings written by the direct manager or a team member get 30–40% more relevant applications. The problem is that engineers don’t like writing job descriptions — and aren’t good at it. LLMs fill exactly that gap.
Prompt Architecture for Job Description Generation
Generating a quality job description through an LLM requires structured context. The principle is the same as in process documentation: the more precise the input, the more useful the output.
Step 1. Collect Raw Data
Before running the LLM, you need context from real sources. The minimum set:
- Input from the hiring manager. 5–10 minutes of voice message or free-form text: why this person is needed, what the tasks are, what’s urgent, what’s not.
- Current stack. Not “everything we use” — specifically what this team uses, what’s in production, what’s being rolled out.
- Team context. Size, structure, who’s there now, which roles are filled, which aren’t. Autonomy level: are tasks given or problems.
- Reason the role opened. Growth, backfill, new project. This sets the tone and urgency.
- Past hiring failures. Who applied but didn’t work out. Which signals turned out to be false positives.
Step 2. Base Generation Prompt
You are a technical recruiter with 10 years of IT hiring experience.
Generate a job description based on the input data below.
RULES:
- Start with 2-3 sentences about the actual task, not the company
- Split requirements into "required" (max 5) and "nice to have" (max 5)
- Describe 3-5 specific tasks for the first 3 months
- Include team size, work format, production stack
- Do not use: "fast-growing", "market leader",
"proactive", "multitasking", "fast-paced environment"
- Tone: direct, concrete, respectful
- Length: 400-600 words
INPUT DATA:
{paste collected context here}
This prompt sets structure and anti-patterns. The key constraint is the list of forbidden phrases. Without it, the LLM reproduces corporate clichés from its training data.
Step 3. Critical Review Prompt
Generation without review produces mediocre results. A second LLM call acts as an editor:
Analyze the job description below. Evaluate against these criteria:
1. SPECIFICITY: Can the candidate understand what they'll be doing
in their first month? (yes/no + what to fix)
2. FILTERING: Will the text screen out irrelevant candidates?
(yes/no + what to fix)
3. CLICHÉS: Are there phrases that carry no real information?
(list + replacements)
4. REQUIREMENTS BALANCE: Is it realistically possible to find
someone who meets ALL required criteria? (yes/no + what to
move to "nice to have")
5. TRANSPARENCY: Are there conditions whose omission will lead
to offer-stage rejections? (list of missing items)
Return a revised version with [CHANGED] tags on each edit.
JOB DESCRIPTION:
{paste result from step one here}
The two-step approach (generate + review) consistently outperforms single-shot generation with a more complex prompt.
Before/After Example: Backend Developer
Before (typical posting)
Backend Developer (Python)
About us: We're a fast-growing fintech startup developing
an innovative financial management platform.
Requirements:
- Python 5+ years
- Django/FastAPI
- PostgreSQL, Redis
- Docker, Kubernetes
- CI/CD (Jenkins/GitLab CI)
- AWS (EC2, S3, Lambda, SQS, RDS)
- Kafka/RabbitMQ
- Experience with high-load systems
- Understanding of SOLID, DDD principles
- English B2+
Responsibilities:
- Backend development and maintenance
- API design
- Code review
- Writing tests
- Collaboration with the product team
We offer:
- Competitive salary
- Flexible schedule
- Friendly team
Problems: 10 technical requirements with no prioritization. Responsibilities describe any backend role anywhere in the world. “Competitive salary” is content-free. The candidate doesn’t understand the task, the scale, or the challenge.
After (AI generation + review)
Backend Developer (Python) — Billing Migration
The payment system processes 2M transactions per month
through a Django monolith. The architecture isn't scaling:
API response time grew from 200ms to 1.2s over the last
quarter. We need an engineer to help decompose billing
into services and bring latency back down to 300ms.
First 3 months:
- Design an event-driven architecture for the transactions
module (Kafka + PostgreSQL)
- Extract commission calculations from the monolith
into a standalone FastAPI service
- Set up load testing (Locust) for critical endpoints
Required:
- 3+ years of Python in production
- PostgreSQL experience at 100K+ records/day load
- Understanding of event-driven patterns (Kafka not required)
- Experience decomposing a monolith (at least one project)
Nice to have:
- FastAPI in production
- Kafka/RabbitMQ
- AWS (we use ECS + RDS)
- Load testing experience
Team: 4 backend engineers, 1 DevOps, 1 QA. Architecture
decisions are made by the team, not management.
Format: remote, 2 syncs per week (morning, Eastern time).
Salary: $90–120K, review after 6 months.
The difference: a specific task instead of vague responsibilities. 4 required skills instead of 10. In 30 seconds, the candidate understands the scale, the challenge, and the conditions. A strong engineer sees an interesting problem. A weaker one understands they’re not the right fit. Both save time.
Adapting for Different Roles
The prompt structure is universal, but the emphasis shifts.
Technical Roles (engineers, DevOps, SRE)
Focus on tasks, stack, and scale. Engineers make decisions based on the technical challenge. Add to the prompt:
Additional rules for technical roles:
- State the system's scale (RPS, data volume, user count)
- Describe the current architecture in 2-3 sentences
- Name the main technical problem this role will solve
- Specify the level of autonomy: are tasks given or problems
Product Roles (PM, designers, analysts)
Focus on the product, metrics, and impact. Add:
Additional rules for product roles:
- Describe the product: who the users are, what problem it solves
- State the key metrics this role affects
- Describe the decision-making process (data-driven, founder-driven)
- Name the most significant recent product decision the team made
Leadership Roles (team lead, CTO, VP)
Focus on company context, stage, and challenges. Add:
Additional rules for leadership roles:
- Describe the company stage and engineering team size
- Name 2-3 strategic priorities for the next year
- Describe current processes (or lack thereof)
- Define expectations for the role at 6 and 12 months
Anti-Patterns in AI Job Description Generation
LLMs reproduce patterns from their training data. Without guardrails, the result will be above average — but not optimal.
Enthusiastic tone. LLMs tend toward positive framing: “unique opportunity,” “incredible team,” “cutting-edge technology.” Add to the prompt: “Tone: measured and factual. No superlatives.”
Requirement inflation. The model adds requirements not in the input, extrapolating from typical job postings. Counter it: “Use ONLY requirements from the input data. Do not add technologies that are not mentioned.”
Boilerplate calls to action. “If you’re an ambitious professional who wants to change the world…” Replace with specifics: “Apply if you’ve dealt with monolith decomposition before and find it interesting.”
Anti-requirements. It’s useful to explicitly state who this role isn’t for. Example: “This role is not a good fit if you’re looking for a clean greenfield project with no legacy, or a position with minimal communication.” This can reduce irrelevant applications by 15–20%.
Automating the Process
Manual copy-pasting prompts works for one-off hires. For regular hiring it makes sense to automate.
Minimal Automation
A template in Notion/Google Docs with fields for the hiring manager to fill in. A script pulls data from the template, injects it into the prompt, calls the API, and writes the result back to the document.
import openai
def generate_job_description(raw_input: dict) -> str:
"""Generate a job description from structured input."""
context = f"""
Role: {raw_input['role']}
Reason for opening: {raw_input['reason']}
First 3 months tasks: {raw_input['tasks_3m']}
Production stack: {raw_input['stack']}
Team: {raw_input['team']}
Required skills: {raw_input['must_have']}
Conditions: {raw_input['conditions']}
Past hiring anti-patterns: {raw_input['anti_patterns']}
"""
response = openai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": context}
],
temperature=0.7
)
return response.choices[0].message.content
Extended Automation
Add a second review call. Add generation of platform-specific versions (LinkedIn, job boards, Telegram channels) — each platform has its own length limits and format conventions. Store a history of job descriptions and hiring outcomes to refine prompts over time.
Measuring Job Description Effectiveness
Generating a description isn’t enough. Measure results and iterate on the prompts.
View-to-apply conversion rate. Target range: 8–15%. Below 5% — the copy isn’t motivating; above 20% — requirements are too vague.
Relevant application rate. Percentage of candidates passing the initial screen. Before AI generation: typically 15–25%. After: target 40–60%.
Time-to-fill. Time from posting to offer acceptance. Specific job descriptions reduce this by cutting down on irrelevant interviews.
Offer-stage rejections. If candidates decline after the final interview, critical information is missing from the posting. Add it to the template.
Track the “job description text → outcome metrics” pair for every hire. After 5–10 hires, you’ll have enough data to identify patterns: which phrasings correlate with application quality.
Common Mistakes When Rolling This Out
Generating without input data. “Write a job description for a Python developer” produces a generic result. The LLM doesn’t know your team’s context. Without input data the result will be better than a typical template — but well below the target.
Not adapting for the platform. A LinkedIn job post (2,600-character description limit) and a structured job board posting require different formats. One prompt — one platform.
Skipping the hiring manager review. AI generates text, but only the manager knows the nuances: “we’re NOT using Kafka, that’s next year’s plan” or “the team will grow to 8 people next quarter.” Review takes 5 minutes and prevents false expectations.
Not updating prompts. The job market changes. Phrases that worked six months ago stop working. Metrics help you spot degradation and adjust.
Where to Start
- Take one open role. Don’t try to automate all hiring at once.
- Collect context from the hiring manager. 10 minutes of voice message or a filled-out template. The more detailed the input, the more precise the output.
- Run the two-step generation. Base prompt + review prompt from this article. Copy, fill in your data, run it.
- Compare against your current version. Run an A/B test: publish the AI version on one platform, the old one on another. Measure conversion and relevant application rate.
- Iterate. After the first hire, update the prompt based on results: which phrasings worked, which ones attracted the wrong candidates.
The goal isn’t to replace the recruiter or the hiring manager. The goal is to remove from them the task they do poorly (writing text) and leave them with what they do well (understanding context and evaluating people).