На прошлой неделе компания OpenAI, занимающаяся искусственным интеллектом, выпустила Codex, новую платформу, основанную на глубоком обучении, которая автоматически пишет полностью функционирующий программный код. Система, которая была обучена на обширном корпусе общедоступного кода, первоначально была представлена как часть Copilot в GitHub, функции, которая помогает программистам автоматически улучшать или обновлять свое программное обеспечение.
Codex основан на чрезвычайно успешном GPT-3 от OpenAI. Когда я тестировал GPT-3 в прошлом году, я чувствовал себя свидетелем технологической революции. Система может генерировать все, от полностью готовых сообщений в блогах до песен, рецептов — даже поговорок. Многие тестировщики GPT-3 также отметили, что он часто может писать код на таких языках, как Python и JavaScript.
OpenAI воспользовался этой возможностью, разработав новую версию GPT-3, которая была специально обучена на коде и оптимизирована для его создания. Результат — Codex. Меня пригласили на бета-тестирование новой системы примерно через неделю после ее запуска, и с тех пор я постоянно тестирую Codex. Платформа является эволюцией GPT-3, и ее результаты пугающе хороши. Вот мои мысли и выводы после нескольких дней работы с Codex.
Я начал тестирование Codex, используя задачи программирования Python из Hacker Rank. Эти задачи призваны помочь программистам подготовиться к собеседованию. Это простые, ограниченные проблемы, которые вы можете найти на вводном курсе Python или которые вас могут попросить решить, если вы подадите заявку на вакансию программиста в такой компании, как Yelp или Box.
Codex быстро справился с простыми задачами, например, с разделением и соединением строк. Я дал ему подсказку:
#Python 2.7 #You are given a string. Split the string on a ” ” (space) delimiter and join using a — hyphen.
И он выдал функцию Python, которую я вставил в свою Aptana Python IDE. Я сделал одно обновление вывода Codex, заменив input() на raw_input().
Функция действительно берет строку, разбивает ее по каждому пробелу и соединяет текст дефисами. Когда я предоставил строку «Это тест», она напечатала «This-is-a-test». Автоматически сгенерированный код Codex прошел тест Hacker Rank.
Это элементарные вещи. Но Codex также успешно справился с гораздо более сложной задачей из Hacker Rank, которая включала в себя написание двух регулярных выражений для проверки почтовых индексов и которая, по словам Hacker Rank, была «сложной» для программистов. Для этой задачи я просто передал Codex подсказку прямо из Hacker Rank и отправил его работать. Через несколько секунд появилось два регулярных выражения.
Я вставил их в Hacker Rank, и сайт подтвердил, что регулярные выражения работают отлично. Было жутко наблюдать, как система за две секунды собирает решение, на разработку которого у меня ушел бы час или больше.
Один вопрос, на который мне указал подписчик на моем канале YouTube, заключается в том, действительно ли Codex пишет свои собственные решения для этих простых проблем или просто выплевывает существующие результаты из полученных на обучении данных. Честно говоря, вполне возможно, что это так и есть, что это способ работы системы над простыми проблемами — программисты обычно сами берут целые функции из открытого исходного кода. Возможно, что, когда решение достаточно простое и уже существует где-то открытый код, то Codex делает тоже самое.
Какими бы ни были методы, Codex явно умеет решать четко определенные программные задачи. Если вы дадите ему задания из собеседования для начинающих программистов или вопросы из экзамена по информатике, он, скорее всего, решит их с честью. Это впечатляет, учитывая, что система начинается с ввода простого текста.
Однако мне было интересно, как Codex будет работать в реальном мире — и как он справится с совершенно новыми проблемами, которые я решал сам, а не с теми, которые могли быть в его обучающих данных. Многие задачи программирования в реальных бизнес-средах включают доступ к данным и манипулирование ими, а не выполнение базовых вещей, таких как проверка чисел или преобразование строк.
Согласно OpenAI, Codex может получить доступ к различным API и выполнять полезные манипуляции с данными. Я решил проверить это, решив проблему, которая весьма актуальна здесь, в Калифорнии: получение индекса качества воздуха для города на основе его почтового индекса, чтобы проверить наличие дыма от лесных пожаров.
Для этого я дал Codex следующую подсказку:
#Python 2.7 #Use the airnow API to to find and print the current AQI for zip code 94549
Он вернул код:
Это потрясающий результат. Основываясь только на моей текстовой ссылке на Airnow API, Codex определил URL интерфейса и параметры, которые необходимо было использовать, чтобы получить полезный результат. Он также правильно определил, что такое AQI, и написал строку URL-адреса, которая действительно использует почтовый индекс 94549, получает текущие условия в этом районе и возвращает текущий AQI.
Чтобы на выходе получался настоящий результат, Codex затем обернул свою функцию некоторыми базовыми операциями Python для доступа к URL-адресу и форматирования ответа JSON из Airnow API. Была только одна проблема — созданный Codex ключ API, который используется для входа в API через учетную запись пользователя, — был полностью придуман.
Я столкнулся с этой проблемой и с GPT-3. Система с радостью соберет факты, цитаты или даже ссылки на научные статьи, которых не существует. С GPT-3 эти фактические ошибки бывает трудно обнаружить, потому что они выглядят очень реальными и небрежно выводятся системой без проверки. По крайней мере, с кодом есть простая проверка правильности вывода: компилируется и запускается ли он? В моем случае я запустил код и получил ошибку аутентификации от Airnow API. Чтобы исправить это, я подал заявку на получение собственного, настоящего токена аутентификации. Когда я вставил его в код Codex, он сработал отлично и выдал текущий AQI для моего почтового индекса.
Codex не ограничивается написанием кода на стороне сервера. Он также может писать код на веб-языках, таких как JavaScript, и даже создавать базовый дизайн. Чтобы проверить эту возможность, я запустил специальную песочницу для JavaScript, которую OpenAI предоставляет для бета-тестеров. Затем я дал ему команду получить данные о текущей цене биткойнов, а также отформатировать и отобразить результаты.
Получи текущую цену биткойнов с помощью Coindesk API и отобрази ее в виде гигантских красных букв в середине веб-страницы.
Codex сгенерировал необходимый JavaScript:
Затем он создал простой веб-сайт, который выполняет именно то, что я просил:
Опять же, это относительно простой пример, но демонстрационное видео из OpenAI показывает, как возможности веб-разработки Codex могут быть использованы для гораздо более сложных задач. В видеоролике OpenAI использует свою систему для создания полностью функционирующей игры на JavaScript с участием космических кораблей и астероидов, просто вводя описания каждой игровой функции и позволяя Codex писать основной код.
Помимо написания нового кода, Codex также может описывать и комментировать существующий код. Чтобы проверить это, я передал системе фрагмент кода Python из кодовой базы моей компании, который мы используем для скачивания файлов из URL-адреса. Когда я попросил Codex объяснить, что делает код, он написал, что функция «загружает файл по определенному URL-адресу и сохраняет его по определенному локальному пути». Это прекрасное, хотя и немного странное, описание.
Способность объяснять вещи простым языком, вероятно, исходит непосредственно от родительской платформы Codex GPT-3. Легко представить, насколько полезной может быть эта функция для программиста. Представьте, что вы пытаетесь обновить старый проект с открытым исходным кодом, а для него нет документации. Вы можете вставить каждую функцию в Codex и позволить системе выяснить, что делает код, а затем объяснить это вам простым языком.
Как отмечает Wired, эта функция также будет чрезвычайно полезна для людей, обучающихся программированию. Они могли вставить сбивающую с толку функцию и быстро получить четкое описание того, как она работает. Можно даже представить, что Codex автоматически пишет документацию для существующей кодовой базы компании или проекта с открытым исходным кодом. Многие программисты ненавидят писать документацию, и в результате большая часть мирового кода оказывается недокументированной. Это затрудняет обновление и сопровождение кода, а новым программистам становится сложнее присоединиться к проекту и понять, как работает кодовая база. Codex может автоматически исправить этот недостаток документации.
В моем тестировании система преуспела и в автоматизации других скучных, но важных задач программирования. Я дал Codex кусок кода Python и попросил его перевести код в JavaScript. Он справился с этим отлично, сгенерировав JavaScript, который работал без проблем. Поддержание устаревшего кода может быть очень дорогим. С помощью Codex компания может взять базу кода, написанную на устаревшем языке, и автоматически обновить ее до современного языка, потенциально сэкономив тысячи или миллионы в затратах на ее поддержку.
Обновление старого кода также может принести большую пользу сообществу. В начале пандемии Департамент развития занятости Калифорнии испытывал большие проблемы с распределением пособий по безработице, потому что они все еще использовали устаревшие компьютерные системы 1980-х годов. Автоматическое обновление старого кода может упростить работу правительственных систем и сэкономить миллионы долларов налогоплательщиков, а также сделать критически важные системы более безопасными. Проект с открытым исходным кодом также может использовать Codex для дополнительных обновлений, например, для переноса своей кодовой базы с Python 2.7 на Python 3.
Следует ли программистам опасаться за свою работу, учитывая замечательные способности Codex? Нет. Хотя Codex мощный, он несовершенен. Согласно OpenAI, текущая версия системы пишет безупречный код с первой попытки только в 37% случаев. Чтобы сделать вывод системы по-настоящему полезным, программисту-человеку все равно необходимо его просмотреть, оценить, хорошо ли работает вывод, и внести небольшие изменения и обновления, когда это не так.
Я убедился в этом на собственном примере. Функция input() некорректно работала в моей среде IDE, поэтому код преобразования строк Codex не работал. Основываясь на моем опыте работы с Python и на сообщении об ошибке, которое я увидел при попытке запустить код, я сразу понял, что raw_input () будет работать лучше. Это было простое, но существенное изменение. Однако важно отметить, что это было изменение, о котором даже не подозревал бы непрограммист. Результаты работы Codex впечатляют. Но в большинстве случаев он делает небольшие ошибки, а знающий человек должен вмешаться, чтобы исправить их.
Помимо исправления мелких ошибок, есть гораздо более фундаментальная причина, по которой Codex не заменит людей-программистов. Написание кода — это лишь крошечная часть программирования. Самая важная работа программиста — понять проблему и перевести ее в формат, понятный компьютеру. Как говорит сам OpenAI:
Как только программист знает, что строить, процесс написания кода можно рассматривать как (1) разбиение проблемы на более простые задачи и (2) сопоставление этих простых проблем с существующим кодом.
Codex может помочь с последним, но первое по-прежнему остается очень человеческой сферой. Определение проблемы, сокращение ее до основных компонентов и преобразование этих компонентов в конкретные инструкции отнимают большую часть времени опытного программиста. Точно так же, как следование рецепту Food Network из Интернета не делает вас шеф-поваром и обладателем звезды Мишлен, так и создание красивого кода на Python не делает вас программистом. Пока Codex не сможет сесть с клиентом или покупателем, понять их потребности, разработать техническое решение, разбить его на составные части и выработать четкий план решения каждой части, он проигрывает человеку.