Рекрутер тратит в среднем 6–8 секунд на первичный просмотр резюме. При потоке в 200–500 откликов на вакансию это превращается в часы монотонной работы, где неизбежны ошибки и пропущенные кандидаты. LLM-скоринг решает эту задачу: модель читает резюме, сопоставляет с требованиями вакансии и выдаёт структурированную оценку — с баллами, обоснованием и готовым shortlist.

Главная ценность AI-скоринга — не скорость, а единообразие. Модель применяет одинаковые критерии к каждому резюме, исключая «усталость третьего часа» и неосознанные предубеждения.

Задача

Промпт выполняет три операции за один вызов:

  1. Извлечение данных — парсит неструктурированное резюме в JSON с фиксированной схемой
  2. Скоринг — оценивает кандидата по каждому требованию вакансии от 0 до 10
  3. Вердикт — выдаёт итоговую рекомендацию: пригласить / maybe / отклонить

Результат — машиночитаемый JSON, который можно загрузить в ATS, Google Sheets или дашборд.

Для кого

  • HR и рекрутеры — автоматизация первичного отсева при массовом найме
  • Тимлиды — быстрая оценка технических кандидатов по хардскиллам
  • HR-tech разработчики — прототипирование скоринговых пайплайнов
  • Фрилансеры и агентства — обработка большого объёма откликов без расширения команды
ℹ Совместимость
Промпт работает с Claude Opus 4.6, Claude Sonnet 4.6, GPT-4.1 и другими моделями, поддерживающими structured output. Для пакетной обработки (50+ резюме) рекомендуется использовать API с параметром response_format для гарантированного JSON.

Промпт

<role>
Ты — опытный IT-рекрутер с 10-летним стажем, специализируешься 
на техническом найме. Ты умеешь выделять главное в резюме, 
оценивать реальный уровень кандидата (не только по ключевым словам) 
и обосновывать каждую оценку конкретными фактами из резюме.
</role>

<task>
Проанализируй резюме кандидата и сопоставь его с требованиями 
вакансии. Выполни три шага:

1. ИЗВЛЕЧЕНИЕ: Разбери резюме на структурированные поля
2. СКОРИНГ: Оцени соответствие каждому требованию (0-10)
3. ВЕРДИКТ: Дай итоговую рекомендацию с обоснованием

Верни результат СТРОГО в JSON-формате по схеме ниже.
</task>

<scoring_rules>
- 0-3: Требование не выполнено или опыт нерелевантный
- 4-5: Частичное соответствие, есть смежный опыт
- 6-7: Соответствует, но без глубокой экспертизы
- 8-9: Сильное соответствие с подтверждённым опытом
- 10: Превышает требования, есть выдающиеся достижения
</scoring_rules>

<output_schema>
{
  "candidate": {
    "name": "string",
    "email": "string | null",
    "phone": "string | null",
    "location": "string | null",
    "current_role": "string | null",
    "years_of_experience": "number",
    "education": [
      {
        "degree": "string",
        "institution": "string",
        "year": "number | null"
      }
    ],
    "skills": ["string"],
    "languages": ["string"],
    "certifications": ["string"]
  },
  "scoring": {
    "requirements": [
      {
        "requirement": "string — текст требования из вакансии",
        "score": "number 0-10",
        "evidence": "string — конкретный факт из резюме",
        "gap": "string | null — чего не хватает"
      }
    ],
    "total_score": "number — среднее арифметическое",
    "max_possible": 10
  },
  "verdict": {
    "decision": "invite | maybe | reject",
    "confidence": "high | medium | low",
    "summary": "string — 2-3 предложения с обоснованием",
    "red_flags": ["string — потенциальные риски"],
    "green_flags": ["string — сильные стороны"]
  }
}
</output_schema>

<vacancy>
{ВСТАВЬТЕ_ОПИСАНИЕ_ВАКАНСИИ}
</vacancy>

