Разбор

ИИ-агент скринирует 100 резюме за 15 минут: кейс с HH.ru и Claude API

На популярную вакансию приходит 150 откликов — и 4-6 часов ручного просмотра. Показываю как Python-агент на Claude API обрабатывает весь стек за 15 минут, выставляет оценки 1-10 с обоснованием и присылает топ-кандидатов прямо в Telegram HR-у.

• 7 мин чтения

Пятница, 11 утра. HR-менеджер открывает HH.ru — на вакансию маркетолога пришло 143 отклика за три дня. До обеда нужно отобрать 8-10 человек на первичный звонок. Она закрывает крышку ноутбука и идёт пить кофе. Во второй раз.

15 мин
столько нужно Python-агенту чтобы обработать 100 резюме, выставить оценки и прислать топ-5 в Telegram
против 4-6 часов ручного просмотра при том же объёме

Это не фантастика и не демо на идеальных данных. Это реальная схема, которую можно запустить за один вечер, имея базовые знания Python.

Боль, которую все знают, но мало кто измерял

Популярная вакансия на HH.ru в Москве — это 100-200 откликов в первую неделю. Менеджер по маркетингу, разработчик, продажник — любая массовая позиция. Даже узкая техническая вакансия часто собирает 50-70 резюме.

Стандартный процесс выглядит так: открываешь резюме, читаешь 30-60 секунд, отмечаешь «интересно» или закрываешь. После 40-го резюме начинаешь читать по диагонали. После 70-го — уже просто смотришь на компании и даты. После 100-го — ставишь галочки по принципу «ну пусть позвоним, вроде ничего».

Время на скрининг 100 резюме: человек vs агент
HR вручную
4-6 часов
HR устал (70+ резюме)
качество падает на 40%
Python-агент
12-15 минут
Оценка качества от исследования LinkedIn: после 3 часов непрерывного скрининга точность отбора падает на 36-42%. Источник: LinkedIn Talent Solutions, 2024.

Агент не устаёт. Резюме номер 1 и резюме номер 143 он оценивает с одинаковым вниманием по одним и тем же критериям.

Как устроена схема

Четыре компонента, соединённые последовательно.

📋
HH.ru API
Скачиваем отклики по вакансии
📄
Парсинг резюме
Текст + опыт + навыки
🤖
Claude API
Оценка 1-10 по критериям
📊
Рейтинг
Сортировка, топ-5
✈️
Telegram
Карточки HR-у

HH.ru предоставляет открытый API для работодателей. Авторизация через OAuth 2.0, доступ к откликам по конкретной вакансии — бесплатно при наличии аккаунта работодателя. Документация на hh.ru/article/23930.

Claude API получает текст резюме и промпт с критериями оценки. Возвращает структурированный JSON: оценка, плюсы, red flags, обоснование. python-telegram-bot отправляет итоговые карточки.

Критерии скрининга: как объяснить Клоду что искать

Это самая важная часть. Если критерии размытые — результат будет размытый.

Разница между плохим и хорошим критерием:

  • Плохо: «опыт в маркетинге»
  • Хорошо: «таргетированная реклама ВКонтакте или myTarget, 2+ года, есть кейсы с конкретными результатами — снижение CPL, рост CTR»

Red flags тоже нужно формулировать явно. Claude не читает между строк если ему не сказать что искать.

ДолжностьПлюс-критерииRed flags
Маркетолог

+ Кейсы со снижением CPL/CPA
+ Работал с бюджетом от 500k/мес
+ Знает Яндекс.Метрику + BI

! Только обязанности, ноль цифр
! Смена работы чаще 8 мес.
! «Управлял командой» без размера

Продажник B2B

+ Конкретный % выполнения плана
+ Опыт холодного поиска клиентов
+ Средний чек схожий с вашим

! Только входящий поток
! Нет цифр по конверсии
! Опыт только B2C

Head of SMM

+ Растил аккаунты с нуля (цифры)
+ Управлял командой 3+ человека
+ Есть живые примеры контента

! Только постинг без стратегии
! Все метрики «охваты», нет конверсий
! Ни одного запущенного проекта

Разработчик Python

+ Пет-проекты с кодом на GitHub
+ Опыт с FastAPI или Django
+ Описывает задачи, а не технологии

! Только курсы, нет реального опыта
! Список 20+ технологий без глубины
! Резюме на 5+ страниц у джуна

Промпт для Клода: как формулировать задачу оценки

Вот структура промпта которая даёт стабильный JSON-ответ:

Pythonscreener.py
import anthropic
import json

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

SCREENING_PROMPT = """
Ты — HR-ассистент. Оцени резюме кандидата на вакансию {position}.

КРИТЕРИИ ОЦЕНКИ (плюсы, за каждый +1-2 балла):
{plus_criteria}

RED FLAGS (минусы, за каждый -1-2 балла):
{red_flags}

БАЗОВЫЕ ТРЕБОВАНИЯ (обязательно, иначе max оценка 4):
{requirements}

РЕЗЮМЕ КАНДИДАТА:
{resume_text}

Верни ТОЛЬКО валидный JSON без комментариев:
{{
"score": <число от 1 до 10>,
"name": "<имя кандидата>",
"plus": ["<плюс 1>", "<плюс 2>"],
"red_flags": ["<флаг 1>"],
"summary": "<2-3 предложения: почему эта оценка>",
"recommend_interview": <true/false>
}}
"""

