Как 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 |
Получите консультацию по внедрению — мы покажем, как агент впишется в ваш текущий workflow.
Что входит в разработку 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 недель
Закажите аудит вашей воронки найма — подберём архитектуру агента под ваш стек. Оценим проект за 2 дня. Пишите в Telegram или на почту — рассчитаем стоимость и сроки.
На основе технологий LLM OpenAI GPT-4o, LangChain, ChromaDB.







