Создание разборщика резюме на основе искусственного интеллекта GenAI на хакатоне DataRobot и AWS 2023

Разработка разборщика резюме GenAI с использованием искусственного интеллекта на хакатоне DataRobot и AWS 2023

Источник: https://blog.talview.com/hubfs/shutterstock_740171605.jpg

В данной статье описывается решение для генеративного ИИ-скринера резюме, которое позволило нам занять третье место на хакатоне DataRobot & AWS 2023.

Хакатон DataRobot & AWS

Перейти к содержимому Октябрь 25, 2023 Брифинг-сессия 13:00 по EST Компании DataRobot и AWS приглашают вас и вашу команду демонстрировать…

www.datarobot.com

Технический стек

  • DataRobot Workbench
  • AWS Bedrock
  • Streamlit

Архитектура решения

Источник: диаграмма автора

DataRobot и AWS Bedrock необходимы в рамках концепции решения. DataRobot предоставляет рабочее пространство для создания прототипов научных исследований с использованием Jupyter Notebook. Вы также можете задать переменные среды на экземпляре блокнота для таких вещей, как доступ к AWS и т.д.

Источник: снимок экрана автора в DataRobot

AWS Bedrock – это управляемая платформа для базовых моделей на AWS. Это оркестрация нескольких базовых моделей, например, Anthropic Claude, Stable Diffusion и т.д. Вы также можете создать собственную модель, настроив базовые модели и создав свой конечный пункт модели.

Источник: снимок экрана автора на AWS

В нашем решении мы использовали Anthropic Claude 2. Способ вызова этой модели довольно простой. AWS Bedrock предоставляет Python SDK с названием Boto3.

Справочник Boto3 — Документация Boto3 1.28.75

У вас есть предложение по улучшению этого веб-сайта или Boto3? Поделитесь своими отзывами.

boto3.amazonaws.com

import boto3, json, os# У вас должен быть сохранен ключ доступа AWS и ключ к сохранению в переменных средыos.environ["AWS_ACCESS_KEY_ID"] = AWS_ACCESS_KEY_IDos.environ["AWS_SECRET_ACCESS_KEY"] = AWS_SECRET_ACCESS_KEY# Инициализируем клиента/рантайм Bedrocktry:     bedrock_runtime = boto3.client('bedrock-runtime','us-east-1',endpoint_url='https://bedrock-runtime.us-east-1.amazonaws.com')except Exception as e:     print({"error": f"{e.__class__.__name__}: {str(e)}"})llm_prompt = """Your llm prompt here"""# Отправляем запрос REST API в AWS Bedrocktry:  body = json.dumps({"prompt": llm_prompt, "max_tokens_to_sample": 100000,"temperature":0})  modelId = "anthropic.claude-v2"  accept = 'application/json'  contentType = 'application/json'  response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)  rv = response.get('body').read()except Exception as e:  rv = {"error": f"{e.__class__.__name__}: {str(e)}"}

DataRobot предлагает дополнительные преимущества работы, как платформа LLMOps.

  • Мониторинг моделей после развертывания
  • Среда предсказаний (Автоматическое создание образа Docker на основе вашего производственного сценария)
  • Реестр моделей
Источник: скриншот автора на DataRobot

Для возможности развертывания модели необходимо указать две функции в Jupyter Notebook: load_model() и score_unstructured(). Вы должны следовать точному формату, указанному в документации DataRobot.

Развертывание – drx v0.1.19

Развертывание любой модели в ML Ops Любая модель, созданная вне системы DataRobot, считается “Пользовательской моделью”. Если модель построена…

drx.datarobot.com

import osAWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"]AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"]def load_model():    """Пользовательская функция загрузки базы знаний."""    import boto3, json, os, sys, io    os.environ["AWS_ACCESS_KEY_ID"] = AWS_ACCESS_KEY_ID    os.environ["AWS_SECRET_ACCESS_KEY"] = AWS_SECRET_ACCESS_KEY    try:         rv = boto3.client('bedrock-runtime','us-east-1',endpoint_url='https://bedrock-runtime.us-east-1.amazonaws.com')    except Exception as e:         rv = {"error": f"{e.__class__.__name__}: {str(e)}"}    return rvdef score_unstructured(model, data, query, **kwargs):    import boto3, json, os, sys, io    """Пользовательская функция моделирования резюме с использованием LLM.    Передайте словарь данных со следующими заголовками:        job_descript: описание роли вакансии. Оно должно включать все специфические требования роли        resume: резюме в виде текста (строка)    model: клиентская модель bedrock    Возвращает:    --------    rv : str        Словарь Json с ключами:            - 'completion': главный ответ от модели Claud2            - 'stop sequence': последовательность, которая заставит модель прекратить генерацию текста    """    bedrock_runtime = model    generation_prompt_template = """    \n\nHuman: Вы - виртуальный рекрутер компании. Ваша задача - проверить резюме кандидата по описанию вакансии. Вы должны перечислить все требования из описания вакансии в своем     ответе и найти соответствующий опыт в резюме кандидата, затем присвоить шкалу соответствия (от 0 до 1). Если вы не можете найти соответствующий опыт, просто скажите, что соответствующего опыта нет, не пытайтесь придумать     ответ. Вы должны включить все требования из описания вакансии. Ответ должен быть в форме html-таблицы со строками Заголовок, Соответствующий опыт и Шкала соответствия.     <job-description>    {job_descript}    </job-description>        <candidate-resume>    {resume}    </candidate-resume>        \n\nAssistant:    """    data_dict = json.loads(data)    llm_prompt = generation_prompt_template.format(    job_descript=data_dict["job_descript"],    resume=data_dict["resume"],    )        try:        body = json.dumps({"prompt": llm_prompt, "max_tokens_to_sample": 100000,"temperature":0})        modelId = "anthropic.claude-v2"        accept = 'application/json'        contentType = 'application/json'        response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)        rv = response.get('body').read()    except Exception as e:        rv = {"error": f"{e.__class__.__name__}: {str(e)}"}    return rv

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

