- BrainTools - https://www.braintools.ru -

Эта статья по сути является продолжением моей прошлогодней статьи [1], в которой я автоматизировал отклики на hh.ru. Кстати, если кому это интересн, тот проект до сих пор живой, недавно проверял :)
В этой статье я расскажу о том, как я сделал тоже самое, но для LinkedIn, и как тоже самое можете сделать вы, потратив на это примерно полчаса своего времени и 0 рублей (при соблюдении определенных условий, разумеется).
Итак, недавно у меня появилась желание поискать работу на зарубежном рынке, ведь перспектива валютной удаленки выглядит весьма заманчивой (хоть и достаточно смутной в свете последних сокращений в зарубежном IT). В качестве первого ресурса для поиска работы был выбран сайт LinkedIn, а в качестве приложения для автоматизации этого поиска – проект AiHawk, который и вдохновил меня в прошлом году на создание аналогичного приложения для hh.ru. Но вот незадача – проект уже почти год как неактивен а последняя найденная версия не работоспособна. Поэтому было решено переписать данный проект, чтобы он снова мог работать.
искать вакансии на LinkedIn в соответствии с заданными настройками поиска, и определять, какие из них могут заинтересовать пользователя исходя из его резюме и настроек поиска, все найденные интересные вакансии сохраняются в файл, в котором они отсортированы по степени убывания их “интересности”
выделять из текста вакансии навыки, наличие которых подразумевается у кандидата на эту вакансию; все навыки также сохраняются в файл статистики, в котором они сортируются по убыванию частоты их появления в вакансиях
собственно откликаться на вакансии, отвечать на вопросы, формировать резюме и сопроводительные письма, заточенные под определенную вакансию
при этом в настройках есть режим, который позволяет делать все вышеперечисленное в фоне, а также режим автозапуска, который позволяет запускать процесс поиска вакансий раз в сутки
Поэтому это приложение подойдет вам, если вы:
пока не готовы искать работу, но хотите знать, какие навыки наиболее востребованы по интересующей вас специальности
ищете работу в пассивном режиме, т.е. готовы рассматривать вакансии и откликаться на интересные, но при этом никуда не торопитесь и не хотите тратить на этот процесс ни минуты своего времени
ищете работу в пассивном режиме, готовы доверить поиск работы нейронке, но откликаться хотите самостоятельно
отчаянный ковбой, которому нужно срочно найти работу на LinkedIn, любой ценой, но бесплатно
Перед тем, как углубиться в детали, поговорим об этической стороне вопроса. Как и в случае с приложением для hh.ru, данное приложение для LinkedIn я считаю абсолютно этичным, так как:
компании сами используют LLM для поиска и отбора кандидатов, поэтому значительная часть откликов даже не доходит до HR, будучи отсеянными автоматическими фильтрами
найти работу в IT со временем легче не становится, помощники, упрощающие эту задачу, тут не повредят
есть режим поиска работы без автооткликов
спамить откликами в любом случае не выйдет, так как LinkedIn ограничивает количество быстрых откликов цифрой 50 в день
есть мнение, что можно потратить свое время на что-то более полезное, чем поиск и вычитывание простыней текста от работодателей с последующим затачиванием своего резюме под каждую кажущуюся подходящей вакансию и ответами на бесконечные однотипные и тупые вопросы
А они есть, и главное из них – на hh ты сначала заполняешь резюме на сайте, а потом уже откликаешься этим готовым резюме на каждую вакансию, прикладывая сопроводительное письмо и изредка отвечая на те или иные вопросы. На LinkedIn же под каждую вакансию желательно писать отдельное резюме, заточенное под эту вакансию, поскольку рассылка одного и того же резюме всем работодателям снижает вероятность ответа на ваш отклик. Плюс отклик на каждую вакансию требует ответа на множество вопросов, что на hh случается редко. А вот сопроводительные письма, в отличие от hh, просят не так часто. Эти отличия пришлось учитывать в архитектуре приложения, а теперь поговорим собственно о ней.

