Сейчас каждый второй джун пытается генерировать сопроводительные письма через ChatGPT.
И каждый первый рекрутер научился их детектить за секунду.
Стандартный ответ LLM выглядит так:
Это мусор. Это «AI-slop», как пишут в комментариях. Такие письма летят в корзину, потому что они пустые.
Когда я писал своего агента для поиска работы , передо мной стояла инженерная задача: сделать так, чтобы робот звучал как уставший, но профессиональный мидл-разработчик, а не как восторженный робот.
В этой статье расскажу, как я настраивал пайплайн генерации текста, боролся с галлюцинациями и повышал конверсию в ответы.
Просто скармливать текст вакансии в модель — ошибка. Модель «поплывет» и начнет лить воду.
Я разбил процесс на 3 этапа:
Extraction (Выжимка фактов): Из вакансии достаем стек и боли.
Matching (Сопоставление): Ищем пересечения с моим JSON-резюме.
Generation (Написание): Генерируем текст по жестким правилам.
Вакансии на hh зашумлены. Там куча воды про «печеньки» и «дружный коллектив». Если это подать в LLM, она начнет писать про печеньки.
Сначала я чищу HTML, оставляя только блоки Requirements и Tasks.
Python
# Псевдокод логики очистки def clean_vacancy(html_text): soup = BeautifulSoup(html_text, 'html.parser') # Убираем все лишнее, оставляем только требования text = soup.get_text() # LLM-экстрактор достает только хард-скиллы key_skills = llm.extract_skills(text) return key_skills
Самое сложное — заставить модель писать сухо и по делу.
Я использовал технику Negative Prompting (запрет определенных паттернов) и Few-Shot Learning (показал ей примеры хороших писем).
Вот упрощенная версия моего системного промпта:
Главный страх автоматизации — нейросеть припишет вам опыт, которого нет.
Вакансия: «Нужен опыт с Kubernetes».
Резюме: Docker.
Плохой бот: «Я эксперт в Kubernetes».
Мой бот: «У меня плотный опыт с Docker, с Kubernetes знаком на базовом уровне».
Как это сделано?
Я добавил шаг Fact-Checking. Перед отправкой письма второй (более дешевый) инстанс модели проверяет сгенерированный текст на соответствие исходному JSON-резюме. Если найдено несоответствие — генерация перезапускается.
Default ChatGPT:
Мой агент :
Чтобы автоматизация работала, нужно потратить 80% времени не на код отправки запросов, а на тюнинг лингвистической модели.
Рекрутеры банят не ботов. Рекрутеры банят скучных спамеров.
Если бот пишет по делу лучше, чем 90% живых кандидатов — его зовут на собеседование.
Код, конечно, я полностью не выложу (коммерческая тайна), но логи работы системы и примеры генерации под разные стеки (Java, JS, PM) показываю в своем канале.
Сейчас там идет открытый бета-тест.
[Ссылка на канал]
Источник

