Привет, Хабр! Меня зовут Кияшева Екатерина. В начале марта я активно занялась поиском после творческого отпуска и сама столкнулась с радикальным изменением рынкПривет, Хабр! Меня зовут Кияшева Екатерина. В начале марта я активно занялась поиском после творческого отпуска и сама столкнулась с радикальным изменением рынк

ИИ-помощник для поиска работы на hh.ru

2026/03/16 17:20
5м. чтение
Для обратной связи или замечаний по поводу данного контента, свяжитесь с нами по адресу crypto.news@mexc.com
adbe4cb361c4e2ad53b93b5e51be22da.jpg

Привет, Хабр! Меня зовут Кияшева Екатерина. В начале марта я активно занялась поиском после творческого отпуска и сама столкнулась с радикальным изменением рынка:

  • Нет откликов: открыть резюме на пару дней больше не работает.

  • Фильтрация на hh.ru, на мой взгляд, сильно забагована. Автопоиск сбрасывает часть фильтров. В рассылку попадают вообще не интересные вакансии, а интересные не попадают. В чате поддержки отвечает бот, так что сообщить девелоперу о баге невозможно.

  • Статистика по вакансиям показывает резкий пик откликов с первого дня публикации. До поздних откликов рекрутеры похоже не добираются.

Все это вгоняет в уныние: рассылать резюме всем подряд не хочется, а держать руку на пульсе в таких условиях утомительно. Я написала ИИ-помощника, который сам мониторит сайт по расписанию, выбирает только интересные вакансии, анализирует компанию и вакансию, сопоставляет требования вакансии со скиллами в резюме и приносит результаты в личный чат. Таким образом, о вакансиях можно узнавать своевременно, рассматривать их с первичной аналитикой на руках.

Бот работает с OpenRouter, не нуждается в VPN, обращается к HH через API, под капотом имеет LangFlow. Конструкция позволяет кастомизировать под себя:

  • Запросы на выборку вакансий,

  • Промпты: резюме, требования к анализу вакансии, требования к сопроводительному письму,

  • LLM, через которую выполняется анализ,

  • Расписание, по которому выполняется задача.

Все перечисленное забито демонстрационными данными.

На публикацию этого бота вдохновила статья от Кристины Тимофеевой «Как выделиться среди 300 откликов? Честный взгляд от HR». Ее рекомендации на тему изучения работодателя и подготовки персонифицированного сопроводительного совпали с вектором этой автоматизации. Я решила “это знак” 🙂, бот может пригодиться кому-то еще. Ниже подробная инструкция к установке.

Предварительные требования

Если нет:

  • Установить Python.

  • Установить Docker.

Подготовка HeadHunter API

  • Зарегистрируйте приложение на dev.hh.ru.

    • Название и Redirect URL могут быть любыми (например, "HHbot" и "myapp://auth").

    • Дождитесь модерации. После одобрения вы получите Client ID и Client Secret.

  • Сгенерируйте access token (Документация метода token):

curl -X POST https://api.hh.ru/token \ -d "grant_type=client_credentials" \ -d "client_id=<CLIENT_ID>" \ -d "client_secret=<CLIENT_SECRET>"

В результате вы получите "Токен приложения".

0806c95c5fd6ec0b31e33d36bc5b1728.jpg
  • Подготовьте API-запросы для выборки вакансий. Предусмотрено два типа запросов: для гибрида/офиса в своем городе и для удаленной работы в любом, однако можно составить реквесты с любым набором параметров. Запросы можно сформировать в UI hh.ru через фильтры, а затем адаптировать их под формат API (Документация метода vacancies).

Подготовка OpenRouter

  • Зарегистрируйтесь на OpenRouter, это хаб с LLM моделями - платными и бесплатными. Для отслеживания лимитов использования есть страница активности.

  • Создайте API-ключ.

Подготовка Telegram

  • Создайте бота через @BotFather.

  • Получите TOKEN и узнайте свой CHAT_ID.

Развертывание

  • Клонируйте репозиторий:

git clone https://github.com/e-sendbox/pVacantScouter_HH.git cd pVacantScouter_HH

  • Настройте переменные окружения: Переименуйте .env.example в .env и заполните данные:

