Giter Club home page Giter Club logo

ai-journey-2019's Introduction

AI Journey 2019

Соревнование исскусственных интеллектов, автоматически решающих задачи из школьной программы.

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

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

Формат данных

Экзаменационный билет передается решению в формате JSON. Объект экзаменационного билета содержит поле tasks со списком заданий.

Объекты задания состоят из следующих полей:

  • id: Идентификатор задания.
  • text: Текст задания. Возможно использование markdown-style форматирования. Внутри текста могут содержаться ссылки на прикрепленные файлы, например — графические иллюстрации к заданию.
  • attachments: Набор прикрепленных файлов (с указанием id, mime-type).
  • meta: Метаинформация. Произвольные пары ключ-значение. Предназначено для указания структурированных данные о вопросе. Пример: категория или подтип вопроса, источник вопроса, предмет экзамена, из которого пришел вопрос.
  • answer: Описание формата, в котором необходимо дать ответ. Допускаются разные типы ответов, каждый из которых имеет свои дополнительные параметры и поля:
    • choice: выбор одного варианта из списка
    • multiple_choice: выбор подмножества вариантов из списка
    • order: расстановка вариантов в правильном порядке
    • matching: верное соотнесение объектов из двух множеств
    • text: ответ в виде произвольного текста
  • score: Максимальное количество баллов за задание.

Подробные пояснения с примерами.

Результат работы алгоритма записывается в виде объекта с одним полем answers — словарем, в котором ключи соответствуют идентификатору задания id, а значения — ответами на задание в соответствующем формате.

Пример

Пример экзаменационного билета:

{
  "tasks": [
    {
      "id": "literature_3",
      "meta": {
        "language": "ru",
        "source": "ege_literature"
      },
      "text": "Сопоставьте имена и фамилии классических русских писателей.",
      "attachments": [],
      "answer": {
        "type": "matching",
        "left": [
          {"id": "A", "text": "Пушкин"},
          {"id": "B", "text": "Тургенев"},
          {"id": "C", "text": "Набоков"}
        ],
        "choices": [
          {"id": "1", "text": "Иван"},
          {"id": "2", "text": "Петр"},
          {"id": "3", "text": "Александр"},
          {"id": "4", "text": "Владимир"},
        ]
      }
    },
    ...    
  ]
}

Пример объекта с ответами:

{
  "answers": {
    "literature_3": {"A": "3", "B": "1", "C": "4"},
    ...
  }
}

Тестовые данные

Участникам предоставляется тестовый набор экзаменационных вариантов, собранных из открытых источников.

Каталог с данными data/check

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

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

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

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

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

{
    "image": "sberbank/python",
    "entry_point": "python server.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 /take_exam

Запрос на решение экзаменационного билета. Тело запроса — JSON объект экзаменационного билета в описанном выше формате.

На запрос необходимо ответить кодом 200 OK и вернуть JSON-объект с ответами на задания.

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

В процессе тестирования решения, запрос /take_exam может выполняться последовательно множество раз. Гарантируется, что одновременно решение может получить не более одного запроса /take_exam. Т.е. до тех пор, пока решение не ответит на текущий экзаменационный билет, новых запросов поступать не будет. Время выполнения запроса ограничено.

Ограничения

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

  • решению доступны ресурсы
    • 16 Гб оперативной памяти
    • 4 vCPU
  • решение не имеет доступа к ресурсам интернета
  • время на подготовку к работе: 10 минут (после чего на запрос /ready необходимо отвечать кодом 200)
  • время на один запрос /take_exam: 30 минут
  • решение должно принимать HTTP запросы с внешних машин (не только localhost/127.0.0.1)
  • во время тестирования запросы производятся последовательно (не более 1 запроса одновременно)
  • максимальный размер упакованного и распакованного архива с решением: 20 Гб
  • максимальный размер используемого Docker-образа: 20 Гб

Пример запуска решения

Запускаем решение base-python:

$ python3 server.py
 * Serving Flask app "server" (lazy loading)
 * Environment: production
 * Debug mode: off

При помощи Python 3 и библиотеки requests делаем запросы.

>>> import json
>>> import requests
>>> with open('data/check/test_00.json') as fin:
...    exam_ticket = json.load(fin)
>>> requests.get('http://localhost:8000/ready')
<Response [200]>
>>> resp = requests.post('http://localhost:8000/take_exam', json=exam_ticket)
>>> resp
<Response [200]>
>>> resp.json()
{'answers': {
  '1': ['3', '2', '4', '1', '5'],
  '2': 'стоять',
  ...
}}

ai-journey-2019's People

Contributors

ksanvat avatar romovpa avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.