Основной язык Python, использованы фреймворки Playwright, LangChain и Python-Telegram-Bot, Browser Use.
Приложение состоит из следующих блоков:
Main Block – основной блок, который запускает приложение и все его компоненты
Job Manager – блок, отвечающий за взаимодействие с сайтом LinkedIn, поиск вакансий, отклик на них, а также сохранение результатов работы приложения
Resume Builder – блок, отвечающий за создание резюме под каждую из вакансий
LLM Service – блок, отвечающий за взаимодействие с LLM
Telegram Manager – блок, отвечающий за отправку пользователю сообщений об ошибке [2], а также отчетов о проделанной за день работе через Telegram
Поскольку LLM это штука довольно ненадежная, идея приложения заключается в том, чтобы доверить ей только ту работу, которую может выполнить только она, а все остальное пусть выполняют обычный софт. То есть все нажатия кнопочек в браузере и поиск нужных полей для заполнения осуществляет программа, а LLM используется только для ответов на вопросы, написания резюме и прочих NLP-шных штук. У этого подхода есть недостаток, связанный с тем, что LinkeIn периодически меняет свой сайт, и поэтому некоторые функции взаимодействия с его элементами приходится переписывать. Зато в целом приложение работает надежнее, чем типичное агентское приложение, в котором все функции выполняет LLM, да к тому же кушает на порядок меньше токенов.
В целом алгоритм работы выглядит так:
Загружаем настройки программы и информацию о резюме из соответствующих файлов.
Заходим на сайт и авторизуемся, если до этого не заходили. В противном случае просто загружаем предыдущую сессию.
Анализируем, насколько полно представлена информация в резюме. Если есть неточности – просим пользователя их указать, в противном случае продолжаем работу.
Если в конфиге есть какие-то дополнительные настройки поиска – задаем их на сайте.
Движемся по списку найденных вакансий, заходим в очередную, берем ее описание, формируем промпт, добавляем туда также информацию о резюме пользователя и настройках поиска вакансий.
Просим LLM оценить, насколько подходит по ее мнению данная вакансия по шкале от 1 до 100. Если оценка выше границы, предварительно заданной в настройках приложения – переходим к п.7, иначе переходим к п.5.
Собираем информацию о навыках, требуемых для данной вакансии, сохраняем ее в отдельный файл со статистикой по навыкам.
Если в настройках приложения стоит разрешение на отклик – жмем кнопку отклика. В противном случае сохраняем информацию о данной вакансии в отдельный файл и переходим к п.5.
Формируем с помощью LLM файл резюме и текст сопроводительного письма (при необходимости), прикладываем их к отклику.
Отвечаем на дополнительные вопросы работодателя: какую зп хочешь, готов ли приезжать в офис, есть ли гражданство и т.д. Если до этого вопрос уже встречался, загружаем готовый ответ из файла, в противном случае просим LLM ответить и сохраняем ответ.
В случае, если для ответа недостаточно информации, во избежание галлюцинаций в промпте указано возвращать вместо ответа фразу “No info”. Следовательно, если получаем такой ответ – пропускаем вакансию и заносим ее в специальный файл для пропущенных вакансий, чтобы пользователь потом сам посмотрел его и откликнулся самостоятельно.
У LinkedIn, помимо вакансий с возможностью быстрого отклика (Easy Apply), есть также вакансии с переходом на сайт работодателя. Такие вакансии может обработать только агентское приложение, в котором все функции выполняет LLM через соответствующие инструменты. Для подобных вакансий я добавил в приложение агентскую библиотеку Browser Use [3], но результаты, если честно, не самые впечатляющие – агент способен справится только с одной вакансией из 5-10, при этом расход токенов минимум раз в 10 больше.
Кстати о расходе токенов. По умолчанию в качестве LLM используется Gemini, у которой, есть бесплатный тариф API (до 15 вызовов в минуту), так что откликаться можно практически бесплатно! Правда периодически могут возникать ошибки, связанные со слишком частыми запросами, но в приложении есть настройка, которая позволяет минимизировать вероятность подобных ошибок, ограничивая RPM теми самыми 15 запросами в минуту. Но даже если использовать платный тариф, по моим подсчетам быстрый отклик на одну вакансию с использованием Gemin-2.0-Flash стоит $0.0005 – $0.0035, не очень большие деньги.
Отправлять на сервера сторонних компаний свои личные данные не самая хорошая идея, поэтому я добавил анонимизацию всех персональных данных пользователя (за исключением страны, города проживания и даты рождения, иначе может пострадать качество ответов на вопросы) при отправке в LLM. В приложении осталась пара функций, которые не анонимизируют данные при отправке в LLM, про это можно почитать в README, но они не обязательны к использованию. Так что теперь можно откликаться на вакансии, не жертвуя свои персональные данные третьим лицам.
В AiHawk для взаимодействия с браузером использовался Selenium, я перевел проект на Playwright, потому что могу он более производительный, стильный, модный, молодежный, и к тому же из коробки поддерживает режим Headless, позволяющий запускать программу в фоновом режиме.
Все остальные свистелки перечислять не буду, о них можно почитать в README проекта.
На видео ниже пример работы. На нем программа запускается, находит через поиск вакансии, откликается на них, прикладывает резюме, а также отвечает на сопутствующие вопросы.
Видео [4]
Проект есть на гитхабе, найти можно по этой ссылке [5].
Автор: beatwad
Источник [6]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/20976
URLs in this post:
[1] прошлогодней статьи: https://habr.com/ru/articles/856104/
[2] ошибке: http://www.braintools.ru/article/4192
[3] Browser Use: https://github.com/browser-use/browser-use
[4] Видео: https://www.youtube.com/watch?v=crNd-cdZUU4
[5] по этой ссылке: https://github.com/beatwad/LinkedIn-AI-Job-Applier-Ultimate
[6] Источник: https://habr.com/ru/articles/958964/?utm_source=habrahabr&utm_medium=rss&utm_campaign=958964
Нажмите здесь для печати.