Разбор
ИИ-агент скринирует 100 резюме за 15 минут: кейс с HH.ru и Claude API
На популярную вакансию приходит 150 откликов — и 4-6 часов ручного просмотра. Показываю как Python-агент на Claude API обрабатывает весь стек за 15 минут, выставляет оценки 1-10 с обоснованием и присылает топ-кандидатов прямо в Telegram HR-у.
Пятница, 11 утра. HR-менеджер открывает HH.ru - на вакансию маркетолога пришло 143 отклика за три дня. До обеда нужно отобрать 8-10 человек на первичный звонок. Она закрывает крышку ноутбука и идёт пить кофе. Во второй раз.
Это не фантастика и не демо на идеальных данных. Это реальная схема, которую можно запустить за один вечер, имея базовые знания Python.
Боль, которую все знают, но мало кто измерял
Популярная вакансия на HH.ru в Москве - это 100-200 откликов в первую неделю. Менеджер по маркетингу, разработчик, продажник - любая массовая позиция. Даже узкая техническая вакансия часто собирает 50-70 резюме.
Стандартный процесс выглядит так: открываешь резюме, читаешь 30-60 секунд, отмечаешь «интересно» или закрываешь. После 40-го резюме начинаешь читать по диагонали. После 70-го - уже просто смотришь на компании и даты. После 100-го - ставишь галочки по принципу «ну пусть позвоним, вроде ничего».
Агент не устаёт. Резюме номер 1 и резюме номер 143 он оценивает с одинаковым вниманием по одним и тем же критериям.
Как устроена схема
Четыре компонента, соединённые последовательно.
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 | ! Только обязанности, ноль цифр |
| Продажник B2B | + Конкретный % выполнения плана | ! Только входящий поток |
| Head of SMM | + Растил аккаунты с нуля (цифры) | ! Только постинг без стратегии |
| Разработчик Python | + Пет-проекты с кодом на GitHub | ! Только курсы, нет реального опыта |
Промпт для Клода: как формулировать задачу оценки
Вот структура промпта которая даёт стабильный JSON-ответ:
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
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
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):
На каждую карточку HR тратит 20-30 секунд - прочитать и решить звонить или нет. Вместо 4 часов просмотра сырых резюме.
Что агент не увидит никогда
Честно скажу - список существенный.
Мотивация. Почему человек вообще откликнулся на эту вакансию. Хочет работать именно здесь или рассылает на 50 компаний сразу. Агент не знает.
Манера общения. Как человек разговаривает, слышит ли вопрос, умеет ли объяснять. Текст резюме написан или отредактирован GPT - это нормально и не говорит ни о чём плохом. А вот живой разговор скрыть нельзя.
Культурное соответствие. Насколько человек впишется в команду, как он реагирует на неопределённость, умеет ли работать без микроменеджмента. Это выясняется только на интервью.
Достоверность цифр. Агент принимает всё написанное за чистую монету. Если кандидат написал «снизил CPL в 3 раза» - оценка вырастет, даже если это художественное преувеличение. Проверять нужно живым разговором.
Правильное применение этого инструмента: отбросить явно нерелевантных кандидатов и получить ранжированный список тех кто достоин внимания. Финальное решение о каждом человеке принимает человек.
Где это вписывается в общую автоматизацию рекрутинга
Автоматизация рекрутинга - широкий термин. На практике она разбивается на несколько независимых задач: публикация вакансий, отбор кандидатов, коммуникация, сбор обратной связи. ИИ-агент скрининга закрывает только первую из них - первичный отбор. И закрывает хорошо.
В сравнении с платными ATS-системами (Huntflow, Talantix, Potok) этот подход выигрывает по одному параметру: стоимость. Полноценная ATS обходится от 3 000 рублей в месяц. Агент на Claude API при найме 2-3 человек в месяц тратит 200-400 рублей на токены.
Компании с постоянным потоком в 10+ вакансий в месяц выиграют от полноценной ATS - там нужны трекинг, аналитика, интеграции с почтой. Если найм точечный - Python плюс Claude API дают 80% результата за 5% цены.
Стоит ли автоматизировать найм в своей компании
Диагностика: готов ли найм к автоматизации
5 вопросов — поймёшь где стоит начать
Что сделать за следующие два часа
Если дочитал и хочешь попробовать - вот минимальный план без лишних шагов.
Первое: создайте аккаунт разработчика на hh.ru/employer и получите токен API. Займёт 15 минут.
Второе: возьми одну закрытую вакансию из прошлого, где есть отклики. Прогони 20-30 резюме через агент. Сравни его топ-5 с теми кого реально звал на интервью.
Третье: если совпадение выше 60% - агент работает на твоей специфике. Если ниже - нужно докрутить критерии. Не код, именно критерии.
Стоимость этого эксперимента: ~10 рублей на токены Claude API и два часа своего времени.
Автоматизация скрининга не делает найм холодным или безличным. Она убирает самую скучную часть - механическое чтение однотипных резюме. А время которое освободилось - тратить на живые разговоры с теми кого реально стоит позвать.
Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Похожие кейсы
- Обработка заявок с сайта: webhook + Claude
- Email-цепочка с персонализацией через Claude API
- ТЗ на лендинг за 15 минут
Источники
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
Читайте также
Часто задаваемые вопросы
- Сколько резюме ИИ-агент обрабатывает за один запуск?
- В реальном тесте на вакансию маркетолога агент обработал 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 оценивает по тем же критериям.
- Чем автоматизация рекрутинга на ИИ отличается от платных ATS-систем?
- Платные ATS (Huntflow, Talantix) стоят от 3 000 до 30 000 рублей в месяц и заточены под процессы найма целиком. Python-агент на Claude API решает одну конкретную задачу - первичный скрининг - и обходится в 50-150 рублей за 100 резюме. Для компаний без выделенного HR-отдела или при точечном найме это в 20-50 раз дешевле. ATS имеет смысл когда в месяц закрывается 10+ вакансий.
- Насколько точен ИИ-агент по сравнению с HR-специалистом?
- По формальным критериям (опыт, навыки, образование) агент отрабатывает точнее, чем человек после 3-го часа просмотра резюме — усталость влияет. В одном тесте HR сравнил топ-10 от агента со своим списком: 7 кандидатов совпали, 2 агент пропустил (у них был нестандартный опыт), 1 агент добавил которого HR не заметил. Финальное решение — всегда за человеком.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.