Кейс: как разработать и вывести в продакшн рекомендательную систему для крупнейшего сервиса по созданию резюме

Привет, меня зовут Боря, я технический директор в Poteha Labs.

Существует определённая структура и ряд правил для составления резюме, именно на это обращают внимание HR-менеджеры при выборе кандидатов. Resume.io (один из крупнейних сервисов по созданию резюме с 13+ миллионами пользователей) помогает в онлайн режиме создать такое резюме, которое точно принесёт приглашение на собеседование. На сегодняшний день это узнаваемый международный сервис по созданию резюме, пользующийся доверием многочисленных пользователей. А создание рекомендательной системы — это тоже наука. Вот об этом мы и поговорим в этой статье.

Кейс: как разработать и вывести в продакшн рекомендательную систему для крупнейшего сервиса по созданию резюме

Знакомство

Мы знали про Resume, потому что регулярно нанимаем, но, получилось, как в том самом анекдоте про гору и Магомета. Ребята сами оставили заявку на нашем сайте и связались с нами.

Задачи

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

При выборе навыков меню с подсказками мгновенно обновляется с новыми вариантами
При выборе навыков меню с подсказками мгновенно обновляется с новыми вариантами

В процессе работы возникали дополнительные задачи, а именно:

  • Автоматический парсинг резюме, извлечение именованных сущностей (NER).
  • Замена фона на портрете пользователя, центрирование лица на фотографии.

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

Дополнительно, чтобы фотография выглядела более презентабельно мы сделали центрирование и улучшение (beautify) портрета пользователя.

Решение задач

Рекомендательная система

Для решения задачи с помощью машинного обучения необходимы исторические данные, с этим проблем не было: данные по всем резюме хранятся в базе данных в структурированном формате. Основываясь на этих данных, мы построили базовый алгоритм, который предварительно обрабатывал исторические данные, строил из них матрицу смежности и по входящему вектору признаков подбирал наиболее частотные. Мы упаковали решение в веб-сервер на FastAPI и завернули в Docker.

На следующем шаге мы выкатили решение в AWS ECS (система оркестрации контейнеров от Амазона), что дало почти 100% уровень доступности сервиса. Финальный алгоритм для вывода в продакшн является улучшенной версией бенчмарка.

Кейс: как разработать и вывести в продакшн рекомендательную систему для крупнейшего сервиса по созданию резюме

Замена фона

Для работы с изображениями (центрирование фото и beautify) мы взяли две open-source библиотеки. Это стандартная практика, так как открытые решения часто уже работают достаточно хорошо и они использовали большой массив данных для обучения. В нашем случае мы не делали дообучение моделей, а занялись развертыванием сервиса, что обычно значительно сложнее, чем просто написать вызов функций из сервера. Например, мы сделали тюнинг параметров не весах моделей, чтобы улучшить производительность. Когда мы говорим про продакшн-решения, производительность чаще важнее качества, то есть нет смысла бороться за лишние 3%, если это дает 10х нагрузку на сервера. Но все зависит от задачи, конечно.

В результате мы сделали сервис из двух компонент, одна из которых представляла собой асинхронную очередь, разбиение на батчи и управление тасками, а вторая составляющая сервиса занималась непосредственно инференсом сформированных батчей и их постобработкой. Решение в продакшене, работает на CPU, скорость работы ~1 RPS при непрерывной загрузке. Работает через FastAPI.

Центрируем Лешу — СТО Resume.io
Центрируем Лешу — СТО Resume.io

Автоматический парсинг резюме

Проект был выполнен в несколько итераций, сначала это был NER на SpaCy, который умел распознавать небольшой процент сущностей, на последующих итерациях мы увеличили число сущностей, которые распознавались моделью, после чего мы добавили текстовый классификатор для того, чтобы улучшить качество распознавания для более больших блоков текста.

Мы обучали две модели: NER на SpaCy и текстовый классификатор на PyTorch. На вход подается PDF, а первое, что мы делаем — вытаскиваем текст. Текст вытаскиваем с помощью PDFTron. Сначала сделали в docx, а из него вытаскивали plain text. Сущности в резюме бывают короткие и длинные. NER на длинных сущностях работает не очень хорошо, поэтому мы поступили следующим образом: вытаскивали короткие сущности NER, дальше били текст на абзацы и прогоняли из через нейросетевой классификатор, где доставали длинные сущности (summary, bio, work experience).

На выходе, как и в случае прошлых задач, мы получили микросервис, принимающий PDF и выдающий JSON. Разметку мы делали сами в автоматическом режиме. Было 40к размеченных данных в JSON, а дальше в автоматическом формате сделали разметку.

За простой формой кроется нетривиальная реализация машинного обучения
За простой формой кроется нетривиальная реализация машинного обучения

Наш формат работы в Poteha Labs

Мы, как команда, встраиваемся в бизнес задачу. Реализуем задачу от исследования и прототипа и до развертывания решения в продакшн. У нас нет цели продать ML любой ценой, мы продаем решение бизнес задачи теми способами, которые работают.

В данном кейсе мы в первую очередь мы:

  • Поняли запрос со стороны бизнеса
  • Сделали Proof of concept и убедились решаема ли задача
  • Приблизительно оценили результат работы (качество, производительность, скорость), рассказали заказчику риски
  • Работали с недельными спринтами с постоянной связью в Телеграмме.

Мы не создаем менеджерскую прослойку, а работаем напрямую командами — для максимальной скорости и прозрачности.

Отзыв

Мы в Resume.io недавно создали собственную команду по анализу данных. Это был своего рода эксперимент, и, чтобы доказать, что он работает, мы наняли Potehalabs.com для создания MVP. Мы смогли запустить 3 успешных проекта с Poteha всего за 4 месяца, и, в результате, у них даже хватило энтузиазма, чтобы проконсультировать нас о том, как создать собственный отдел. Более того, они помогли с наймом и привлечением руководителя группы по анализу данных. Однозначно могу рекомендовать их в качестве отправной точки в вашем путешествии или усиления текущей команды.

Алексей Тактаров, Head of engineering @ Resume.io

Итог

За 4 месяца: решили 3 задачи и вывели в продакшн, сделали 2 прототипа, наняли внутреннюю команду и передали ей дела.

Свяжитесь с нами, если вы хотите внедрить машинное обучение в ваш сервис или вам нужна помощь с текущими задачами ✌

1515
2 комментария

Комментарий недоступен

1
Ответить

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

1
Ответить