import datarobotx as drxdeployment = drx.deploy(    "storage/deploy/",    name="CV Screener Powered by LLM",    hooks={"score_unstructured": score_unstructured, "load_model": load_model},    extra_requirements=["boto3", "botocore", "datarobotx[llm]", "pypdf","unstructured", "awscli>=1.29.57", "datarobot-drum"],    # Переиспользуйте существующую среду, если хотите изменить код зацепки и не требуется изменение требований    environment_id="653fbe55f1c59b93ae7b4a85", )# Включите сбор данных о предсказании, необходимый для экспорта данных для целей мониторингаdeployment.dr_deployment.update_predictions_data_collection_settings(enabled=True)

Мы создали прототип с помощью Streamlit.

Источник: снимок экрана автора на его приложении Streamlit

Пример описания работы:

Мы ищем талантливых людей с отличными инженерными навыками и глубоким знанием машинного обучения, которые могут анализировать проблемы, проектировать новаторские решения и внедрять их для использования в реальном мире нашей платформы. Наши инженеры также должны поддерживать подъем всего персонала вокруг себя и вносить свой вклад в совершенство каждого инженера в организации. Вы будете помогать нам стать лучшей платформой для извлечения ценности из глубокого обучения и искусственного интеллекта.
Обязанности:
Написание поддерживаемого, тестируемого, готового к производству кода на Python;
Проектирование и создание продуктов для конечных пользователей на основе машинного обучения и генеративного искусственного интеллекта;
Интеграция алгоритмов машинного обучения с другими приложениями и сервисами;
Автоматизация процессов машинного обучения.
Основные требования:
Рекомендуемый опыт работы: 6-8 лет совместного опыта работы инженером на Python и опыта работы с машинным обучением, с акцентом на глубокое обучение;
Опыт работы с библиотеками и фреймворками глубокого обучения (TensorFlow, Keras, PyTorch и др.);
Опыт написания поддерживаемого, тестируемого, готового к производству кода на Python;
Понимание различных подходов к машинному обучению и компромиссов между ними;
Уверенное владение научным набором инструментов Python (numpy, scipy, pandas, scikit-learn);
Понимание времени, объема оперативной памяти и масштабируемости ввода-вывода в приложениях науки о данных (например, ускорение на CPU и GPU, операции со слаборазреженными матрицами, сериализация и кэширование моделей);
Навыки разработки программного обеспечения и кодирования с проверкой соответствия стандартам закодированного интеллектуального свойства;
Опыт автоматизированного тестирования и разработки, основанной на тестировании в Python;
Опыт работы с Git + GitHub;
Удобство работы с операционными системами на базе Linux.
Желательные навыки:
Опыт работы с машинным обучением в большом масштабе (наборы данных объемом 100 ГБ и более);
Опыт соревновательного машинного обучения (например, Kaggle);
Предыдущий опыт развертывания и поддержки моделей машинного обучения в производстве.
Талант и преданность наших сотрудников являются основой пути DataRobot к становлению символической компании. Мы стремимся привлечь и удержать лучшие таланты, предлагая конкурентную оплату труда и льготы, а также заботясь о благополучии наших сотрудников. Вот что может включать в себя пакет вашего вознаграждения в зависимости от вашего местоположения и местных законодательных требований: медицинская страховка, стоматологическая и зрительная страховка, гибкая программа отпусков, оплачиваемые праздники, оплачиваемый отпуск для родителей, глобальная программа помощи сотрудникам (EAP) и многое другое!

С образцом резюме представлены результаты предварительного отбора LLM.

Источник: вывод модели автора

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

https://www.canva.com/design/DAFyyWGMgmo/IOwVRtSfwpGGzhkMJpVltw/watch?utm_content=DAFyyWGMgmo&utm_campaign=designshare&utm_VoAGI=link&utm_source=editor