Наш клиент - кадровое агентство, занимающееся подбором персонала для различных предприятий. Перед нами была поставлена задача разработать систему анализа резюме для более быстрой обработки документов и эффективной сортировки кандидатов.
Наша система по анализу и поиску резюме работает по следующему алгоритму:
Для того, чтобы нейросеть поняла запрос пользователя, она должна найти в его запросе сущности. Мы рассматривали различные LLM с учётом стоимости, скорости работы и доступности.
Стоимость ChatGPT для нужд заказчика оказалась слишком большой, поэтому мы решили применить LLM меньшего размера (выбирали между Llama и Mistral), такую LLM мы развернули для заказчика на арендованном сервере.
Наша LLM находит сущности в русскоязычных и англоязычных запросах, устойчива к грамматическим ошибкам в запросах пользователя, обрабатывает синонимы, обобщает развёрнутые описания.
Также можно указывать дополнительные правила, каким образом должны определяться сущности, если их значение нужно «вычислить», например:
You should assume require seniority from the query. 1-2 years of experience is Junior, 3-4 years is Middle, 5 and more year is Senior. If seniority cannot be assumed, leave the field empty.
Для ускорения нашего поиска мы предложили использовать нормализованные запросы и нормализованные документы вместо обычных запросов и документов (резюме) пользователей.
Нормализованный запрос - это запрос пользователя, очищенный от “шума”, т.е. изменённый таким образом, чтобы он содержал только релевантную информацию в стандартном виде. Список сущностей, обнаруженных в запросе является хорошим примером нормализованного запроса.
Нормализованный документ (резюме) - это тот же исходный документ, но очищенный от “шума” и включающий в себя наиболее важную для поиска информацию в компактном и стандартизованном виде. В качестве первого приближения можно использовать список сущностей, определяемых для запроса пользователя, но определять эти сущности для резюме.
Таким образом, для каждого документа в базе с помощью LLM будет создан нормализованный документ и семантический поиск будет вестись среди нормализованных документов.
Семантический поиск мы осуществляем с помощью Elastic Search в два этапа.
В первой итерации скорость поиска оказалась неудовлетворительной, поэтому мы предложили перейти на двухступенчатый поиск: сначала быстрая модель (Retriever) возвращает большое кол-во релевантных результатов (например, 1000-5000 документов), после чего более качественная и медленная модель (Reranker) сортирует эти результаты по релевантности.
Семантический поиск следует требуемым правилам ранжирования: точное совпадение всегда имеет более высокий ранг, чем синонимы. Между собой синонимы ранжируются в зависимости от своей близости к поисковому запросу.
А благодаря нормализации документов и запросов результаты ранжирования имеют достаточно высокое качество.
Приложение может обрабатывать резюме и извлекать важные данные, такие как имя кандидата, желаемая компенсация, навыки, опыт и т.д. в считанные секунды независимо от формата резюме.
Основываясь на навыках и достижениях кандидата, приложение присваивает ему уровень квалификации, например, "младший", "средний" или "старший" для кандидатов на должность инженера-программиста, что облегчает сортировку кандидатов.
Приложение ускорило обработку резюме в десять раз благодаря интеллектуальному извлечению информации и интеллектуальной сортировке кандидатов по квалификации, сократив время, необходимое для поиска кандидата на любую должность, тем самым снизив затраты и выделив нашего клиента среди конкурентов.
Разработанное нами приложение было успешно внедрено в бизнес-процессы нашего клиента, значительно повысив эффективность, сократив время обработки резюме и время, необходимое для проведения собеседования с каждым кандидатом, благодаря интеллектуальной оценке навыков.