Як AI-агент прискорює скринінг резюме та покращує досвід кандидатів
HR-відділ отримав 600 резюме за тиждень після публікації вакансії senior-розробника. Рекрутери працюють 12 годин на добу, але черга не зменшується, а найкращі кандидати отримують офери від конкурентів раніше, ніж ви встигаєте відповісти. Знайома ситуація? Ми побудували AI-агента, який за годину обробляє сотню резюме з точністю 89%, автоматично пише персоналізовані відмови та запрошення, призначає інтерв'ю через календар. Усе це без дискримінації за статтю чи віком — анти-bias фільтрація вбудована за замовчуванням.
Агент вирішує три ключові проблеми: ручний скринінг (довго та суб'єктивно), масові відповіді (кожну відмову писати вручну — пекло для рекрутера) та аналітика найму (хто провалився на якому етапі, які навички найчастіше бракують). Нижче — технічна реалізація та реальний кейс із нашої практики.
Компоненти HR-агента
from pydantic import BaseModel
from typing import Optional, Literal
from openai import OpenAI
import json
client = OpenAI()
class CandidateScreeningResult(BaseModel):
candidate_id: str
overall_score: int # 0-100
hard_skills_match: int # % відповідності hard skills
experience_match: int # % відповідності досвіду
red_flags: list[str] # Стоп-фактори
green_flags: list[str] # Сильні сторони
recommendation: Literal["strong_yes", "yes", "maybe", "no"]
next_step: str
personalized_rejection_reason: Optional[str]
def screen_resume(
resume_text: str,
job_description: str,
required_skills: list[str],
nice_to_have: list[str],
) -> CandidateScreeningResult:
"""Скринінг резюме відносно вимог вакансії"""
response = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Ти — досвідчений рекрутер. Об'єктивно оціни відповідність кандидата вакансії.
НЕ роби припущень — якщо досвід не вказаний явно, вважай його відсутнім.
Будь чесним в оцінці стоп-факторів."""
}, {
"role": "user",
"content": f"""Вакансія:
{job_description}
Обов'язкові навички: {required_skills}
Бажані навички: {nice_to_have}
Резюме кандидата:
{resume_text}"""
}],
response_format=CandidateScreeningResult,
temperature=0,
)
return response.choices[0].message.parsed
Як ми досягаємо точності 90%+?
Магія не в моделі, а в промпті та постобробці. Системний промпт вище забороняє домислювати навички — критично для чесного скринінгу. Додатково ми прогоняємо результат через анти-bias фільтр та логуємо кожен виклик для audit trail.
Порівняйте: людина переглядає 100 резюме за 4.5 години, агент — за 18 хвилин. Concordance rate 89% означає, що агент згоден з рекрутером у 9 з 10 випадків. Краще за людину? Ні, але швидше в 15 разів. За даними LinkedIn Talent Solutions, середній time-to-hire в IT — 35 днів.
Автоматичні відповіді кандидатам
def generate_candidate_response(
candidate_name: str,
decision: str,
position: str,
feedback: str = None,
) -> str:
"""Персоналізована відповідь кандидату"""
templates = {
"invite_interview": f"""Шановний(а) {candidate_name},
Дякуємо за інтерес до позиції {position}. Ваш досвід видався нам цікавим, і ми хотіли б запросити вас на інтерв'ю.
Доступні слоти: [CALENDAR_LINK]
Інтерв'ю триватиме близько 45 хвилин. Формат — відеодзвінок.
З повагою, команда рекрутингу""",
"rejection": None, # Генеруємо персоналізовано
}
if decision == "rejection" and feedback:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": "Напиши ввічливу відмову кандидату. Тон: шанобливий, без кліше типу 'ви нам не підходите'. Вкажи конкретну причину (без принизливих формулювань)."
}, {
"role": "user",
"content": f"Кандидат: {candidate_name}, Позиція: {position}, Причина: {feedback}"
}],
)
return response.choices[0].message.content
return templates.get(decision, "")
Пайплайн масового скринінгу
import asyncio
from typing import List
async def batch_screen_resumes(
resumes: List[dict],
job_description: str,
required_skills: List[str],
concurrency: int = 10,
) -> List[dict]:
"""Паралельний скринінг кількох резюме"""
semaphore = asyncio.Semaphore(concurrency)
async def screen_single(resume: dict) -> dict:
async with semaphore:
result = await asyncio.to_thread(
screen_resume,
resume["text"],
job_description,
required_skills,
[],
)
return {
"candidate_id": resume["id"],
"name": resume["name"],
"email": resume["email"],
"screening": result,
}
results = await asyncio.gather(*[screen_single(r) for r in resumes])
# Сортуємо за score
return sorted(results, key=lambda x: -x["screening"].overall_score)
Практичний кейс: найм 80 операторів кол-центру
Задача: найм 80 операторів кол-центру за 3 місяці. Вхідний потік — 600+ резюме на тиждень. Рекрутер один.
Критерії скринінгу: досвід роботи з клієнтами (обов'язково), грамотне письмове мовлення (обов'язково), знання CRM (бажано), готовність до нічних змін (обов'язково).
Пайплайн агента:
- Парсинг вхідних резюме з hh.ru/Авіто (API)
- Скринінг через LLM (50 резюме за 8 хвилин vs 4 години вручну)
- Топ-30% → запрошення на телефонний скринінг
- Відмови → персоналізована відповідь автоматично
- Після скринінгу → призначення особистого інтерв'ю (Calendly інтеграція)
Результати:
- Час скринінгу 100 резюме: 4.5 год (вручну) → 18 хв (агент)
- Concordance rate (агент vs рекрутер): 89% (перевірено на 200 спільно оцінених)
- Частка хибних відмов (qualified rejected): 4.1%
- Time-to-hire: 42 дні → 28 днів
- Рекрутер фокус: переключився на інтерв'ю та onboarding
Замовник зекономив $8 000 на місяць на зарплаті другого рекрутера, агент взяв на себе 70% навантаження. Вартість впровадження окупилася за два місяці за рахунок скорочення time-to-hire.
Деталі анти-bias аудиту
Після кожного батчу ми запускаємо перевірку розподілу рекомендацій за захищеними групами (стать, вік, національність, якщо дані доступні). Якщо виявлено зміщення більше 5% від очікуваного — коригуємо промпт або перенавчаємо модель. Це гарантує compliance з трудовим законодавством.Юридичне обмеження: фінальне рішення про найм — за людиною. Агент робить рекомендацію, рекрутер підтверджує.
Чому варто впровадити AI-агента?
| Метрика | Людина (8 год) | AI-агент | Ефект |
|---|---|---|---|
| Резюме за годину | 12-15 | 150-200 | x13 швидше |
| Час на відмову | 3-5 хв | 15 сек | automation |
| Точність | 85-90% | 89% | порівнянно |
| Суб'єктивність | висока | низька | bias-free |
| Масштабування | лінійне | логарифмічне | без збільшення FTE |
Що входить у розробку AI-агента?
| Етап | Тривалість | Результат |
|---|---|---|
| Аудит воронки найму | 3-5 днів | звіт щодо точок автоматизації |
| Розробка прототипу агента | 2-3 тижні | MVP зі скринінгом та відповідями |
| Інтеграція з ATS/job board | 1-2 тижні | двосторонній обмін даними |
| Анти-bias калібрування | 1 тиждень | аудит на тестовій вибірці |
| Деплой та документування | 1 тиждень | документація, навчання рекрутерів |
Anti-bias фільтрація
ANTI_BIAS_PROMPT_ADDENDUM = """ВАЖЛИВО: При оцінці:
- НЕ враховуй ім'я, стать, вік (якщо вказано), національність
- Оцінюй лише професійні компетенції та досвід
- Не роби припущень на основі особистих даних
- Застосовуй однакові критерії до всіх кандидатів"""
Терміни
- HR-агент скринінгу: 2–3 тижні
- Інтеграція з hh.ru/job board API: 1–2 тижні
- Автоматичні відповіді + calendar: 1 тиждень
- Calibration з рекрутером: 1–2 тижні
- Разом: 5–8 тижнів
На основі технологій LLM OpenAI GPT-4o, LangChain, ChromaDB.







