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

в 8:37, , рубрики: AI, llm, llm-приложения, работа, работа в it

Предыстория

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

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

Можно конечно ускорить процесс, выкинув из этого алгоритма пункт с вычитыванием резюме, но:
а) есть немалый шанс, кликая на все подряд, как обезьяна, откликнуться на неподходящую для тебя вакансию; кому-то это норм, но мне бы не хотелось дергать HR'ов лишний раз по поводу вакансии, которая на самом деле мне не интересна;
б) некоторые особо хитрые работодатели добавляют в описание своих вакансий всякие ключевые слова/вопросы, которые нужно упомянуть/ответить в резюме; по мне так не самая лучшая практика, но я их за это не виню.

Эх, вот бы нашелся кто-нибудь, кто вычитал бы вакансию за меня, определил, будет ли мне она интересна, написал бы сопроводительное письмо с учетом моего резюме, текста вакансии и всяких там ключевых слов, ответил бы на сопутствующие вопросы и послал бы все это дело работодателю...

Минуточку, кажется я знаю, кто мне в этом поможет: LLM же!

Этическая сторона вопроса

Изображение создано с помощью DALL-E

Изображение создано с помощью DALL-E

Можно конечно поговорить про то, насколько все это этично, но лично для меня такого вопроса не стоит и вот почему:

  • компании сами используют автоматизацию, в том числе и нейронки, в подборе и найме кандидатов, почему соискатели не должны делать то же?

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

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

Реализация

Итак, с этической составляющей разобрались, что дальше? А дальше выяснилось, что совсем недавно вышла софтина под названием AiHawk, которая чем-то подобным и занимается, а именно помогает рассылать вакансии работодателям в LinkedIn с помощью нейронки. Правда, в нее не заложен функционал с подбором потенциально интересной тебе вакансии, откликается она на все подряд, но это правится на уровне промпта.

Появление подобного софта было лишь вопросом времени

Появление подобного софта было лишь вопросом времени

На данный момент меня интересует работа в РФ, поэтому было принято решение доработать софтину под какой-нибудь местный сайт поиска работы. Выбор очевидно пал на hh.ru. В основе оригинального приложения лежит связка python + selenium + LLM API. Можно конечно попытаться интегрировать API от hh.ru, но, насколько я знаю, есть сложности с доступом к нему + жалобы на общую кривизну. В общем, решено было пойти путем "работает - не трогай" и просто доработать текущий проект под работу с ххру. С селениумом я до этого никогда не работал, но там все оказалось просто, поэтому освоил его я достаточно быстро, в течение нескольких дней.

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

В качестве LLM оригинальный проект предлагает на выбор множество разных вариантов, включая OpenAI, Claude, Gemini, LLama, локальные модельки с Hugging Face и т.д. Я выбрал GPT-4o mini от OpenAI - моделька шустрая, работает адекватно, при этом один запрос стоит примерно $0.0005, т.е. очень умеренно. Впрочем, всегда есть возможность выбрать любую, другую модель - все настройки оригинального проекта в части выбора LLM я сохранил. Единственный нюанс: если модель не лежит локально на компе, скорее всего нужно будет заморочиться с VPN, но для любого пользователя интернета в России это давно уже навык категории must have.

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

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

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

  3. Выбираем нужное нам резюме (задается в конфигурационном файле)

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

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

  6. Спрашиваем LLM, подходит ли по ее мнению мне эта вакансия. Если ответ да, переходим к п.7, иначе возвращаемся к п.5.

  7. Жмем на кнопку отклика.

  8. Формируем с помощью LLM текст сопроводительного письма с учётом вакансии и моего резюме, указываем в промпте про возможный прикол со скрытыми в описании вакансии вопросами и ключевыми словами. Прикладываем его к своему отклику.

  9. Если у работодателя есть какие-то дополнительные вопросы (типа какую зп хочешь, готов ли приезжать в офис, дай свой телеграм и т.д.), отдаем текст этого вопроса LLM, просим сначала определить его категорию (личная информация, контакты, предпочтения по работе и т.д.), а затем просим ее ответить на данный вопрос, приложив при этом всю доступную информацию из соответствующей категории (разбитая по категориям информация о пользователе лежит в отдельном файле).

  10. В случае, если ответить на вопрос не получается (нет соответствующей информации или вместо вопроса хитрый работодатель приложил ссылку на какой-нибудь опросник в Google Docs) - пропускаем вакансию и заносим информацию о ней в отдельный файл, пусть пользователь сам потом разбирается.

Результат

На видео ниже пример работы. На нем программа запускается, находит через поиск вакансию (поиск специально настроен так, чтобы вакансия нашлась только одна), откликается на нее, пишет сопроводительное письмо и также отвечает на сопутствующие вопросы. Модель работает адекватно, хорошо определяет вакансии, которые меня действительно заинтересовали бы (тут пришлось повозиться с промптом), пишет грамотные сопроводительные письма (пришлось повозиться с промптом еще больше, изначально писала какую-то лютую дичь), и корректно отвечает на вопросы.

Видео

Проект есть на гитхабе, найти можно по этой ссылке. Он пока что в бета-версии и возможны баги (много багов) + еще не вся желаемая функциональность добавлена. Например, пока не умеет отвечать на некоторые типы вопросов или сливается при виде ссылок на опросники на сторонние сайты (хотя я бы тоже слился на его месте), но с обработкой 95% вакансий он уже справляется, а те, с которыми не справляется, заносит в специальный файл, который потом можно посмотреть и прокликать уже вручную. Так что если кто заинтересовался - welcome. Разумеется, предложения по доработке и исправлению багов только приветствуются.

Автор: beatwad

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js