<resume>
{ВСТАВЬТЕ_РЕЗЮМЕ_КАНДИДАТА}
</resume>
💡 Совет
Копируйте текст резюме как есть — даже с опечатками и неидеальным форматированием. LLM отлично справляется с «грязным» текстом из PDF. Главное — не забудьте заполнить секцию <vacancy> с требованиями, иначе скоринг будет абстрактным.

Как работает промпт


graph TD
    A[Резюме кандидата
неструктурированный текст] --> B[LLM принимает роль
IT-рекрутера] V[Описание вакансии
с требованиями] --> B B --> C[Шаг 1: Извлечение] C --> D[Структурированный профиль:
навыки, опыт, образование] D --> E[Шаг 2: Скоринг] E --> F[Оценка 0-10
по каждому требованию] F --> G[Шаг 3: Вердикт] G --> H[invite / maybe / reject
+ обоснование] H --> I[JSON-отчёт
готов для ATS]

Пример результата

Вакансия: Middle Python Developer (Django, PostgreSQL, REST API, Docker)

Резюме: Иванов Алексей, 4 года опыта, работал с Flask и FastAPI, знает PostgreSQL, деплоил в Docker, но с Django не работал.

Модель вернёт:

{
  "candidate": {
    "name": "Иванов Алексей",
    "email": null,
    "phone": null,
    "location": null,
    "current_role": "Python Developer",
    "years_of_experience": 4,
    "education": [],
    "skills": ["Python", "Flask", "FastAPI", "PostgreSQL", "Docker", "REST API", "Git"],
    "languages": ["Русский"],
    "certifications": []
  },
  "scoring": {
    "requirements": [
      {
        "requirement": "Python 3+ года опыта",
        "score": 8,
        "evidence": "4 года коммерческого опыта на Python",
        "gap": null
      },
      {
        "requirement": "Django",
        "score": 3,
        "evidence": "Опыт с Flask и FastAPI — смежные фреймворки",
        "gap": "Нет прямого опыта с Django, потребуется онбординг"
      },
      {
        "requirement": "PostgreSQL",
        "score": 7,
        "evidence": "Указан в навыках, использовал в проектах",
        "gap": "Нет деталей об уровне — оптимизация запросов, миграции"
      },
      {
        "requirement": "REST API",
        "score": 8,
        "evidence": "Работал с FastAPI и Flask — оба заточены под API",
        "gap": null
      },
      {
        "requirement": "Docker",
        "score": 7,
        "evidence": "Деплоил проекты в Docker",
        "gap": "Не указан опыт с Docker Compose / Kubernetes"
      }
    ],
    "total_score": 6.6,
    "max_possible": 10
  },
  "verdict": {
    "decision": "maybe",
    "confidence": "medium",
    "summary": "Кандидат имеет релевантный Python-опыт и владеет смежными технологиями. Главный пробел — отсутствие опыта с Django, что потребует 2-4 недели онбординга. При готовности команды инвестировать в обучение — стоит пригласить на техническое интервью.",
    "red_flags": [
      "Нет прямого опыта с Django — ключевым фреймворком вакансии"
    ],
    "green_flags": [
      "Сильный Python-бэкграунд с несколькими фреймворками",
      "Опыт с REST API и контейнеризацией"
    ]
  }
}
📝 Как читать результат
total_score: 6.6 из 10 — кандидат закрывает большинство требований, но не все. Поле decision: "maybe" сигнализирует: не автоматическое приглашение, но стоит рассмотреть. Поле evidence позволяет HR проверить, откуда модель взяла каждую оценку — это не чёрный ящик.

Вариации и настройки

ВариацияЧто изменить в промптеКогда использовать
Массовый скорингОбернуть несколько резюме в <resume id="1">...</resume>, вывод — массив JSONОбработка 10-50 откликов за один запрос
Без вакансии (общий профиль)Убрать <vacancy>, добавить: «Оцени общий уровень кандидата и предложи подходящие роли»Формирование кадрового резерва
С весами требованийДобавить weight к каждому требованию: "Django (weight: 3), Docker (weight: 1)"Когда одни навыки критичнее других
Для нетехнических вакансийЗаменить <role> на: «Ты — HR-директор с опытом найма в [маркетинге/продажах/финансах]»Вакансии вне IT
С проверкой soft skillsДобавить секцию: «Оцени коммуникативные навыки по стилю написания резюме и описанию достижений»Позиции с клиентской коммуникацией

