Skip to content
Классик AI: Cоревнование по стихотворному Искуственному Интеллекту
Branch: master
Clone or download
Latest commit 1264f1b Nov 15, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
data fix a typo in 555 item Jul 31, 2018
examples Fix long strings length (#3) Aug 13, 2018
images/sberbank-python
.gitignore
README.md

README.md

Классик AI

Материалы к конкурсу по алгоритмическому стихосложению Классик AI.

Постановка задачи

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

Рассмотрим, например, оригинальное стихотворение, известное каждому образованному соотечественнику.

Автор: М. Ю. Лермонтов

Тема: Дядя рассказывает о Бородинской битве, в которой он принимал участие, и сетует на нынешнее поколение.

Стихотворение:

Скажи-ка, дядя, ведь не даром
Москва, спаленная пожаром,
Французу отдана?
Ведь были ж схватки боевые,
Да, говорят, еще какие!
Недаром помнит вся Россия
Про день Бородина!

Как стихотворение могло бы выглядеть, если бы Лермонтов писал про "чемпионат мира по футболу", "повсеместное распространение интернета", "избавление от тяжелой работы благодаря искусственному интеллекту" и сотни других тем, которые только могут прийти в голову?

Участникам предлагается построить алгоритм, который будет генерировать короткие стихотворные произведения на произвольную тему, которая подается на вход алгоритму, в стиле 5 русских классиков (в скобках указаны идентификаторы поэтов):

  1. Пушкин, Александр Сергеевич (pushkin)
  2. Есенин, Сергей Александрович (esenin)
  3. Маяковский, Владимир Владимирович (mayakovskij)
  4. Блок, Александр Александрович (blok)
  5. Тютчев, Фёдор Иванович (tyutchev)

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

  • Шторм топит маленький кораблик
  • Музыка тихо играет вдалеке
  • Аромат спелых яблок наполнил сад
  • Я люблю Россию
  • Я поздравляю друга с днем рождения
  • Физики нашли бозон Хиггса в данных остановленного коллайдера Теватрон
  • Компании, которые не используют искусственный интеллект, в скором времени просто-напросто перестанут существовать на рынке

Разумеется, соответствие сгенерированного стихотворения стилю поэта и заданной теме — субъективно.

Алгоритм можно реализовывать на любом языке программирования, главное чтобы он имел необходимый интерфейс и производил генерацию достаточно быстро на компьютере, сравнимом по мощности со средним современным ПК. Об интерфейсе и ограничениях смотрите формат решений.

Оценка качества

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

  1. Качество стихосложения и соответствие стилю заданного классического поэта
  2. Полнота раскрытия заданной темы в стихотворении

По каждому критерию будет предоставлена 5-балльная шкала. Алгоритм должен будет сочинить стихи на каждую тему из тестового набора.

Темы, на которых будут тестироваться алгоритмы, будут составлены экспертами. Часть тем будет открыта и общедоступна, но для выявления лучшего алгоритма будет использован скрытый набор тем. Можно считать, что множества публичных и скрытых тем — однородны, получены случайным разбиением из одного набора.

Полученное в результате работы алгоритма стихотворение может быть отклонено разметчиками по следующим причинам:

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

В случае отклонения стихотворения алгоритм получает минимальные оценки по обоим шкалам.

Участникам будет доступно API, через которое можно получить детальный отчет о проверке и разметке всех стихотворений.

Данные

Участникам предоставляется собрание сочинений выбранных классических авторов. В файле data/classic_poems.json в формате JSON представлен список стихотворений с указанием идентификаторов авторов:

[
    {
        "poet_id": "pushkin",
        "title": "Памятник",
        "content": "Я памятник себе воздвиг нерукотворный,\nК нему не зарастет народная тропа,..."
    },
    {
        "poet_id": "blok",
        "title": "* * *",
        "content": "Ночь, улица, фонарь, аптека,\nБессмысленный и тусклый свет..."
    },
    ...
]

В конкурсе допускается свободное использование любых других общедоступных материалов.

Что может пригодиться:

Формат решений

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

Пример архива с решением:

Содержимое контейнера

В корне архива обязательно должен быть файл metadata.json следующего содержания:

{
    "image": "sberbank/python",
    "entry_point": "python generator.py"
}

Здесь image — поле с названием docker-образа, в котором будет запускаться решение, entry_point — команда, при помощи которой запускается решение. Для решения текущей директорией будет являться корень архива.

Для запуска решений можно использовать существующие окружения:

  • sberbank/python — Python3 с установленным большим набором библиотек (подробнее)
  • gcc - для запуска компилируемых C/C++ решений (подробнее здесь)
  • node — для запуска JavaScript
  • openjdk — для Java
  • mono — для C#

Подойдет любой другой образ, доступный для загрузки из DockerHub. При необходимости, Вы можете подготовить свой образ, добавить в него необходимое ПО и библиотеки (см. инструкцию по созданию Docker-образов); для использования его необходимо будет опубликовать на DockerHub.

Программный интерфейс

Решение должно быть выполнено в виде HTTP-сервера, доступного по порту 8000, который отвечает на два вида запросов:

GET /ready

На запрос необходимо ответить кодом 200 OK в случае, если решение готово к работе. Любой другой код означает, что решение еще не готово. У алгоритма есть ограниченное время на подготовку к работе, за которое можно прочитать данные с диска, создать в оперативной памяти необходимые структуры данных.

POST /generate/<poet_id>

Запрос на генерацию стихотворения. Идентификатор поэта, в стиле которого необходимо сочинить, указан в URL. Содержимое запроса — JSON с единственным полем seed, содержащим тему сочинения:

{"seed": "регрессия глубокими нейронными сетями"}

В качестве ответа необходимо в отведенное время дать JSON со сгенерированным сочинением в поле poem:

{"poem": "Ведь были сети боевые\nДа говорят еще какие\n..."}

Запрос и ответ должны иметь Content-Type: application/json. Рекомендуется использовать кодировку UTF-8.

Ограничения

Контейнер с решением запускается в следующих условиях:

  • решению доступны ресурсы
    • 16 Гб оперативной памяти
    • 4 vCPU
    • GPU Nvidia K80
  • решение не имеет доступа к ресурсам интернета
  • решению в каталоге /data/ доступны общие наборы данных
  • время на подготовку к работе: 120 секунд (после чего на запрос /ready необходимо отвечать кодом 200)
  • время на один запрос /generate/: 5 секунд
  • решение должно принимать HTTP запросы с внешних машин (не только localhost/127.0.0.1)
  • при тестировании запросы производятся последовательно (не более 1 запроса одновременно)
  • максимальный размер упакованного и распакованного архива с решением: 10 Гб

Сгенерированное стихотворение (poem) должно удовлетворять формату:

  • размер стиха — от 3 до 8 строк
  • каждая строка содержит не более 120 символов
  • строки разделяются символом \n
  • пустые строки игнорируются

Тема сочинения (seed) по длине не превышает 1000 символов.

При тестировании используются стили только 5 перечисленных выше избранных поэтов.

Пример работы

При помощи Python 3 и библиотеки requests.

>>> import requests
>>> requests.get('http://localhost:8000/ready')
<Response [200]>
>>> resp = requests.post('http://localhost:8000/generate/lermontov', json={'seed': 'регрессия глубокими нейронными сетями'})
>>> resp
<Response [200]>
>>> data = resp.json()
>>> print(data['poem'])
Ведь были сети боевые
Да говорят еще какие
Не даром помнит регрессия
Про то какая глубина

Примеры решений

В каталоге examples можно найти примеры решений, готовые к отправке в систему.

Отправка решения в систему

При отправке ZIP-файла в систему, решение попадает в очередь на запуск (статус queued), через некоторое время запускается тестирование (статус running).

Лимиты по числу решений на команду:

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

Система запускает контейнер, ждет готовности (/ready 200), после чего начинает по одному делать запросы.

Первыми идут проверочные запросы по темам, которые перечислены в начале этого документа в качестве примера. В случае, если программный код завершается с ошибкой во время проверочных запросов, то у участника есть возможность видеть отладочную информацию: на каком примере произошла проблема, отладочный вывод программы (stdout/stderr). Если все проверочные примеры пройдены успешно, то решению подаются тестовые примеры. В случае ошибки на тестовых примерах, никакой дополнительной информации кроме кода ошибки с пометкой [test] участнику не предоставляется.

Если все запросы пройдены успешно, то решение ставится в очередь на ручное оценивание: статус assessment.

Типичные проблемы

Отправка RAR-архива вместо ZIP

Приводит к результату error: bad zip archive. Допускается отправка только архивов в формате ZIP.

Сгенерированное стихотворение не удовлетворяет формату

Ошибка error: incorrect poem format означает что одно из сгенерированных стихотворений не удовлетворяет ограничениям. Добавляйте проверки в решение. Выход алгоритма всегда должен удовлетворять ограничениям. В случае, если хотя бы на одном тесте это не так — алгоритм не принимается к проверке.

Решение не отвечает на HTTP-запрос из-за ошибки

Ошибка error: generate status 500 означает что веб-сервер не смог сформировать ответ из-за ошибки вернул HTTP status 500 "Internal server error". В случае, если такое происходит не на тестовом примере, есть возможность увидеть stdout/stderr в котором может содержаться Traceback.

Обработка не всех поэтов

Для каждого из 5 перечисленных выше поэтов (pushkin, esenin, mayakovskij, blok, tyutchev) решение должно успешно генерировать стихотворение, во время проверки производятся запросы по всем поэтам. Убедитесь, что решение не ломается при выборе одного из поэтов, а написания идентификаторов poet_id — правильны.

Отсутствие Python-пакетов

Убедитесь, что все используемые в решении библиотеки установлены в используемый Docker-образ. Если используете окружение sberbank/python, то перечень всех установленных в нем библиотек можно посмотреть в файлах pip_freeze.txt и conda_list.txt.

Если какой-то библиотеки не хватает, то ее можно доустановить. Для этого нужно сделать следующее:

  1. Установить Docker, создать аккаунт на DockerHub
  2. Дописать в Dockerfile что-то вроде RUN pip install mypackage mypackage2
  3. Находясь в каталоге sberbank-python, выполнить в консоли команду docker build -t myname/classic-python .
  4. Загрузить собранный образ в репозиторий docker push myname/classic-python
  5. Использовать свой образ, вместо предлагаемого организаторами (прописать его в metadata.json)

Прием входящих HTTP-соединений только на localhost (127.0.0.1)

Контейнеру с решением во время проверки поступают запросы с внешних (для контейнера) IP адресов, поэтому необходимо сделать так, чтобы веб-сервер слушал соединения со всех возможных IP адресов.

Вот так нужно запускать Flask-сервер:

app.run(host='0.0.0.0', port=8000)

Неверный формат JSON в ответе от сервера

Для записи JSON рекомендуется использовать библиотеки, следующие стандарту. Например, символы переноса строки не допускаются внутри JSON документа, должны быть экранированы в последовательность \n.

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.