Разбор
ИИ-агент скринирует 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 раза» — оценка вырастет, даже если это художественное преувеличение. Проверять нужно живым разговором.
Правильное применение этого инструмента: отбросить явно нерелевантных кандидатов и получить ранжированный список тех кто достоин внимания. Финальное решение о каждом человеке принимает человек.
Стоит ли автоматизировать найм в вашей компании
Диагностика: готов ли найм к автоматизации
5 вопросов — поймёшь где стоит начать
Что сделать за следующие два часа
Если вы дочитали и хотите попробовать — вот минимальный план без лишних шагов.
Первое: создайте аккаунт разработчика на hh.ru/employer и получите токен API. Займёт 15 минут.
Второе: возьмите одну закрытую вакансию из прошлого, где у вас есть отклики. Прогоните 20-30 резюме через агент. Сравните его топ-5 с теми кого вы реально звали на интервью.
Третье: если совпадение выше 60% — агент работает на вашей специфике. Если ниже — нужно докрутить критерии. Не код, именно критерии.
Стоимость этого эксперимента: ~10 рублей на токены Claude API и два часа вашего времени.
Автоматизация скрининга не делает найм холодным или безличным. Она убирает самую скучную часть — механическое чтение однотипных резюме. А время которое освободилось — тратить на живые разговоры с теми кого реально стоит позвать.
Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
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 оценивает по тем же критериям.
- Насколько точен ИИ-агент по сравнению с HR-специалистом?
- По формальным критериям (опыт, навыки, образование) агент отрабатывает точнее, чем человек после 3-го часа просмотра резюме — усталость влияет. В одном тесте HR сравнил топ-10 от агента со своим списком: 7 кандидатов совпали, 2 агент пропустил (у них был нестандартный опыт), 1 агент добавил которого HR не заметил. Финальное решение — всегда за человеком.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.