Разработка AI-системы для ранжирования кандидатов

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы для ранжирования кандидатов
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

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 месяца.