AI-агент для HR: автоматизація скринінгу резюме та спілкування з кандидатами

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
AI-агент для HR: автоматизація скринінгу резюме та спілкування з кандидатами
Середній
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1354
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1248
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    951
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1186
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    643
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    925

Як 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 (бажано), готовність до нічних змін (обов'язково).

Пайплайн агента:

  1. Парсинг вхідних резюме з hh.ru/Авіто (API)
  2. Скринінг через LLM (50 резюме за 8 хвилин vs 4 години вручну)
  3. Топ-30% → запрошення на телефонний скринінг
  4. Відмови → персоналізована відповідь автоматично
  5. Після скринінгу → призначення особистого інтерв'ю (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.

Практичний розбір LLM: fine-tuning, RAG, агенти, деплой

Модель GPT‑4 або Claude 3.5 Sonnet через публічне API — не рішення, а просто інструмент. Коли приходить вимога «зробити як ChatGPT, але на наших даних», за нею стоїть реальна інженерна задача: від налаштування промптів до навчання 70B‑моделі на власній інфраструктурі. LLM розробка під ключ — це складний стек, і ми займаємося цим понад 5 років. За цей час реалізовано понад 20 проєктів у галузі генеративного AI: від RAG‑систем для юридичних департаментів до кастомних агентів для техпідтримки. Де саме знаходиться ваша задача — залежить від даних, latency‑вимог, бюджету та того, наскільки критична конфіденційність.

Типова ситуація: клієнт уже спробував ChatGPT, але результати нестабільні — то відповідає точно, то галюцинує. Або потрібна інтеграція в корпоративний портал з дотриманням політик безпеки. Розберемо кожен шар стеку в деталях — від RAG до production‑деплою.

Чому RAG‑системи ламаються і як це виправити?

RAG (Retrieval‑Augmented Generation) виглядає просто: знайшли релевантні документи, поклали в контекст, модель відповіла. На практиці збоїть у кількох місцях.

Chunking без перекриття. Класична помилка: chunk_size=512, overlap=0. Якщо відповідь лежить на межі двох чанків, retrieval не знайде жодного з достатньою впевненістю. Рішення: overlap 15–25% від chunk_size, а краще sentence‑aware splitting через spaCy або NLTK, а не наївне розбиття за символами.

Поганий embedder. Текст‑embedding‑ada‑002 — хороший для загального випадку, але на юридичних або медичних текстах програє спеціалізованим моделям: E5‑large‑v2, BGE‑M3 або fine‑tuned sentence‑transformers на доменних даних. Різниця в Recall@5 може становити 15–25%.

Відсутність re‑ranking. Векторний пошук оптимізований за швидкістю, не за релевантністю. Cross‑encoder re‑ranker (ms‑marco‑MiniLM‑L‑6‑v2, bge‑reranker‑large) після первинного retrieval піднімає точність топ‑3 при прийнятній затримці (+50–150 ms). Це часто важливіше за покращення embedding‑моделі.

Гібридний пошук. Тільки dense вектори погано працюють на точних запитах: імена, артикули, коди. BM25 (sparse) добре знаходить точні збіги, але не розуміє семантику. Гібрид через RRF (Reciprocal Rank Fusion) — оптимальний компроміс. Qdrant, Weaviate та pgvector 0.7+ підтримують гібридний пошук нативно.

Типова production‑архітектура корпоративного knowledge base
  1. Документи → preprocessing (PyMuPDF, Unstructured)
  2. Chunking → embedding (BGE‑M3)
  3. Qdrant (гібридний dense+sparse)
  4. Cross‑encoder re‑ranking
  5. Контекст → LLM (vLLM або OpenAI API)
  6. Відповідь з джерелами (RAGAS для оцінки якості)

Коли варто fine‑tune, а не промпт‑інжиніринг?

Промпт‑інжиніринг вирішує ~70% завдань адаптації LLM під домен. Решта 30% вимагають донавчання. Три ознаки: модель ігнорує специфічний формат виведення навіть при детальному описі в промпті; задача вимагає глибокого знання спеціалізованої лексики (медицина, право); потрібно значно знизити витрати на токени, замінивши велику модель меншою спеціалізованою.

LoRA та QLoRA — стандарт для SFT. LoRA додає trainable low‑rank матриці до attention‑шарів. Типова конфігурація для Llama‑3 8B: r=64, lora_alpha=128, target_modules=["q_proj","v_proj","k_proj","o_proj"] — параметрів, що навчаються, ~0.8%, навчання на одній A100 40GB. QLoRA додає 4‑бітну квантизацію (NF4) і дозволяє fine‑tune 70B модель на двох A100 40GB, хоча швидкість падає вдвічі порівняно з bf16.

DPO замість RLHF. Direct Preference Optimization вимагає лише пари (chosen, rejected), а не скалярні reward‑сигнали. DPOTrainer з бібліотеки trl (Hugging Face) реалізує це кількома десятками рядків.

Типова помилка. Датасет з 500 прикладів, 5 епох, validation loss 0.8 — здається норм. Але на тесті модель деградувала на загальних інструкціях. Причина: catastrophic forgetting. Рішення — додати 10–20% загальних instruction‑following прикладів (Alpaca, FLAN) у навчальну вибірку, щоб не зруйнувати вихідні здібності.

Як обрати базову модель: 8B чи 70B?

Модель Параметри Сильні сторони Контекст
Llama‑3.1 8B 8B Баланс якість/швидкість 128k
Llama‑3.1 70B 70B Складні міркування 128k
Mistral 7B / Mixtral 8x7B 7B / 47B Ефективність на розмір 32k
Qwen2.5 72B 72B Код, мультимовність 128k
Gemma 2 27B 27B Відкрита ліцензія 8k

Для більшості задач fine‑tuning 8B моделі достатньо. 70B потрібен, коли потрібне глибоке міркування або baseline 8B не досягає потрібної якості навіть після донавчання. Вартість інференсу Llama‑3 8B через vLLM на A100 значно нижча, ніж у GPT‑4, що робить його економічно вигідним.

Що дає PagedAttention в production?

vLLM — перший вибір для serving open‑source моделей. PagedAttention — ключове технічне рішення: KV‑cache керується як virtual memory в ОС, без фрагментації. Це дає throughput у 2–4 рази вище порівняно з наївним HuggingFace Transformers inference. Документація vLLM підтверджує: continuous batching та PagedAttention — стандарт для високонавантажених LLM‑сервісів.

Типові числа на A100 80GB для Llama‑3 8B (bf16): 400–600 req/s, P50 latency 200–400ms, P99 latency 600–900ms при concurrency 64. Для 70B на двох A100 з tensor parallelism: 80–120 req/s, P99 latency 1.5–2.5s. Квантизація AWQ або GPTQ знижує споживання пам'яті в 2 рази при втраті якості в межах 1–3%.

Мультиагентні системи

Агенти — LLM з доступом до інструментів: пошук, виконання коду, запити до API, робота з БД. Основні патерни:

  • ReAct (Reason + Act): модель розмірковує → обирає інструмент → спостерігає результат → знову розмірковує. LangChain та LlamaIndex реалізують з коробки.
  • Multi‑agent orchestration: кілька спеціалізованих агентів з координатором зверху. Приклад: coordinator → researcher (пошук + summarization) → coder (генерація та виконання коду) → critic (перевірка). Інструменти: AutoGen (Microsoft), CrewAI, кастомна реалізація на LangGraph.

В продакшені агентні системи недетерміновані. Обов'язкові guardrails, ліміти кроків, логування кожного кроку, human‑in‑the‑loop для критичних дій.

Як ми гарантуємо якість LLM рішення?

Ми використовуємо RAGAS для автоматичної оцінки відповідей: faithfulness, answer relevancy, context precision. Система трекінгу експериментів на базі MLflow фіксує всі метрики, датасети та конфіги. Це дозволяє порівнювати різні гіпотези та доводити покращення з цифрами. Гарантію стабільної роботи забезпечує continuous integration з тестами на специфічних сценаріях (prompt injection, edge‑cases).

Як почати LLM розробку: наступні кроки

Ми передаємо:

  • Технічну документацію (model card, конфіги, інструкції з розгортання)
  • Доступ до інфраструктури (репозиторій з кодом, навчені ваги)
  • 1 місяць підтримки після деплою (консультації, виправлення багів)
  • Навчання команди замовника (2–3 заняття з експлуатації системи)

Терміни: базовий RAG‑прототип — 1–2 тижні. Fine‑tuning з даними замовника — 3–6 тижнів (з урахуванням підготовки даних). Production‑система з моніторингом та перенавчанням — 2–4 місяці.

Етап Тривалість Що отримуєте
Аудит та збір даних 1–2 тиж. Eval‑датасет з 100+ прикладів, формалізація задачі
Baseline (промпт + RAG) 1–2 тиж. Робочий прототип, метрики якості
Fine‑tuning (якщо потрібно) 2–4 тиж. Навчена модель, LoRA‑ваги, model card
Деплой та моніторинг 1–2 тиж. vLLM сервер, Grafana + Prometheus
Документація та навчання 1 тиж. API‑документація, навчання команди

Вартість розраховується індивідуально і залежить від обсягу даних, складності моделі та вимог до інфраструктури. Хочете оцінити свій проєкт? Зв'яжіться з нами — ми підготуємо попереднє резюме за 1–2 робочі дні. Або замовте консультацію фахівця з вибору підходу: RAG, fine‑tuning або гібрид — розповімо, що підійде саме вам.