Настройка порогов решения

Добавьте в промпт правила принятия решений:

<decision_rules>
- invite: total_score >= 7.0 И нет ни одного critical-требования с оценкой < 4
- maybe: total_score >= 5.0 ИЛИ есть хотя бы одно требование с оценкой >= 9
- reject: total_score < 5.0
</decision_rules>

Интеграция в рабочий процесс


graph LR
    A[Отклик на вакансию] --> B[Извлечение текста
из PDF/DOCX] B --> C[LLM-скоринг
этот промпт] C --> D{decision?} D -->|invite| E[Автоматическое
письмо-приглашение] D -->|maybe| F[В очередь на
ручной просмотр] D -->|reject| G[Вежливый отказ
+ фидбек]

Сравнение подходов к скорингу резюме

КритерийРучной скринингKeyword-матчинг (ATS)LLM-скоринг (этот промпт)
Скорость6-8 сек/резюмеМгновенно3-5 сек/резюме
Понимание контекстаВысокоеНулевоеВысокое
Учёт смежного опытаДаНетДа
МасштабируемостьНизкаяВысокаяВысокая
Единообразие оценкиПадает с усталостьюАбсолютноеАбсолютное
Стоимость (500 резюме)~40 часов работы HRБесплатно (встроено в ATS)~$2-5 через API

LLM-скоринг занимает нишу между дорогим ручным обзором и примитивным keyword-матчингом: он понимает контекст («FastAPI — это тоже Python-фреймворк для API»), но стоит копейки за одно резюме.

Советы по улучшению

1. Всегда заполняйте <vacancy>. Без описания вакансии модель оценивает резюме «в вакууме» — скоринг теряет смысл. Чем детальнее требования, тем точнее evidence и gap в ответе.

2. Используйте few-shot для калибровки. Добавьте 1-2 примера «идеально оценённых» резюме перед основным запросом. Это особенно важно, если ваша шкала отличается от стандартной — модель подстроится под ваш стиль оценки.

3. Добавьте <anti_bias> секцию. Для объективности включите инструкцию: «Не учитывай при оценке: пол, возраст, национальность, название вуза (оценивай только релевантность специальности), фото.» Это снижает риск переноса предубеждений из обучающих данных.

⚠ Важно: этика и законодательство
AI-скоринг резюме — инструмент поддержки решений, а не замена рекрутера. Финальное решение о приглашении всегда должен принимать человек. В ряде юрисдикций (ЕС — AI Act, Нью-Йорк — Local Law 144) автоматизированный найм требует аудита на предвзятость. Убедитесь, что ваш процесс соответствует местному законодательству.

4. Валидируйте JSON программно. При использовании через API включите response_format (OpenAI) или structured output (Claude) для гарантированного JSON. Для ручного использования в чате — попросите модель обернуть ответ в тройные обратные кавычки.

5. Итерируйте с уточнениями. После первого скоринга задайте follow-up: «Сравни трёх кандидатов с наивысшим баллом и выбери лучшего для команды из 5 человек, где уже есть сеньор Django-разработчик.»

6. Сохраняйте промпт как системное сообщение. Если используете API — вынесите всё, кроме <vacancy> и <resume>, в system prompt. Это экономит токены при пакетной обработке и обеспечивает единообразие.

💡 Бонус: пакетная обработка
Для массовой обработки через API создайте скрипт, который: (1) извлекает текст из PDF через pymupdf или pdfplumber, (2) отправляет в LLM с этим промптом, (3) собирает JSON-ответы в CSV/Excel. Полный пайплайн из 100 резюме обойдётся в $1-3 и займёт 5-10 минут.