def score_resume(resume_text, position, criteria):
  prompt = SCREENING_PROMPT.format(
      position=position,
      plus_criteria="\n".join(criteria["plus"]),
      red_flags="\n".join(criteria["red_flags"]),
      requirements="\n".join(criteria["required"]),
      resume_text=resume_text[:4000]  # Claude limit
  )
  
  message = client.messages.create(
      model="claude-sonnet-4-6",
      max_tokens=512,
      messages=[{"role": "user", "content": prompt}]
  )
  
  return json.loads(message.content[0].text)

Обратите внимание на resume_text[:4000] — обрезаем резюме до 4000 символов. Большинство резюме укладываются в это ограничение, при этом в токены каждый запрос обходится примерно в 600-900 токенов. 100 резюме = ~80 000 токенов, это около 50-80 рублей по ценам API на май 2026.

Получение откликов через HH.ru API

Pythonhh_client.py
import requests
import time

HH_API = "https://api.hh.ru"

def get_applications(vacancy_id, token, page_size=50):
  """Скачивает все отклики на вакансию постранично."""
  headers = {"Authorization": f"Bearer {token}"}
  applications = []
  page = 0
  
  while True:
      resp = requests.get(
          f"{HH_API}/negotiations",
          headers=headers,
          params={
              "vacancy_id": vacancy_id,
              "page": page,
              "per_page": page_size,
              "status": "consideration"  # только новые отклики
          }
      )
      data = resp.json()
      items = data.get("items", [])
      if not items:
          break
      applications.extend(items)
      page += 1
      time.sleep(0.5)  # rate limit HH.ru
  
  return applications

def get_resume_text(resume_id, token):
  """Получает текст резюме по ID."""
  headers = {"Authorization": f"Bearer {token}"}
  resp = requests.get(
      f"{HH_API}/resumes/{resume_id}",
      headers=headers
  )
  resume = resp.json()
  
  # Собираем текст из структурированных полей
  parts = []
  if resume.get("title"):
      parts.append(f"Желаемая должность: {resume['title']}")
  
  for exp in resume.get("experience", []):
      parts.append(
          f"\nКомпания: {exp.get('company', '')}\n"
          f"Должность: {exp.get('position', '')}\n"
          f"Период: {exp.get('start', '')} — {exp.get('end', 'н.в.')}\n"
          f"Описание: {exp.get('description', '')}"
      )
  
  skills = [s["name"] for s in resume.get("skill_set", [])]
  if skills:
      parts.append(f"\nНавыки: {', '.join(skills)}")
  
  return "\n".join(parts)

Отправка результатов в Telegram

Pythonnotifier.py
import asyncio
from telegram import Bot

async def send_top_candidates(bot_token, chat_id, candidates):
  bot = Bot(token=bot_token)
  
  header = (
      f"📋 *Скрининг завершён*\n"
      f"Обработано: {candidates['total']} резюме\n"
      f"Рекомендованы к интервью: {candidates['recommend_count']}\n"
      f"─────────────────"
  )
  await bot.send_message(chat_id, header, parse_mode="Markdown")
  
  for i, c in enumerate(candidates["top5"], 1):
      flags_text = ""
      if c["red_flags"]:
          flags_text = "\n⚠️ " + " | ".join(c["red_flags"])
      
      card = (
          f"*#{i} — Оценка {c['score']}/10*\n"
          f"👤 {c['name']}\n"
          f"✅ {' | '.join(c['plus'][:3])}\n"
          f"{flags_text}\n"
          f"📝 {c['summary']}"
      )
      await bot.send_message(chat_id, card, parse_mode="Markdown")
      await asyncio.sleep(0.3)

# Запуск
asyncio.run(send_top_candidates(BOT_TOKEN, CHAT_ID, results))

Что получает HR в Telegram: пример вывода

Вот как выглядят реальные карточки кандидатов на вакансию «Маркетолог» (данные смоделированы по реальной структуре резюме с HH.ru):

9
Мария К., 28 лет
Текущее место: Ozon, Senior Performance Manager · Опыт 5 лет
Управляла бюджетом 4,2 млн/мес, снизила CPL с 1800 до 940 р за 6 месяцев. Работала с myTarget, ВК, Директ одновременно. Есть публичный кейс на vc.ru. Совпадение с требованиями: 8/9 пунктов.
+кейсы с цифрами+схожий бюджет+e-commerce опыт
8
Алексей Р., 32 года
Текущее место: Яндекс.Маркет, Performance Lead · Опыт 7 лет
Сильный технический бэкграунд, работал с BI-системами и сквозной аналитикой. Вырастил ROAS с 3,1 до 5,8 за год. Минус: опыт только в крупных компаниях, может не подойти ритм стартапа.
+аналитика+ROAS кейс!крупные компании
7
Екатерина Н., 25 лет
Текущее место: Агентство диджитал, Middle Marketer · Опыт 3 года
Хорошая база по таргету, ведёт несколько клиентов одновременно. Кейсов с цифрами мало — один расписан детально, остальные только в формате «вёл кампании». Потенциал есть, нужно уточнить на звонке.
+мультизадачность!мало цифр

