Скрининг резюме HH через n8n: AI-оценка без автоотказов ¶
Обновлено: 2026-05-30
Импортируйте workflow, замените credentials и прогоните тестовый payload до включения production.
- Проблема: почему AI-скрининг резюме HH нельзя делать как автоотказ
- Архитектура workflow для скрининга резюме
- Контракт входных данных: резюме, вакансия и критерии
- Code Node: нормализация критериев и prompt-контракт
- Готовый workflow JSON: скачать и импортировать
- Пошаговая настройка HH, n8n и ATS
- Тесты перед production и проверка качества
- Production-риски HR automation и AI scoring
- Полезные ссылки и смежные workflow
- Критерии готовности
Проблема: AI-скрининг резюме может ускорить рекрутера, но при неправильной настройке превращается в непрозрачный автоотказ по неполным или чувствительным данным.
Решение: workflow в n8n должен извлекать только job-related факты, сравнивать их с критериями вакансии, сохранять evidence и отправлять итог рекрутеру на review.
Проблема: почему AI-скрининг резюме HH нельзя делать как автоотказ ¶
Скрининг резюме HH через n8n часто начинается с простой идеи: получить отклик, отправить текст резюме в AI, поставить балл и автоматически решить, подходит кандидат или нет. Для HR это опасный сценарий. Резюме может быть неполным, модель может ошибиться в опыте, а чувствительные признаки вообще не должны попадать в scoring.
Правильный workflow не заменяет рекрутера. Он готовит структурированную карточку: совпадения с требованиями вакансии, недостающие факты, red flags, вопросы для интервью и объяснение оценки. Финальное решение остается у человека, а n8n отвечает за автоматизацию рутины, аудит и запись результата в ATS или CRM.
Архитектура workflow для скрининга резюме ¶
| Нода | Роль | Что проверить |
|---|---|---|
| Webhook input | Принимает resume_id, vacancy_id и критерии | нет лишних персональных данных в payload |
| Prepare criteria | Разделяет must-have и nice-to-have | запрещенные признаки не участвуют в scoring |
| Fetch resume facts | Получает факты резюме HH или ATS | ссылка на исходник сохраняется для аудита |
| AI scoring | Сравнивает факты с критериями | каждый балл имеет evidence |
| Recruiter review gate | Отправляет карточку человеку | нет автоматического отказа |
| Update ATS | Записывает summary, score и вопросы | статусы не ломают воронку найма |
Контракт входных данных: резюме, вакансия и критерии ¶
{
"resume_id": "hh-resume-812345",
"vacancy_id": "backend-nodejs-remote",
"candidate": {
"name": "Мария",
"source": "hh.ru",
"resume_url": "https://hh.ru/resume/xxxx"
},
"vacancy_criteria": {
"must_have": [
"Node.js от 3 лет",
"PostgreSQL",
"REST API",
"опыт production support"
],
"nice_to_have": [
"n8n",
"Redis",
"Docker"
],
"exclude_from_scoring": [
"возраст",
"пол",
"семейное положение",
"фото"
]
},
"ats": {
"candidate_id": "ats-1042",
"pipeline": "backend-hiring"
}
}
В payload важно передавать не “всё резюме целиком”, а ссылку или идентификатор источника, критерии вакансии и список признаков, которые запрещено использовать. Так скрипт n8n остается контролируемым, а HR-команда понимает, почему кандидат получил конкретный score.
Code Node: нормализация критериев и prompt-контракт ¶
const input = $json.body ?? $json;
const criteria = input.vacancy_criteria ?? {};
const mustHave = Array.isArray(criteria.must_have) ? criteria.must_have : [];
const niceToHave = Array.isArray(criteria.nice_to_have) ? criteria.nice_to_have : [];
const excluded = new Set((criteria.exclude_from_scoring ?? []).map(v => String(v).toLowerCase()));
if (!input.resume_id || !input.vacancy_id) {
throw new Error('resume_id and vacancy_id are required');
}
const promptContract = {
role: 'HR screening assistant',
task: 'Compare only job-related facts from resume with vacancy criteria',
forbidden_signals: [...excluded],
output_schema: {
score: '0-100',
must_have_match: 'array with evidence',
gaps: 'array with missing evidence',
interview_questions: 'array',
decision: 'shortlist | recruiter_review',
confidence: 'low | medium | high'
},
rule: 'Do not reject candidate automatically; send uncertain or negative cases to recruiter_review'
};
return [{
json: {
resume_id: input.resume_id,
vacancy_id: input.vacancy_id,
ats_candidate_id: input.ats?.candidate_id,
must_have: mustHave,
nice_to_have: niceToHave,
prompt_contract: promptContract,
review_required: true,
audit_key: `hh:${input.vacancy_id}:${input.resume_id}`
}
}];
Почему evidence важнее общего score
Число 82/100 само по себе не объясняет решение. Evidence показывает, какая строка резюме подтверждает навык, а где модель сделала предположение. Это помогает рекрутеру быстро проверить карточку и не превращает AI screening в черный ящик.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - HH resume screening with human review",
"nodes": [
{
"name": "Webhook input",
"type": "n8n-nodes-base.webhook",
"purpose": "Принять resume_id, vacancy_id и критерии вакансии"
},
{
"name": "Prepare criteria and prompt",
"type": "n8n-nodes-base.code",
"purpose": "Нормализовать must-have/nice-to-have и запретить чувствительные признаки"
},
{
"name": "Fetch resume facts",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Получить факты из HH/ATS или внутреннего парсера"
},
{
"name": "AI scoring",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Сравнить факты с критериями и вернуть evidence"
},
{
"name": "Recruiter review gate",
"type": "n8n-nodes-base.if",
"purpose": "Не делать автоотказ; отправить карточку рекрутеру"
},
{
"name": "Update ATS",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Записать score, summary и вопросы в ATS"
}
],
"connections": "Webhook → Criteria → Resume facts → AI scoring → Review gate → ATS"
}
Пошаговая настройка HH, n8n и ATS ¶
- Опишите критерии вакансии до подключения AI: must-have, nice-to-have и недопустимые сигналы.
- Подключите источник резюме: HH API, ATS export, email с откликами или внутреннюю базу кандидатов.
- Добавьте Code Node для нормализации критериев и prompt-контракта.
- Настройте AI scoring так, чтобы он возвращал evidence, gaps и вопросы для интервью.
- Записывайте результат в ATS только после проверки человеком или с явным статусом `recruiter_review`.
Тесты перед production и проверка качества ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/hh-resume-screening" \
-H "Content-Type: application/json" \
--data @hh-resume-screening-payload.json
Проверьте сильное резюме, слабое резюме, неполное резюме, кандидата с нестандартным опытом и кейс без обязательного навыка. Негативные и спорные кейсы должны попадать на human review, а не создавать автоотказ.
Production-риски HR automation и AI scoring ¶
- Автоматический отказ. AI может помогать, но не должен самостоятельно закрывать кандидата без прозрачного правила.
- Скоринг по чувствительным признакам. Возраст, пол, фото и семейное положение не должны попадать в критерии.
- Нет evidence. Рекрутер не сможет проверить, откуда взялась оценка.
- Разные вакансии используют один prompt. Критерии должны быть привязаны к vacancy_id.
- История решений не хранится. Без audit_key сложно объяснить, почему карточка изменилась.
Полезные ссылки и смежные workflow ¶
См. также GigaChat support draft, права AI-агентов и уведомления об ошибках. Официальные документы: HeadHunter API и n8n HTTP Request.
Критерии готовности ¶
- Каждый score содержит evidence и gaps.
- Негативные решения уходят на human review.
- Запрещенные признаки исключены из prompt и scoring.
- Результат записывается в ATS с audit_key и ссылкой на исходное резюме.
- Ошибки API/AI не меняют статус кандидата молча.
Nodbot настроит HR workflow с критериями вакансии, evidence, human review, ATS-записью, audit trail и мониторингом ошибок.
Обсудить HR workflow