Нейросети пишут код: Янник Килчер разобрал презентацию OpenAI и плагин Tabnine

Yannic Kilcher 91,4 тыс. 11 мин 5 мин 21.05.2020
Главное

На конференции MSBuild компания OpenAI продемонстрировала прототип модели машинного обучения на базе архитектуры GPT-2, способной генерировать корректный код на языке Python. Популярный ИИ-исследователь Янник Килчер (Yannic Kilcher) подробно разобрал представленные технологические примеры, проанализировал логику работы нейросети и протестировал доступные коммерческие альтернативы. Автор пришёл к выводу, что индустрия стоит на пороге масштабных изменений в сфере автоматизации разработки.

🤖 Нейросетевой код от OpenAI: демонстрация на MSBuild 0:00

Компания OpenAI провела презентацию модифицированной версии языковой модели GPT-2. Главная особенность этого проекта заключается в том, что нейросеть обучалась не на текстовых массивах естественного языка, а на открытом исходном коде Python, собранном из репозиториев GitHub. Целью эксперимента было создание модели, способной самостоятельно дописывать программный код на основе минимального контекста от пользователя.

В качестве первого примера была показана базовая задача: человек вводит объявление функции def is_palindrome(s): и добавляет строку документации (docstring). Модель успешно генерирует оставшееся тело функции, реализуя стандартную проверку строки на палиндром. Янник Килчер отмечает, что скептики могут назвать этот результат простой интерполяцией уже существующего кода из публичных репозиториев.

Однако OpenAI продемонстрировала способность системы справляться с более сложными и уникальными запросами. Нейросети поставили задачу написать функцию, которая возвращает список индексов для элементов, являющихся палиндромами и имеющих длину не менее семи символов. По словам Янника Килчера, он лично пытался найти готовую аналогичную функцию на GitHub, но её там не существует. Тем не менее, модель успешно справилась с заданием, сгенерировав относительно сложное списковое включение (list comprehension). Система не только внедрила фильтр по длине строки, но и корректно сослалась на ранее созданную функцию is_palindrome.

Разбирая техническую сторону вопроса, Килчер выдвигает гипотезу, что генерация кода в данной модели не происходит исключительно «буква за буквой» или «слово за словом», как в стандартных текстовых ИИ. По его мнению, разработчики, скорее всего, наложили на модель ограничения абстрактных синтаксических деревьев (Abstract Syntax Trees, AST). Это позволяет гарантировать, что на выходе всегда будет получаться синтаксически валидный код Python, хотя распределение переменных и логика остаются целиком на усмотрение нейросети. Ведущий допускает, что показанные примеры могли быть тщательно отобраны (cherry-picked), но даже в таком виде результат выглядит впечатляюще.

🧠 Сложные контексты и логика скидок: симбиоз человека и машины 2:12

Во второй части презентации OpenAI усложнила задачу, предоставив модели контекст из двух классов данных (data classes) — Item (товар) и Order (заказ). Разработчик лишь объявил метод compute_total_order_price внутри класса Order, не добавляя никаких дополнительных описаний. Модель самостоятельно сгенерировала как тело метода, так и подробную строку документации.

Янник Килчер детально анализирует этот шаг и объясняет вероятный алгоритм работы системы:

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

Чтобы исправить ошибку, программисты вручную скорректировали строку документации, явно указав: «применить скидку к товарам, чьё имя является палиндромом». После повторного запроса модель выдала безупречный результат: она добавила условие if is_palindrome(...), умножая цену на коэффициент скидки, а в противном случае прибавляя стандартную цену товара. Финальный штрих (формулу 1 - discount) дописал сам человек.

На основе этого примера Янник Килчер формулирует несколько важных выводов о будущем профессии:

  1. Искусственный интеллект в обозримом будущем не заменит программистов полностью.
  2. Технология будет развиваться в сторону симбиоза человека и машины, автоматизируя рутинные действия и предлагая варианты решений.
  3. Современное программирование содержит много избыточности: часто разработчики называют функцию говорящим именем, а затем дублируют его суть в строке документации из-за требований кодстайла. По мнению Килчера, если название функции очевидно, docstring не нужен, однако именно эта избыточность помогает ИИ-модели лучше понимать контекст и преобразовывать описания в готовую реализацию.

В завершение демонстрации модель успешно справилась с генерацией кода для печати чека, корректно применив форматирование строк Python. Килчер подчеркивает, что язык документации у программистов специфичен — они фактически описывают реализацию словами, что существенно сокращает дистанцию между естественным языком и исполняемым кодом.

🛠️ Альтернативы на рынке: практический тест Tabnine и Kite 5:54

Несмотря на то, что проект OpenAI на момент записи видео не был доступен широкой публике в виде масштабного продукта, Янник Килчер напоминает, что на рынке уже существуют коммерческие инструменты автодополнения кода на базе машинного обучения. Среди них автор выделяет два основных решения:

Ведущий с сожалением отмечает, что оба этих продукта имеют закрытый исходный код, что накладывает определённые ограничения на их аудит сообществом. В основе работы данных систем также лежат языковые модели типа GPT, обученные на больших массивах исходного кода. Они способны угадывать намерения программиста, подставляя локальные переменные в контекст выполнения. Килчер упоминает существующие в сети автогенерируемые обзоры-сравнения Kite и Tabnine, призывая скептически относиться к их текстовым версиям и доверять реальным видеотестам.

💻 Живой тест автодополнения: от структуры данных до циклов 7:01

Чтобы продемонстрировать возможности Tabnine, Янник Килчер открывает проект, в котором он ранее в прямом эфире писал классификатор тональности текста с использованием библиотек Hugging Face. В ходе интерактивного тестирования плагина автор проверяет, как система справляется с генерацией различных математических и логических конструкций.

Сначала Килчер пытается рассчитать функцию потерь:

Для чистоты эксперимента ведущий создаёт абсолютно новый пустой файл. При импорте модуля os и вводе конструкции if __name__ == система мгновенно дописывает стандартное условие __main__ и предлагает создать функцию main(), предугадывая типичные паттерны написания скриптов на Python.

Далее Килчер воспроизводит пример OpenAI с классами данных, создавая структуру Order с полями price: float и name: str. При создании экземпляра объекта order1 и начале ввода команды print Tabnine сразу предлагает напечатать свойство order1.price. Когда в коде появляется массив orders, состоящий из двух заказов, и инициализируется переменная total_price = 0, плагин демонстрирует высокую точность предсказаний. Стоит автору написать ключевое слово for, как Tabnine автоматически дописывает всю конструкцию цикла: for order in orders:. На следующей строке ИИ безошибочно генерирует операцию инкремента: total_price += order.price. При выводе результата переменная total_price также предлагается автоматически.

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

💬 Цитаты

«Я не думаю, что искусственный интеллект заменит программистов, но он определенно будет очень полезен для автоматизации рутины или выдачи подсказок.»

Янник Килчер 04:09

«Генерация кода и понимание того, чего хочет пользователь, находятся только в самом начале пути.»

Янник Килчер 10:42
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Docstring
Строка документации в коде Python, используемая для описания назначения функции или класса.
List comprehension
Синтаксическая конструкция в Python для компактного создания списков из других итерируемых объектов.
Abstract Syntax Tree (AST)
Абстрактное синтаксическое дерево, представляющее структуру исходного кода в виде иерархии.
Data class
Специальный класс в Python, предназначенный в первую очередь для хранения данных и автоматически генерирующий базовые методы.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект OpenAI Python Tabnine Янник Кильхер генерация кода