Розробка AI-агента для HR (скринінг резюме, відповіді кандидатам)

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

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

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

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

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

AI-агент для HR (скрининг резюме, відповіді кандидатам)

AI-агент для HR автоматизує масові задачі: первинний скрининг резюме за критеріями вакансії, ранжування кандидатів, автоматичні відповіді, призначення інтерв'ю, збір зворотного зв'язку. Це знижує навантаження рекрутерів та скорочує time-to-hire при збереженні якості відбору.

Компоненти 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

Автоматичні відповіді кандидатам

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)

Практичний кейс: масовий найм call center

Задача: найм 80 операторів call center за 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 спільно оцінених)
  • Частка хибних відмов (кваліфіковані відхилені): 4,1%
  • Time-to-hire: 42 дні → 28 днів
  • Фокус рекрутера: переключився на інтерв'ю та onboarding

Юридичне обмеження: фінальне рішення про найм — за людиною. Агент робить рекомендацію, рекрутер підтверджує.

Anti-bias фільтрація

ANTI_BIAS_PROMPT_ADDENDUM = """ВАЖЛИВО: При оцінці:
- НЕ враховуй ім'я, стать, вік (якщо вказаний), національність
- Оцінюй тільки професійні компетенції та досвід
- Не робити припущення на основі особистих даних
- Застосовуй одинакові критерії до всіх кандидатів"""

Терміни

  • HR-агент скрининга: 2–3 тижні
  • Інтеграція з hh.ru/job board API: 1–2 тижні
  • Автоматичні відповіді + calendar: 1 тиждень
  • Калібрування з рекрутером: 1–2 тижні
  • Всього: 5–8 тижнів