10 min read ai-guides

Системный промпт-инжиниринг для адаптации резюме под разные вакансии

Как написать идеальный системный промпт для LLM, чтобы адаптировать резюме под требования ATS без выдумывания опыта и галлюцинаций.

Системный промпт-инжиниринг для адаптации резюме под разные вакансии
D

Dim

AI tools writer for job seekers

Каждая отправка резюме на вакансию в крупную компанию начинается со встречи с алгоритмами ATS (Applicant Tracking System). Эти системы ранжируют резюме на основе их релевантности описанию вакансии (Job Description, JD). Если ваше резюме написано на одном языке терминов, а вакансия — на другом (например, у вас написано «развертывание CI/CD пайплайнов», а в вакансии требуется «orchestration of automated deployment workflows»), ATS может отсеять вас на самом первом шаге, просто не найдя точного совпадения ключевых слов.

Решением этой проблемы является персонализация резюме под каждую конкретную вакансию. Делать это вручную долго и неэффективно. Использовать обычный ChatGPT с простым запросом типа «перепиши мое резюме под эту вакансию» — опасно, так как языковая модель склонна галлюцинировать, выдумывать несуществующие проекты, опыт работы или приписывать вам владение технологиями, о которых вы слышали лишь мельком.

В этой статье мы построим профессиональный конвейер адаптации резюме с использованием продвинутых техник системного промпт-инжиниринга (System Prompt Engineering), методик Few-Shot Prompting и Chain-of-Thought (CoT), которые гарантируют высочайшую точность ATS-совпадения без искажения ваших реальных навыков.


1. Проблема наивных промптов и галлюцинаций

Когда вы просите модель выполнить адаптацию простым языком, вы получаете «размытый» текст. LLM пытается угодить вакансии и часто совершает следующие ошибки:

  • Галлюцинации стека: Если в вакансии требуется Scala, а в вашем резюме только Java, наивный промпт заставит модель написать, что вы 5 лет руководили проектами на Scala.
  • Потеря структуры: Модель может полностью перестроить ваше резюме, удалив важные хронологические блоки или размыв названия должностей.
  • Изменение стиля: Текст становится слишком хвалебным, изобилующим пустыми клише вроде «highly motivated proactive team-player with outstanding synergy skills», которые моментально раздражают опытных рекрутеров.

Чтобы этого не происходило, мы должны жестко ограничить степени свободы модели с помощью системных инструкций (System Instructions) и правил валидации.


2. Архитектура идеального системного промпта для адаптации резюме

Идеальный промпт строится по принципу ролевой игры с четким набором ограничений (Guardrails), входных переменных и шагов рассуждения (Chain of Thought).

Ниже представлена готовая промышленная конфигурация системного промпта, которую мы используем во внутренних сервисах.

Системный промпт (System Prompt):

Вы — ведущий эксперт по подбору персонала, карьерный консультант и специалист по оптимизации резюме под ATS (Applicant Tracking Systems). 
Ваша задача — адаптировать исходное резюме кандидата (Base CV) под конкретное описание вакансии (Job Description) с сохранением абсолютной честности и структуры.

### КЛЮЧЕВЫЕ ПРАВИЛА И ОГРАНИЧЕНИЯ (GUARDRAILS):
1. НИКАКИХ ГАЛЛЮЦИНАЦИЙ: Вам строго запрещено придумывать новый опыт работы, проекты, метрики, компании или роли, которых нет в Base CV.
2. ПРАВИЛО СООТВЕТСТВИЯ СТЕКА: Если в вакансии требуется технология, которой нет в Base CV, вы можете:
   - Если у кандидата есть сильный смежный опыт (например, требуется PostgreSQL, а у кандидата указан MySQL), упомянуть смежный опыт в контексте обучаемости, НО не писать, что кандидат эксперт в PostgreSQL.
   - Если смежного опыта нет — проигнорировать этот пункт. Не добавляйте технологии "из воздуха".
3. СОХРАНЕНИЕ СТРУКТУРЫ: Вы обязаны сохранить хронологию, названия компаний, должностей и даты работы неизменными.
4. СТИЛЬ: Текст должен быть написан в строгом профессиональном, техническом стиле. Избегайте "воды", прилагательных превосходной степени ("выдающийся", "уникальный") и общих фраз. Используйте сильные глаголы действия (Action Verbs) и формат STAR (Situation, Task, Action, Result).
5. ЯЗЫК: Выводите результат на том же языке, на котором написана вакансия (если вакансия на английском, адаптированное резюме должно быть на английском).

### АЛГОРИТМ РАБОТЫ (Chain-of-Thought):
Шаг 1. Проанализируйте Job Description и выделите 10 ключевых навыков, технологий и требований (ATS Keywords).
Шаг 2. Проанализируйте Base CV и найдите пересечения с требованиями из Шага 1.
Шаг 3. Идентифицируйте "семантические пробелы" (например, в резюме написано "разработка БД", а в вакансии "schema design and query optimization"). Переведите формулировки из резюме на язык вакансии, используя синонимы, если они соответствуют реальности.
Шаг 4. Перепишите буллиты (достижения) в каждой компании из Base CV, делая упор на те аспекты работы кандидата, которые наиболее релевантны вакансии.
Шаг 5. Сформируйте итоговое резюме в формате Markdown.

