AI-автогенерація описів вакансій
HR-відділ витрачає від 30 до 90 хвилин на складання одного опису вакансії. AI-система генерує структурований job description за 15–30 секунд за названням посади, стеком та ключовими вимогами — зберігаючи tone of voice компанії, гендерно-нейтральні формулювання та SEO-оптимізацію для агрегаторів вакансій.
Генератор описів вакансій
from openai import AsyncOpenAI
from dataclasses import dataclass, field
client = AsyncOpenAI()
@dataclass
class JobBrief:
title: str
department: str
employment_type: str # full-time, part-time, contract, freelance
experience_years: tuple # (min, max)
tech_stack: list[str]
responsibilities: list[str]
company_description: str
tone: str = "professional" # professional, startup, corporate, creative
language: str = "uk"
include_salary_range: bool = False
salary_range: tuple = None
async def generate_job_description(brief: JobBrief) -> dict:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Ви — HR-копірайтер, спеціаліст з employer branding.
Створіть опис вакансії для агрегаторів вакансій (LinkedIn, Indeed, GitHub Jobs).
ВИМОГИ:
- Заголовок: посада + ключові технології (для SEO в пошуку)
- Про компанію: 2–3 речення, конкретні факти, без «лідер ринку»
- Обов'язки: 5–7 пунктів з дієсловами дії, конкретні
- Вимоги: hard skills окремо від soft skills, must-have проти nice-to-have
- Умови: без води, тільки факти
- Гендерно-нейтральні формулювання
- Tone of voice: {brief.tone}
Повертає JSON: {{title_seo, about_company, responsibilities, requirements_hard, requirements_soft, nice_to_have, conditions, cta}}"""
}, {
"role": "user",
"content": f"""
Посада: {brief.title}
Відділ: {brief.department}
Тип зайнятості: {brief.employment_type}
Досвід: {brief.experience_years[0]}–{brief.experience_years[1]} років
Tech stack: {', '.join(brief.tech_stack)}
Ключові завдання: {', '.join(brief.responsibilities)}
Про компанію: {brief.company_description}
{"Зарплата: " + f"{brief.salary_range[0]}–{brief.salary_range[1]} USD" if brief.include_salary_range and brief.salary_range else ""}
"""
}],
response_format={"type": "json_object"}
)
import json
return json.loads(response.choices[0].message.content)
Багатомовна генерація та адаптація під платформи
JOB_PLATFORM_FORMATS = {
"linkedin": {
"max_title": 120,
"sections": ["about_company", "responsibilities", "requirements_hard", "requirements_soft", "nice_to_have"],
"style": "професійний, з ключовими словами для LinkedIn Search"
},
"indeed": {
"max_title": 100,
"sections": ["about_company", "responsibilities", "requirements_hard", "conditions"],
"style": "структурований, без маркетингу"
},
"github_jobs": {
"max_title": 100,
"sections": ["responsibilities", "requirements_hard", "nice_to_have", "conditions"],
"style": "технічний, для IT-аудиторії, конкретні метрики"
}
}
async def adapt_for_platform(job_data: dict, platform: str) -> str:
fmt = JOB_PLATFORM_FORMATS.get(platform, JOB_PLATFORM_FORMATS["linkedin"])
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"Адаптуйте опис вакансії для платформи {platform}. Стиль: {fmt['style']}. Використовуйте розділи: {fmt['sections']}."
}, {
"role": "user",
"content": str(job_data)
}]
)
return response.choices[0].message.content
Масова генерація для найму
При закритті кількох вакансій одночасно система приймає CSV з посадами та стеками, генерує описи партіями по 10–15 вакансій паралельно через asyncio.gather, зберігає в форматах для кожної платформи. Для компаній з наймом 50+ позицій на рік це скорочує навантаження HR-команди на 200–300 годин щорічно.
Аналіз ефективності текстів
async def score_job_description(text: str) -> dict:
"""Оцінюємо опис вакансії за факторами привернення кандидатів"""
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Оцініть опис вакансії за критеріями (1–10):
- clarity: ясність вимог
- appeal: привабливість для кандидата
- seo_score: SEO для агрегаторів вакансій
- gender_neutrality: гендерна нейтральність
- specificity: конкретність (проти абстрактних вимог)
Повертає JSON з оцінками та рекомендаціями."""
}, {
"role": "user",
"content": text
}],
response_format={"type": "json_object"}
)
import json
return json.loads(response.choices[0].message.content)
Генератор описів вакансій з адаптацією для 3 платформ готовий за 1–2 тижні. Інтеграція з ATS (Huntflow, Talantix, Greenhouse) та автоматичне розміщення — ще 2–3 тижні.