На каждую карточку HR тратит 20-30 секунд — прочитать и решить звонить или нет. Вместо 4 часов просмотра сырых резюме.

Что агент не увидит никогда

Честно скажу — список существенный.

Мотивация. Почему человек вообще откликнулся на эту вакансию. Хочет работать именно у вас или рассылает на 50 компаний сразу. Агент не знает.

Манера общения. Как человек разговаривает, слышит ли вопрос, умеет ли объяснять. Текст резюме написан или отредактирован GPT — это нормально и не говорит ни о чём плохом. А вот живой разговор скрыть нельзя.

Культурное соответствие. Насколько человек впишется в команду, как он реагирует на неопределённость, умеет ли работать без микроменеджмента. Это выясняется только на интервью.

Достоверность цифр. Агент принимает всё написанное за чистую монету. Если кандидат написал «снизил CPL в 3 раза» — оценка вырастет, даже если это художественное преувеличение. Проверять нужно живым разговором.

Правильное применение этого инструмента: отбросить явно нерелевантных кандидатов и получить ранжированный список тех кто достоин внимания. Финальное решение о каждом человеке принимает человек.

Стоит ли автоматизировать найм в вашей компании

Диагностика: готов ли найм к автоматизации

5 вопросов — поймёшь где стоит начать

Вопрос 1 из 5
Сколько откликов вы получаете на типичную вакансию за первую неделю?
Вопрос 2 из 5
Как часто вы нанимаете новых людей?
Вопрос 3 из 5
Есть ли у вас чёткие критерии отбора — с конкретными требованиями и red flags?
Вопрос 4 из 5
Кто обычно делает первичный скрининг резюме?
Вопрос 5 из 5
Есть ли в компании кто-то с базовыми знаниями Python или готовность настроить это один раз?

Что сделать за следующие два часа

Если вы дочитали и хотите попробовать — вот минимальный план без лишних шагов.

Первое: создайте аккаунт разработчика на hh.ru/employer и получите токен API. Займёт 15 минут.

Второе: возьмите одну закрытую вакансию из прошлого, где у вас есть отклики. Прогоните 20-30 резюме через агент. Сравните его топ-5 с теми кого вы реально звали на интервью.

Третье: если совпадение выше 60% — агент работает на вашей специфике. Если ниже — нужно докрутить критерии. Не код, именно критерии.

Стоимость этого эксперимента: ~10 рублей на токены Claude API и два часа вашего времени.


Автоматизация скрининга не делает найм холодным или безличным. Она убирает самую скучную часть — механическое чтение однотипных резюме. А время которое освободилось — тратить на живые разговоры с теми кого реально стоит позвать.

Источники

Источники

Часто задаваемые вопросы

Сколько резюме ИИ-агент обрабатывает за один запуск?
В реальном тесте на вакансию маркетолога агент обработал 100 резюме за 12-15 минут. Скорость зависит от длины резюме и лимитов HH.ru API. При параллельных запросах к Claude API можно ускорить до 5-7 минут, но HH.ru ограничивает частоту запросов — оптимально 2-3 резюме в секунду.
Нужны ли платные API для такого агента?
Да: нужен ключ Claude API (claude-sonnet-4-6) и авторизация в HH.ru API. HH.ru API бесплатный для работодателей у которых есть аккаунт. Claude API — платный, стоимость обработки 100 резюме составит около 50-80 рублей (при средней длине резюме 800 токенов).
Что агент НЕ может оценить в резюме?
Мотивацию кандидата, культурное соответствие компании, реальный уровень soft skills, достоверность указанных достижений. Агент работает только с текстом — если кандидат хорошо пишет резюме, он получит высокую оценку. Живое интервью незаменимо для всего что нельзя проверить по тексту.
Как сформулировать критерии скрининга для Claude?
Критерии должны быть конкретными и измеримыми: не 'опыт в маркетинге', а 'опыт таргетированной рекламы 2+ года, есть кейсы со снижением CPL'. Red flags формулировать явно: 'частая смена работы — чаще чем раз в 8 месяцев', 'нет конкретных результатов, только обязанности'. Чем точнее критерии, тем выше качество отбора.
Можно ли использовать агент не только для вакансий на HH.ru?
Да. Та же архитектура работает с любым источником резюме: загрузка PDF через HH.ru API, отклики с других платформ, письма на почту. Нужно только подготовить резюме в текстовом формате — дальше Claude оценивает по тем же критериям.
Насколько точен ИИ-агент по сравнению с HR-специалистом?
По формальным критериям (опыт, навыки, образование) агент отрабатывает точнее, чем человек после 3-го часа просмотра резюме — усталость влияет. В одном тесте HR сравнил топ-10 от агента со своим списком: 7 кандидатов совпали, 2 агент пропустил (у них был нестандартный опыт), 1 агент добавил которого HR не заметил. Финальное решение — всегда за человеком.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.