3. Методология Few-Shot Prompting для форматирования STAR

Чтобы научить модель переписывать достижения кандидата в эффективном формате STAR (Ситуация, Задача, Действие, Результат), необходимо передать ей примеры “до” и “после” (Few-Shot).

Добавьте этот блок в тело вашего запроса:

### ПРИМЕРЫ АДАПТАЦИИ (FEW-SHOT):

Пример 1 (Инженер баз данных):
- ИСХОДНЫЙ БУЛЛИТ: "Занимался оптимизацией запросов к PostgreSQL на проекте."
- ТРЕБОВАНИЕ ВАКАНСИИ: "High-load query optimization, database performance tuning, scale issues resolution."
- АДАПТИРОВАННЫЙ БУЛЛИТ: "Оптимизировал сложные SQL-запросы в PostgreSQL для высоконагруженной системы (10k+ RPS), сократив время отклика базы данных (latency) на 45% и разгрузив CPU сервера на 30%."

Пример 2 (Frontend-разработчик):
- ИСХОДНЫЙ БУЛЛИТ: "Писал компоненты на React и настраивал сборку."
- ТРЕБОВАНИЕ ВАКАНСИИ: "Webpack/Vite optimization, core web vitals enhancement, reusable component libraries."
- АДАПТИРОВАННЫЙ БУЛЛИТ: "Разработал библиотеку переиспользуемых React-компонентов (UI Kit), сократившую время разработки фич на 25%; перевел сборку проекта с Webpack на Vite, улучшив показатели Core Web Vitals (LCP улучшился на 1.2с)."

4. Скрипт на Python для автоматической адаптации через OpenAI API

Давайте автоматизируем этот процесс с помощью скрипта, который принимает на вход файл резюме (в формате TXT или Markdown) и текст вакансии, отправляет их в модель gpt-4o или claude-3-5-sonnet и сохраняет результат.

import os
import openai

def tailor_resume(base_cv_path, job_desc_path, output_path):
    # Чтение входных данных
    with open(base_cv_path, 'r', encoding='utf-8') as f:
        base_cv = f.read()
        
    with open(job_desc_path, 'r', encoding='utf-8') as f:
        job_desc = f.read()

    # Загрузка системного промпта
    system_prompt = """
    Вы — ведущий эксперт по оптимизации резюме под ATS. 
    Ваша задача — адаптировать Base CV под Job Description. 
    Строго соблюдайте правила: не выдумывайте опыт, сохраняйте хронологию, используйте технический стиль STAR.
    """

    user_content = f"""
    ### BASE CV:
    {base_cv}

    ### JOB DESCRIPTION:
    {job_desc}

    Пожалуйста, проведи адаптацию и выведи результат в формате Markdown.
    """

    print("[*] Отправка запроса в LLM...")
    
    # Инициализация клиента OpenAI (или другого провайдера)
    client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
    
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_content}
        ],
        temperature=0.2, # Низкая температура для уменьшения галлюцинаций
        max_tokens=3000
    )

    tailored_cv = response.choices[0].message.content

    # Сохранение результата
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(tailored_cv)
        
    print(f"[+] Адаптированное резюме сохранено в: {output_path}")

# Пример запуска
if __name__ == "__main__":
    tailor_resume("my_cv.txt", "job_description.txt", "tailored_cv.md")

5. Как верифицировать результат адаптации

После того как модель сгенерировала адаптированную версию резюме, крайне важно провести автоматическую проверку (Self-Verification). В нашей системе мы запускаем второй, независимый промпт-валидатор (LLM Judge), который сличает исходный и новый варианты по следующим критериям:

  1. Дифференциальный анализ опыта: Были ли добавлены новые компании, роли или проекты? (Если да — откат изменений).
  2. Семантическая близость: Насколько точнее стали попадания в ключевые слова вакансии по сравнению со старой версией?
  3. Обнаружение галлюцинированных технологий: Проверка списка “Hard Skills” на предмет появления библиотек и языков, отсутствующих в исходном резюме.

Применение этой двухэтапной схемы (Генератор + Судья) позволяет достичь 100% точности адаптации и гарантирует, что на собеседовании вы не попадете в неловкую ситуацию, когда вас спросят о навыках, добавленных искусственным интеллектом «для красоты».

Выводы

Промпт-инжиниринг превращает языковую модель из забавного собеседника в строгий детерминированный инструмент оптимизации данных. Правильно настроенные ограничения, следование формату STAR и низкая температура генерации позволяют автоматизировать самый рутинный этап поиска работы, кратно повышая ваши шансы на прохождение первого фильтра ATS.

Read more AI for job search guides on the MindFire blog.