AI-система ранжирования кандидатов
Типичная ситуация в рекрутинге: 400 резюме на позицию, HR-менеджер успевает прочитать 30. Остальные отсеиваются по поверхностным признакам — заголовку должности, названию университета, наличию ключевых слов. Это не отбор лучших — это отбор первых попавшихся.
AI-ранжирование решает другую задачу: дать скор каждому кандидату относительно конкретной вакансии, объяснить этот скор HR-у и не потерять при этом нестандартные, но сильные профили.
Где ломается наивный подход
Простейший вариант — keyword matching или TF-IDF между описанием вакансии и резюме — даёт precision 0.45–0.55 на реальных данных. Кандидат с 10-летним опытом в «разработке программного обеспечения» проигрывает тому, кто написал точную фразу из JD. Семантика теряется.
Следующий шаг — embedding similarity через sentence-transformers. Здесь проблема другая: модели общего назначения (all-MiniLM-L6-v2, text-embedding-3-small) плохо работают с HR-специфичной семантикой. «Python» в JD и «Python» в резюме дата-аналитика и backend-разработчика — разные контексты, но embedding не различает.
Ещё сложнее — имплицитные требования. JD требует «опыт управления командой», кандидат написал «руководил группой из 5 аналитиков» — semantic match сработает, но нечёткий порог по cosine similarity (< 0.72) срежет.
Архитектура системы ранжирования
Многомерный scoring
Не один скор, а вектор оценок по ключевым измерениям:
- Hard skills match — семантическое совпадение технических навыков. Используем bi-encoder для первичного отбора (FAISS, топ-100), затем cross-encoder для точного скоринга (ms-marco-MiniLM-L-12-v2 или fine-tuned на HR-данных).
- Experience level — извлекаем из резюме количество лет релевантного опыта через NER + regex. Сопоставляем с требованием из JD.
- Career trajectory — анализируем прогрессию: рост ответственности, релевантность предыдущих позиций. LLM-вызов с structured output.
- Education & certifications — rule-based извлечение + нормализация названий вузов и сертификатов.
Финальный ранг — взвешенная сумма с весами под конкретную роль. Для junior-разработчика education весит больше, для senior — experience trajectory.
Fine-tuning на исторических данных
Если есть исторические данные по найму (кто был нанят, кто прошёл интервью, кто провалился) — это gold для обучения. Строим ranking model: на входе (вакансия, резюме), на выходе — вероятность успешного найма. LambdaRank или ListNet поверх embedding-признаков.
Осторожно с bias: если исторические данные содержат предвзятость (например, 90% нанятых — мужчины на технических позициях), модель её воспроизведёт. Обязательный шаг — fairness audit до деплоя.
Объяснимость для HR
Скор без объяснения — чёрный ящик, который HR игнорирует. Для каждого кандидата генерируем:
- Топ-3 совпадения с требованиями вакансии (с цитатой из резюме)
- Топ-2 расхождения (что требуется, чего нет)
- Одну рекомендацию по дополнительной проверке на интервью
Это делает ранжирование инструментом, а не заменой суждения.
Практический кейс
Клиент — аутсорсинговая IT-компания, 200+ открытых позиций одновременно. Существующий процесс: ручной просмотр в ATS (Huntflow). Время обработки воронки: 8–12 дней до первого звонка.
Построили систему: парсинг резюме (PDF/DOCX → структурированный JSON через LLM extraction + regex) → bi-encoder индексация в Qdrant → cross-encoder реранкинг топ-50 per vacancy → LLM-генерация объяснений → интеграция через Huntflow API, скоры отображаются прямо в карточке кандидата.
Результат после 3 месяцев: среднее время до первого звонка сократилось с 9.4 до 3.1 дня. HR-менеджеры стали просматривать в среднем топ-15 вместо топ-30 (меньше нерелевантных). Оффер-рейт по нанятым через систему: +22% по сравнению с историческим baseline.
Технический стек
| Компонент | Инструменты |
|---|---|
| Парсинг резюме | LlamaParse, Docling, кастомный LLM extraction |
| Embedding | text-embedding-3-large, E5-mistral-7b, jina-embeddings-v3 |
| Vector store | Qdrant, pgvector |
| Reranker | cross-encoder ms-marco, Cohere Rerank |
| Ranking model | LightGBM, LambdaRank (если есть исторические данные) |
| Объяснения | GPT-4o-mini, Claude Haiku (structured output) |
Этапы работы
Аудит данных — качество резюме в базе, наличие исторических данных найма, структура JD. Это определяет подход.
Прототип за 2 недели — bi-encoder + простое скалярное ранжирование, демо на 50 вакансиях.
Итерации с HR — калибровка весов, валидация на кейсах «хорошо известных» кандидатов. Без участия рекрутеров качество не настроить.
Fairness audit — обязательно перед деплоем, особенно если используются исторические данные.
Интеграция в ATS — через API Huntflow, Lever, Greenhouse или Workday. Либо standalone интерфейс.
Сроки: MVP за 4–6 недель, полноценная система с fine-tuning и ATS-интеграцией — 3–4 месяца.







