Данное задание требует реализовать вычленение текста по шаблону и по максимальному правдоподобию. Я решил написать python программу, которая использует готовые датасеты с городами СНГ и ищет в тексте сообщения токен максимально похожий на один из городов.
Суммарный объём всех датасетов составляет около 60кб, что ничтожно мало по сравнению с весом любой LLM. Более того, LLM будет работать на порядок медленнее, поскольку даже один токенайзер использует словарь объёма несколько мегабайт, соответственно разбиение токенайзером уже займёт гораздо больше времени, чем сравнение всех слов сообщения со всеми городами в датасетах.
В виду этого, посчитал использование LLM в рамках данного задания нецелесообразным.
В качестве источника названий городов я создал у себя БД
Для того, чтобы города с очень коротким названием не давали более хорошую метрику я удалил из датасетов города, где длина названия менее 4 символов.
Текст дробится на токены (слова)
Для каждого токена проверяем - есть ли он в датасете и в словаре доп.слов (СПБ, НСК, Сиб и т.д.). Если да - возвращаем город
Если совпадений нет - берём по минимальному расстоянию Хэмминга
От сервиса нам хотелось бы получать генерацию относительно креативных поздравлений, к тому же с различным выходом от вызова к вызову. Здесь как раз подойдёт генеративная LLM-модель. Более того, мне очень хотелось попробовать с такими поработать.
Я выбрал открытую, основанную на архитектуре GPT-2 модель от сбера - ruGPT3Large (Меня тоже смутило GPT3 в названии модели, на самом деле она основана на GPT2). В библиотеке transformers с huggingface она соответствует классу GPT2LMHeadModel. Больше информации об открытых моделях сбера, можно посмотреть на их официальном GitHub
В качестве back-end фреймворка использовал fast-api+pydantic. Для работы с моделью - pytorch + transformers. Принцып работы простой - подгрузка модели, затем использование её инференса в рамках сервиса. В результате возвращаем выход модели с удалённым запросом (который пользователь указал в начале), чтобы оставить только новый сгенерированный моделью текст.
Приложение может принимает на вход два основных параметра - название праздника и имя поздравляемого. Также опционально можно указать длину генерируемой последовательности и динамичность генерации (под капотом - регулировка параметров top_k и top_p).
Сервис выдаст вариативное поздравление человека с указанным праздником.
Для начала требуется склонировать репозитории в директорию с проектом:
cd project_dir
git clone https://github.com/myPar/DC_test.git
Переходим в папку с проектом, открываем командную строку и набираем следующую команду:
docker-compose build
Она запустит построение docker-контейнеров и результатом будет мульти-контейнерное приложение, содержащее 2 docker-контейнера: с fast-api сервисом для поздравлений и python-приложением для угадывания городов.
Для запуска построенного мульти-контейнерного приложения используем команду:
docker-compose up
Сервис для поздравлений содержит 1-енд пойнт:
HTTP method: POST
Body:
{
"holiday_name": "Новый год",
"person_name": "Петя",
"max_length": 60,
"flexibility": "NORMAL"
}
последние два поля - не обязательны. Если не указаны, будут установлены значения по умолчанию.
{
"holiday_name": "День рождения",
"person_name": "Петя"
}
и так тоже можно:
{
"holiday_name": "День рождения",
"person_name": "Петя",
"max_length": 100
}
response:
{
"request_text": "Сгенерируй поздравление с 'Днём рождения' для Пети:",
"generated_text": "\n\n\t\tПетя, ты родился в День Рожденья!\n\t\t Поздравляем тебя от всей души!\n\t\t Поздравляем и желаем долгих лет жизни!\n\t\t\n\t\tПусть у тебя всегда будет день рожденья —\n\t\t Веселый, радостный, весёлый!\n И пусть тебе никогда не надоест жить на белом свете!\n\n\n*"
}
Сервис для поиска городов требуется запустить отдельной командой внутри его контейнера:
docker run -it dc_test-get-city-service python /get_city_service/main.py
Также, можете отдельно запустить baseline для создания результирующего датасета data.csv
Видео с демонстрацие работы можно посмотреть по ссылке: https://drive.google.com/file/d/1c-o7HW-dM0uqj1vxyEAnW4jsM4J1n4rZ/view?usp=drive_link
6 commits
Jupyter Notebook
59.0%
Python
37.1%
Dockerfile
3.9%
Данное задание требует реализовать вычленение текста по шаблону и по максимальному правдоподобию. Я решил написать python программу, которая использует готовые датасеты с городами СНГ и ищет в тексте сообщения токен максимально похожий на один из городов.
Суммарный объём всех датасетов составляет около 60кб, что ничтожно мало по сравнению с весом любой LLM. Более того, LLM будет работать на порядок медленнее, поскольку даже один токенайзер использует словарь объёма несколько мегабайт, соответственно разбиение токенайзером уже займёт гораздо больше времени, чем сравнение всех слов сообщения со всеми городами в датасетах.
В виду этого, посчитал использование LLM в рамках данного задания нецелесообразным.
В качестве источника названий городов я создал у себя БД
Для того, чтобы города с очень коротким названием не давали более хорошую метрику я удалил из датасетов города, где длина названия менее 4 символов.
Текст дробится на токены (слова)
Для каждого токена проверяем - есть ли он в датасете и в словаре доп.слов (СПБ, НСК, Сиб и т.д.). Если да - возвращаем город
Если совпадений нет - берём по минимальному расстоянию Хэмминга
От сервиса нам хотелось бы получать генерацию относительно креативных поздравлений, к тому же с различным выходом от вызова к вызову. Здесь как раз подойдёт генеративная LLM-модель. Более того, мне очень хотелось попробовать с такими поработать.
Я выбрал открытую, основанную на архитектуре GPT-2 модель от сбера - ruGPT3Large (Меня тоже смутило GPT3 в названии модели, на самом деле она основана на GPT2). В библиотеке transformers с huggingface она соответствует классу GPT2LMHeadModel. Больше информации об открытых моделях сбера, можно посмотреть на их официальном GitHub
В качестве back-end фреймворка использовал fast-api+pydantic. Для работы с моделью - pytorch + transformers. Принцып работы простой - подгрузка модели, затем использование её инференса в рамках сервиса. В результате возвращаем выход модели с удалённым запросом (который пользователь указал в начале), чтобы оставить только новый сгенерированный моделью текст.
Приложение может принимает на вход два основных параметра - название праздника и имя поздравляемого. Также опционально можно указать длину генерируемой последовательности и динамичность генерации (под капотом - регулировка параметров top_k и top_p).
Сервис выдаст вариативное поздравление человека с указанным праздником.
Для начала требуется склонировать репозитории в директорию с проектом:
cd project_dir
git clone https://github.com/myPar/DC_test.git
Переходим в папку с проектом, открываем командную строку и набираем следующую команду:
docker-compose build
Она запустит построение docker-контейнеров и результатом будет мульти-контейнерное приложение, содержащее 2 docker-контейнера: с fast-api сервисом для поздравлений и python-приложением для угадывания городов.
Для запуска построенного мульти-контейнерного приложения используем команду:
docker-compose up
Сервис для поздравлений содержит 1-енд пойнт:
HTTP method: POST
Body:
{
"holiday_name": "Новый год",
"person_name": "Петя",
"max_length": 60,
"flexibility": "NORMAL"
}
последние два поля - не обязательны. Если не указаны, будут установлены значения по умолчанию.
{
"holiday_name": "День рождения",
"person_name": "Петя"
}
и так тоже можно:
{
"holiday_name": "День рождения",
"person_name": "Петя",
"max_length": 100
}
response:
{
"request_text": "Сгенерируй поздравление с 'Днём рождения' для Пети:",
"generated_text": "\n\n\t\tПетя, ты родился в День Рожденья!\n\t\t Поздравляем тебя от всей души!\n\t\t Поздравляем и желаем долгих лет жизни!\n\t\t\n\t\tПусть у тебя всегда будет день рожденья —\n\t\t Веселый, радостный, весёлый!\n И пусть тебе никогда не надоест жить на белом свете!\n\n\n*"
}
Сервис для поиска городов требуется запустить отдельной командой внутри его контейнера:
docker run -it dc_test-get-city-service python /get_city_service/main.py
Также, можете отдельно запустить baseline для создания результирующего датасета data.csv
Видео с демонстрацие работы можно посмотреть по ссылке: https://drive.google.com/file/d/1c-o7HW-dM0uqj1vxyEAnW4jsM4J1n4rZ/view?usp=drive_link
6 commits
Jupyter Notebook
59.0%
Python
37.1%
Dockerfile
3.9%