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

Как я автоматизировал поиск работы на LinkedIn при помощи LLM

Как я автоматизировал поиск работы на LinkedIn при помощи LLM - 1

Эта статья по сути является продолжением моей прошлогодней статьи [1], в которой я автоматизировал отклики на hh.ru. Кстати, если кому это интересн, тот проект до сих пор живой, недавно проверял :)

В этой статье я расскажу о том, как я сделал тоже самое, но для LinkedIn, и как тоже самое можете сделать вы, потратив на это примерно полчаса своего времени и 0 рублей (при соблюдении определенных условий, разумеется).

Итак, недавно у меня появилась желание поискать работу на зарубежном рынке, ведь перспектива валютной удаленки выглядит весьма заманчивой (хоть и достаточно смутной в свете последних сокращений в зарубежном IT). В качестве первого ресурса для поиска работы был выбран сайт LinkedIn, а в качестве приложения для автоматизации этого поиска – проект AiHawk, который и вдохновил меня в прошлом году на создание аналогичного приложения для hh.ru. Но вот незадача – проект уже почти год как неактивен а последняя найденная версия не работоспособна. Поэтому было решено переписать данный проект, чтобы он снова мог работать.

Итак, что оно умеет?

  • искать вакансии на LinkedIn в соответствии с заданными настройками поиска, и определять, какие из них могут заинтересовать пользователя исходя из его резюме и настроек поиска, все найденные интересные вакансии сохраняются в файл, в котором они отсортированы по степени убывания их “интересности”

  • выделять из текста вакансии навыки, наличие которых подразумевается у кандидата на эту вакансию; все навыки также сохраняются в файл статистики, в котором они сортируются по убыванию частоты их появления в вакансиях

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

  • при этом в настройках есть режим, который позволяет делать все вышеперечисленное в фоне, а также режим автозапуска, который позволяет запускать процесс поиска вакансий раз в сутки

    Поэтому это приложение подойдет вам, если вы:

  • пока не готовы искать работу, но хотите знать, какие навыки наиболее востребованы по интересующей вас специальности

  • ищете работу в пассивном режиме, т.е. готовы рассматривать вакансии и откликаться на интересные, но при этом никуда не торопитесь и не хотите тратить на этот процесс ни минуты своего времени

  • ищете работу в пассивном режиме, готовы доверить поиск работы нейронке, но откликаться хотите самостоятельно

  • отчаянный ковбой, которому нужно срочно найти работу на LinkedIn, любой ценой, но бесплатно

Еще раз об этической стороне вопроса

Перед тем, как углубиться в детали, поговорим об этической стороне вопроса. Как и в случае с приложением для hh.ru, данное приложение для LinkedIn я считаю абсолютно этичным, так как:

  • компании сами используют LLM для поиска и отбора кандидатов, поэтому значительная часть откликов даже не доходит до HR, будучи отсеянными автоматическими фильтрами

  • найти работу в IT со временем легче не становится, помощники, упрощающие эту задачу, тут не повредят

  • есть режим поиска работы без автооткликов

  • спамить откликами в любом случае не выйдет, так как LinkedIn ограничивает количество быстрых откликов цифрой 50 в день

  • есть мнение, что можно потратить свое время на что-то более полезное, чем поиск и вычитывание простыней текста от работодателей с последующим затачиванием своего резюме под каждую кажущуюся подходящей вакансию и ответами на бесконечные однотипные и тупые вопросы

Основные отличия LinkedIn от HH

А они есть, и главное из них – на hh ты сначала заполняешь резюме на сайте, а потом уже откликаешься этим готовым резюме на каждую вакансию, прикладывая сопроводительное письмо и изредка отвечая на те или иные вопросы. На LinkedIn же под каждую вакансию желательно писать отдельное резюме, заточенное под эту вакансию, поскольку рассылка одного и того же резюме всем работодателям снижает вероятность ответа на ваш отклик. Плюс отклик на каждую вакансию требует ответа на множество вопросов, что на hh случается редко. А вот сопроводительные письма, в отличие от hh, просят не так часто. Эти отличия пришлось учитывать в архитектуре приложения, а теперь поговорим собственно о ней.

Архитектура приложения

Как я автоматизировал поиск работы на LinkedIn при помощи LLM - 2

Основной язык 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, да к тому же кушает на порядок меньше токенов.

В целом алгоритм работы выглядит так:

  1. Загружаем настройки программы и информацию о резюме из соответствующих файлов.

  2. Заходим на сайт и авторизуемся, если до этого не заходили. В противном случае просто загружаем предыдущую сессию.

  3. Анализируем, насколько полно представлена информация в резюме. Если есть неточности – просим пользователя их указать, в противном случае продолжаем работу.

  4. Если в конфиге есть какие-то дополнительные настройки поиска – задаем их на сайте.

  5. Движемся по списку найденных вакансий, заходим в очередную, берем ее описание, формируем промпт, добавляем туда также информацию о резюме пользователя и настройках поиска вакансий.

  6. Просим LLM оценить, насколько подходит по ее мнению данная вакансия по шкале от 1 до 100. Если оценка выше границы, предварительно заданной в настройках приложения – переходим к п.7, иначе переходим к п.5.

  7. Собираем информацию о навыках, требуемых для данной вакансии, сохраняем ее в отдельный файл со статистикой по навыкам.

  8. Если в настройках приложения стоит разрешение на отклик – жмем кнопку отклика. В противном случае сохраняем информацию о данной вакансии в отдельный файл и переходим к п.5.

  9. Формируем с помощью LLM файл резюме и текст сопроводительного письма (при необходимости), прикладываем их к отклику.

  10. Отвечаем на дополнительные вопросы работодателя: какую зп хочешь, готов ли приезжать в офис, есть ли гражданство и т.д. Если до этого вопрос уже встречался, загружаем готовый ответ из файла, в противном случае просим LLM ответить и сохраняем ответ.

  11. В случае, если для ответа недостаточно информации, во избежание галлюцинаций в промпте указано возвращать вместо ответа фразу “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, но они не обязательны к использованию. Так что теперь можно откликаться на вакансии, не жертвуя свои персональные данные третьим лицам.

Playwright вместо Selenium

В 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

www.BrainTools.ru

Rambler's Top100