# Langflow LANGFLOW_SUPERUSER=<произвольный логин, например, admin> # под Superuser загрузим предподготовленную цепочку LANGFLOW_SUPERUSER_PASSWORD=<произвольнй пароль> # под Superuser загрузим предподготовленную цепочку LANGFLOW_PORT=7860 # порт, на котором развернем LangFlow LANGFLOW_URL=http://localhost:${LANGFLOW_PORT} # адрес, на котором доступен LangFlow LANGFLOW_API_KEY="произвольный ключ в формет sk-XXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXX_XXXXXXX" # с этим ключом будем запускать цепочку LangFlow # Telegram Bot TG_TOKEN=<токет Telegram бота> # токен чат-бота, который будет присылать сообщения TG_CHAT_ID=<ID своего чата> # собственный CHAT_ID # HH params HH_TOKEN=<токен > # "Токен приложения", полученный на HH HH_REQUEST_GIBRID="https://api.hh.ru/vacancies?text=Sre+инженер&area=1&work_format=HYBRID&label=with_salary&search_field=name" # API запрос №1. Внимание, в .env.example демонстрационные денные HH_REQUEST_REMOTE="https://api.hh.ru/vacancies?text=Sre+инженер&work_format=REMOTE&label=with_salary&search_field=name" # API запрос №2. Внимание, в .env.example демонстрационные данные # OpenRoute LLM Hub param OPENROUTER_API_KEY=<API ключ OpenRouter хаба с LLM> # API-key, зарегистрированный в OpenRouter # Schedule (cron: minute hour day month day_of_week, default: every hour) SCHEDULE_CRON=0 * * * * # расписание, по которому бот будет запускать задачу самостоятельно (в данном случае каждый час в 00 минут)

  • Установите зависимости:

python -m venv venv source venv/bin/activate # Для Windows: venv\Scripts\activate pip install -r requirements.txt

  • Запустите Langflow через Docker, подождите пару минут, пока загрузится цепочка в LangFlow:

docker-compose up -d

  • Проверьте успешность развертки. Убедитесь в логах (docker logs --tail 30 langflow), что цепочка загружена:

--- Старт автоматизированного деплоя --- [*] Запрос списка цепочек с http://localhost:7860... [-] Цепочка 'HH-agent' не найдена. Загружаем... [*] Попытка загрузки HH-agent... [+] Цепочка успешно загружена! --- Проверка завершена ---

  • Проверьте релевантность цепочки. Перейдите в LangFlow по адресу из .env (http://localhost:7860), авторизуйтесь под логином и паролем SUPERUSER из .env, откройте цепочку 'HH-agent'. В блоках цепочки должны быть проставлены и гореть зеленым переменные.

411cc8b745f1a85d3a252aa9688fedcf.jpg

Настройка и использование

Настройка промптов

Перейдите в директорию /config/prompts/ и заполните следующие файлы своими данными:

  • resume.txt — скопируйте сюда текст вашего актуального резюме. LLM будет использовать его для сопоставления с требованиями вакансии.

  • requirements.txt — промпт для анализа вакансии и компании. Задайте в нем свои критерии анализа.

  • letter_requirements.txt — промпт для разработки сопроводительного письма. Задайте желаемый тон и ключевые моменты, на которых стоит сделать акцент.

Настройка стоп-листа

ВАЖНО! Бесплатные LLM имеют жесткие лимиты на количество токенов. Чтобы не потратить их все сразу, рекомендуется провести первую обработку вручную и внести результаты в стоп-лист. Далее приложение будет игнорировать эти вакансии. Ручной прогон резюме и вакансий через LLM удобно делать через Perplexity, в нем есть сущность "Пространства", куда удобно подгружать промпты и файлы.

Для заполнения стоп-листа откройте /config/stop_list.csv, файл имеет следующую структуру:

  • vacancy_id — [Обязательно] Цифровой ID вакансии (код в ссылке на вакансию). Используется приложением для фильтрации.

  • vacancy_name — [Опционально] Информационное поле для названия вакансии.

  • stop_reason — [Опционально] Причина добавления (например, «уже откликнулся» или другое).

  • period — [Опционально] Данные о времени рассмотрения вакансии.

  • link — [Опционально] Прямая ссылка на вакансию.

Проверка работы бота на уровне цепочки

Вся логика поиска зашита в цепочке LangFlow, рекомендуется ее проверить перед запуском бота. Внутри каждого блока в правом верхнем углу доступна кнопка запуска блока, а в правом нижнем просмотр результатов.

  1. Блоки HH API (1): Выполняют API-запросы к HH, заданные в .env.

  2. Блок Super HH Fetcher (2): Удаляет дубликаты вакансий, вакансии из стоп-листа и отправляет уведомление в Telegram с количеством новых вакансий. По умолчанию поле "StopList JSON" пустое, поскольку вакансии в него подгружаются динамически. Для ручной проверки его можно заполнить массивом вида [id, id, id] или просто учесть этот нюанс.

  3. Блок Loop (3): Поочередно забирает отфильтрованные вакансии. Каждую прогоняет через LLM в соответствии с промптом и отправляет итоговый результат в Telegram. В цепочке виден ход выполнения каждого цикла, процесс можно остановить в любой момент.

d9b72678dd1806f89da8eba75c5cef7d.jpg

Финальный запуск приложения

После настройки всех параметров запустите основное Python-приложение:

python main.py

Перейдите в Telegram-бот, введите /start для вызова меню. В меню нажмите кнопку "Run VacantScouter-HH" для старта задачи.

23495c146e929e181e604719cc35082a.jpg

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу crypto.news@mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.