В НАСТОЯЩЕЕ ВРЕМЯ СУЩЕСТВУЕТ большой интерес к инструментам искусственного интеллекта, предназначенным для помощи программистам в написании программного обеспечения. Copilot от GitHub и CodeWhisperer от Amazon применяют методы глубокого обучения , изначально разработанные для генерации текста на естественном языке, путем адаптации его для генерации исходного кода. Идея состоит в том, что программисты могут использовать эти инструменты как своего рода автозаполнение на стероидах, используя подсказки для создания фрагментов кода, которые разработчики могут интегрировать в свое программное обеспечение.
Глядя на эти инструменты, я задавался вопросом: можем ли мы сделать следующий шаг и исключить человека-программиста из цикла ? Можно ли написать рабочую программу и развернуть ее по требованию одним нажатием кнопки?
В своей основной работе я пишу встроенное программное обеспечение для микроконтроллеров, поэтому я сразу же подумал о автономном портативном устройстве в качестве демонстрационной платформы. Экран и несколько элементов управления позволят пользователю запрашивать и взаимодействовать с простым программным обеспечением, созданным искусственным интеллектом. Так родилась идея бесконечного понга .
Я выбрал Pong по ряду причин. Геймплей прост, как известно, на оригинальном аркадном автомате Pong 1972 года от Atari торжествует лаконичность : «Избегайте пропуска мяча, чтобы набрать больше очков». Кнопка «вверх» и «вниз» — это все, что нужно для игры. Как и многие классические игры Atari, созданные в 1970-х и 1980-х годах, Pong можно написать с помощью относительно небольшого количества строк кода, и она много раз применялась как упражнение по программированию. Это означает, что репозитории исходного кода, полученные в качестве обучающих данных для инструментов ИИ, богаты примерами Pong , что увеличивает вероятность получения жизнеспособных результатов.
Я использовал Raspberry Pi Pico W за 6 долларов США в качестве ядра своего портативного устройства — его встроенная беспроводная связь обеспечивает прямое подключение к облачным инструментам искусственного интеллекта. К нему я прикрепил дисплейный модуль Pico LCD 1.14 за 9 долларов . Его 240 x 135 цветных пикселей достаточно для Pong , а модуль объединяет две кнопки и двухосевой микроджойстик.
В качестве языка программирования для Pico я выбрал MicroPython , потому что я обычно использую его, а также потому, что это код интерпретируемого языка, который можно запускать без компилятора на базе ПК. Инструментом кодирования ИИ, который я использовал, был OpenAI Codex . Доступ к Кодексу OpenAI можно получить через API, который отвечает на запросы с использованием веб-формата HTTP , которые легко создавать и отправлять с помощью библиотек urequests и ujson , доступных для MicroPython. Использование OpenAI Codex API бесплатно в течение текущего периода бета-тестирования, но требуется регистрация, а запросы ограничены 20 в минуту — этого более чем достаточно, чтобы удовлетворить даже самого фанатичного жокея Pong .Следующим шагом было создание контейнерной программы. Эта программа отвечает за обнаружение, когда новая версия Pong запрашивается нажатием кнопки, и когда она отправляет приглашение в Кодекс OpenAI, получает результаты и запускает игру. Программа-контейнер также устанавливает уровень аппаратной абстракции, который управляет физическим соединением между Pico и ЖК-дисплеем/модулем управления.
Самым важным элементом всего проекта было создание подсказки, которая передается в OpenAI Codex каждый раз, когда мы хотим, чтобы он выдал новую версию Pong . Приглашение представляет собой кусок простого текста с минимальным скелетом исходного кода — несколько строк, описывающих структуру, общую для многих видеоигр, а именно список библиотек, которые мы хотели бы использовать, и вызов для обработки событий (таких как нажатия клавиш). ), вызов для обновления состояния игры на основе этих событий и вызов для отображения обновленного состояния на экране.
Код, который возвращается, создает работоспособную игру в понг примерно в 80% случаев.
Как использовать эти библиотеки и заполнять вызовы, зависит от ИИ. Ключом к превращению этой универсальной структуры в игру Pong являются встроенные комментарии — необязательные в исходном коде, написанном людьми, но очень полезные в подсказках. Комментарии описывают игровой процесс на простом английском языке, например: «В игре есть следующие классы… Мяч: этот класс представляет мяч. У него есть позиция, скорость и атрибуты отладки [так в оригинале]. Pong: Этот класс представляет саму игру. У него две ракетки и мячик. Он знает, как проверить, когда игра окончена». (Мой контейнер и код подсказки доступны на Hackaday.io ) (Перейдите на Hackaday.io , чтобы сыграть в бесконечное количество Pong игры с Raspberry Pi Pico W; мой контейнер и код подсказки находятся на сайте.)
ИИ возвращает около 300 строк кода. В моих первых попытках код не отображал игру, потому что версия библиотеки кадрового буфера MicroPython , которая работает с моим модулем, отличается от библиотек кадровых буферов, на которых обучался OpenAI Codex. Решение состояло в том, чтобы добавить описания методов, которые использует моя библиотека, в качестве подсказок, например: «def прямоугольник(self, x, y, w, h, c)». Другая проблема заключалась в том, что во многих обучающих примерах использовались глобальные переменные, тогда как в моем первоначальном запросе переменные определялись как атрибуты, предназначенные для жизни внутри отдельных классов, что, как правило, является лучшей практикой. В конце концов мне пришлось сдаться, плыть по течению и объявить свои переменные глобальными.
Код, который возвращается из моей текущей подсказки, создает работоспособную игру Pong примерно в 80 процентах случаев. Иногда игра вообще не работает, а иногда выдает что-то, что работает, но не совсем Pong , например, когда она позволяет перемещать ракетки влево и вправо в дополнение к движениям вверх и вниз. Иногда это два игрока-человека, а иногда вы играете против машины. Поскольку это не указано в подсказке, Codex принимает любой из двух вариантов. Когда вы играете против машины, всегда интересно посмотреть, как Codex реализует эту часть логики кода.
Так кто же автор этого кода? Конечно, существуют юридические споры, связанные , например, с тем, как следует лицензировать этот код, поскольку большая часть обучающего набора основана на программном обеспечении с открытым исходным кодом, которое налагает определенные условия лицензирования на полученный из него код. Но лицензии и право собственности отделены от авторства, и что касается последнего, я считаю, что оно принадлежит программисту, который использует инструмент ИИ и проверяет результаты, как это было бы в случае, если вы создали произведение искусства с помощью программы для рисования, созданной компанией, и использовали свои кисти и фильтры.