Когда откликаешься на сотню вакансий, а HR молчит
Знакомо чувство, когда тратишь час на одно сопроводительное письмо, а в ответ – тишина? Или когда копируешь шаблон, и рекрутеры видят это за километр? Рынок труда превратился в игру на выживание, где побеждает не самый квалифицированный, а тот, кто эффективнее проходит фильтры.
Проблема в том, что современные HR-системы и сами рекрутеры научились распознавать безликий AI-slop – текст, сгенерированный нейросетью без капли души и контекста. Твоя задача – создать агента, который не просто заполняет шаблон, а проводит глубокий анализ, находит точки соприкосновения и генерирует отклики, от которых невозможно отличить человеческие.
AI-slop – это не просто плохой текст. Это предсказуемые конструкции, общие фразы, отсутствие конкретики и главное – несоответствие между твоим опытом и требованиями вакансии. Рекрутеры научились ловить это по первой же фразе.
Архитектура агента, который не тупит
Прямой промпт вроде «напиши отклик на эту вакансию» – гарантированный провал. Нейросеть начнет галлюцинировать, приписывать тебе несуществующие навыки или использовать шаблонные формулировки. Нужен многоступенчатый пайплайн, где каждый этап решает конкретную задачу.
1 Этап извлечения: вытащить суть из HTML-помойки
Вакансии на HH.ru, Habr Career или LinkedIn – это не чистый текст. Это слоеный пирог из HTML, CSS, JavaScript и рекламных блоков. Первый суб-агент должен превратить этот хаос в структурированные данные.
| Что извлекаем | Как извлекаем | Ошибки, которых избегаем |
|---|---|---|
| Название позиции | CSS-селекторы или XPath, но лучше – LLM с промптом «найди заголовок вакансии» | Захватить вместе с названием компании или локацией |
| Ключевые требования | Разбить на hard skills (технологии) и soft skills (управление, коммуникация) | Спутать «желательно» с «обязательно» |
| Стек технологий | Извлечь названия языков, фреймворков, инструментов через именованные сущности | Пропустить синонимы (K8s вместо Kubernetes) |
| Уровень зарплаты | Регулярные выражения для чисел + контекст (на руки/до вычета) | Принять зарплатный диапазон за фиксированную сумму |
Не используй BeautifulSoup или Scrapy как черный ящик. Настрой промпт для LLM, который будет анализировать очищенный HTML и возвращать JSON с полями: title, requirements_hard, requirements_soft, tech_stack, salary_range, company_description.
Почему LLM лучше парсеров? Потому что вакансии пишут живые люди. Они могут написать «ищем Senior Python-разработчика» в одном абзаце, а в другом – «требуется опытный питонист». Человек поймет, что это одно и то же. Парсер – нет. LLM улавливает синонимы и контекст.
2 Этап сопоставления: найти точки пересечения, а не врать
Второй суб-агент берет структурированную вакансию и твое резюме (тоже предварительно разобранное на факты). Его задача – не приписать тебе недостающие навыки, а найти реальные точки соприкосновения и сформулировать их убедительно.
- Точное совпадение: Вакансия требует Python 5+ лет. У тебя в резюме есть «Python – 6 лет». Идеально.
- Частичное совпадение: Нужен опыт с FastAPI. У тебя есть Django и Flask, но нет FastAPI. Агент должен отметить: «Имею глубокий опыт с веб-фреймворками Python (Django, Flask), изучение FastAPI займет минимальное время».
- Контекстный перенос: Требуется опыт управления командой из 10 человек. У тебя был опыт руководства проектом с 5 разработчиками. Агент формулирует: «Управлял кросс-функциональной командой из 5 человек, понимаю процессы масштабирования до 10+».
Здесь критически важна система валидации. Если агент начинает галлюцинировать и приписывать тебе опыт с Kubernetes, которого у тебя нет – весь пайплайн летит в помойку. Нужны жесткие правила:
- Любое утверждение о твоем опыте должно иметь подтверждение в резюме.
- Если точного совпадения нет – использовать только частичные совпадения с пометкой «смежный опыт».
- Запретить фразы вроде «быстро научусь» или «интересно попробовать» – это маркеры дилетанта.
3 Этап генерации: превратить факты в историю, а не в список
Теперь у нас есть два набора фактов: что нужно компании и что есть у тебя. Третий суб-агент – писатель. Его задача создать нарратив, а не перечислить пункты.
Плохой отклик:
«Здравствуйте! Я вижу, что вы ищете Python-разработчика с опытом работы 5 лет. У меня есть опыт работы 6 лет. Вы требуете знание Docker. Я знаю Docker. Также PostgreSQL. Я работал с PostgreSQL.»
Хороший отклик:
«В вашей вакансии обратило внимание на требование по оптимизации производительности Python-сервисов. На предыдущем проекте я сократил время ответа API с 200 мс до 40 мс за счет рефакторинга ORM-запросов и внедрения кэширования в Redis – это напрямую соотносится с задачей по масштабированию, которую вы упоминаете.»
Видишь разницу? Первый вариант – это AI-slop. Второй – конкретная история, которая показывает понимание задачи и подтверждает опыт цифрами.
Технические нюансы, о которых молчат в туториалах
Борьба с галлюцинациями на каждом шагу
Галлюцинации – это когда нейросеть придумывает факты. В нашем случае это смертельно. Меры противодействия:
- Температура = 0: На этапах извлечения и сопоставления используй минимальную креативность. Нужны факты, не варианты.
- Шаблоны ответов: Заставь LLM возвращать данные в строгом JSON-формате. Если ответ не парсится – повторяй запрос.
- Перекрестная проверка: Первый агент извлекает стек технологий. Второй агент проверяет, действительно ли эти технологии упоминаются в тексте вакансии.
Контекстуализация вместо копирования
Рекрутеры ненавидят, когда в отклике видят дословные цитаты из их же вакансии. Агент должен перефразировать, но сохранять смысл.
Вакансия: «Ищем разработчика для создания высоконагруженного микросервиса».
Плохо: «Я готов создавать высоконагруженные микросервисы».
Хорошо: «Мой опыт по оптимизации latency в распределенных системах напрямую применим к разработке микросервисов под высокую нагрузку».
Адаптация под платформу
Отклик на HH.ru, письмо на email и сообщение в LinkedIn – это три разных формата. Агент должен это учитывать.
| Платформа | Длина | Ключевой элемент | Чего избегать |
|---|---|---|---|
| HH.ru (стандартная форма) | 300-500 символов | Первые два предложения – самое важное | Маркированных списков (система может их сломать) |
| Email рекрутеру | 500-800 символов | Персонализация (упомяни общее знакомство или статью компании) | Шаблонных фраз «уважаемый HR-менеджер» |
| LinkedIn InMail | 200-400 символов | Ссылка на общие контакты или группы | Официального тона – здесь ценят неформальность |
Пайплайн в действии: от вакансии до отклика за 90 секунд
Представь процесс:
- Ты находишь вакансию Senior Backend Developer в стартапе.
- Расширение браузера (часть твоего агента) захватывает HTML-страницу.
- Агент-экстрактор за 15 секунд вытаскивает: нужен Python, FastAPI, опыт с AWS, построение CI/CD, знание Kafka.
- Агент-матчер сверяет с твоим резюме: Python есть, FastAPI нет (но есть Flask), AWS есть, CI/CD есть, Kafka нет (но есть RabbitMQ).
- Агент-генератор получает структуру: «3 точных совпадения, 2 частичных». Создает отклик, где акцент на AWS и CI/CD (точные совпадения), а про FastAPI и Kafka – упоминание смежного опыта с аналогичными технологиями.
- Ты получаете готовый текст, проверяешь его на адекватность, жмешь «отправить».
Весь процесс – минута-полторы. За вечер можно разослать 30-40 персонализированных откликов, а не 5-10 шаблонных.
Важно: Этот пайплайн не заменяет тебя. Он заменяет рутину. Ты все равно должен проверять каждый отклик перед отправкой. Агент – твой помощник, а не автономный дропшиппер резюме.
Что пойдет не так (и как это пофиксить)
Проблема: агент начинает врать про твой опыт
Симптом: в откликах появляются технологии, которых нет в твоем резюме.
Решение: добавить слой валидации. Перед генерацией финального текста четвертый агент проверяет каждое утверждение о твоих навыках по исходному резюме. Если утверждение не подтверждено – отправляет на перегенерацию.
Проблема: все отклики звучат одинаково
Симптом: после 20 вакансий ты замечаешь, что агент использует одни и те же фразы.
Решение: ротировать шаблоны. Создай 5-7 различных структур откликов (история успеха, решение проблемы, культурное соответствие) и случайным образом выбирай одну для каждой вакансии.
Проблема: низкая конверсия в ответы
Симптом: отправляешь 100 откликов, получаешь 2 ответа.
Решение: начать A/B-тестирование. Раздели вакансии на две группы. Для первой группы используй стандартный пайплайн. Для второй – добавь дополнительный шаг: анализ компании (последние новости, продукты, культура) и упоминание этого в отклике. Сравни конверсию через неделю.
Неочевидный совет: добавь элемент человечности
Самый продвинутый пайплайн будет выдавать идеальные с точки зрения логики отклики. Но люди нанимают людей, а не идеальные резюме. Добавь в конец пайплайна маленький хак.
Перед отправкой позволь агенту добавить одну неформальную фразу, основанную на анализе компании. Например:
- «Кстати, видел ваш последний продукт на TechCrunch – впечатляющая архитектура.»
- «Заметил, что в вашем блоге пишут про event-driven архитектуру – как раз мой профиль.»
- «У вас в команде работает Иван Петров – мы пересекались на конференции в прошлом году.»
Эта одна фраза увеличит конверсию на 20-30%. Потому что покажет, что ты не просто рассылаешь шаблоны, а действительно заинтересован в этой конкретной компании.
Создание такого агента – это не разовый скрипт. Это живая система, которую нужно постоянно улучшать. Анализируй ответы рекрутеров, смотри, на какие отклики реагируют, а на какие – нет, и дорабатывай промпты.
И помни: лучший агент не тот, который пишет за тебя. А тот, который позволяет тебе тратить время на собеседования, а не на заполнение форм.