Нейросеть научили писать код на С и С++

05.03.2021      26462

Популярной нейросети GPT-2 нашли новое применение. Ее научили генерировать фрагменты кода на С и С++, и даже опытный разработчик не всегда отличит эти листинги от реальных. 

Суть проекта

Ученые MESS Lab из Университета Нью-Йорка представили сайт This Code Does Not Exist («Этот код не существует»). Он стал продолжением серии проектов This X Does Not Exist, в рамках которых нейросеть учили генерировать новые образы на основе существующих: изображений и их частей, аудиофайлов, стихов и др.

На этот раз GPT-2 обучили на 774 млн строк кода на C/C++. Исходники взяли из 10 тыс. популярных пакетов Debian – одной из самых известных сборок ядра Linux. 

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

Тест Тьюринга

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

Задача посетителя – угадать, что перед ним: сгенерированный код или оригинальный. Главная подсказка – если это действительно фрагмент исходников из пакетов Debian, он гарантированно будет работать.

 

 

This Code Does Not Exist – тест Тьюринга для нейросети. Она пытается выдавать себя за человека, точнее, за группу разработчиков пакетов Debian. Если посетители сайта не смогут распознать сгенерированный код, значит, нейросеть прошла тест. 

Однако код, созданный нейросетью, не всегда имеет практическую пользу. Задача улучшения сборки Linux с помощью искусственного интеллекта перед GPT-2 пока не стоит.

Применения GPT-2

GPT-2 – разработка компании OpenAI. В числе ее основателей значится Илон Маск.

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

 

 

Для разработчиков интересен еще один проект – Deep TabNine. Решение задействует искусственный интеллект, чтобы завершать строки кода. По словам автора идеи Джейкоба Джексона, он натренировал нейросеть на 2 млн файлов из открытых репозиториев GitHub. Инструмент поддерживает Python, C++, Java и Haskell и еще 18 языков программирования. 

См.также:

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


Автор:
Обозреватель


См. также

Новость ИТ-Новость

Российский Альянс по искусственному интеллекту обновил требования к специалистам по ИИ: вышла новая модель с основными профессиями и навыками. Теперь базовых профессий в сфере ИИ осталось только четыре.

01.11.2024    680    user1915669    0       

2

Новость ИТ-Новость

Система платежей «Волна» по планам сделает возможной бесконтактную оплату для владельцев IPhone в России, а BRICS Pay позволит совершать безналичные расчеты иностранцам по картам Visa и Mastercard.

23.10.2024    907    AnastasiaKl    0       

3

Новость ИТ-компания ИТ-Новость

Конструктор сайтов Wix уходит из России с 12 сентября 2024 года – перестанут работать все российский аккаунты. Сайты, привязанные к аккаунтам, также перестанут работать.

11.09.2024    949    user1915669    2       

2

Новость Искусственный интеллект ИТ-Новость

ИИ научат разработке цифровых интегральных микросхем – несколько российских научных институтов заявили об участии в проекте. Проект рассчитан на 3 года – с 2024 по 2026.

23.07.2024    603    user1915669    0       

2

Новость Дата-центры Искусственный интеллект ИТ-Новость

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

18.07.2024    728    AnastasiaKl    0       

1

Новость ИТ-Новость

В сентябре 2024 года видеоигры в России начнут маркировать – пока на добровольной основе. Геймерам будут сообщать о семи видах чувствительного (неприятного) контента в игре.

17.07.2024    807    user1915669    0       

1

Новость Законодательство ИТ-Новость

Депутаты Госдумы работают над законопроектом по ужесточению контроля за электросамокатами. Среди мер: обязательная регистрация СИМ (средств индивидуальной мобильности) и разработка системы отслеживания их перемещений.

10.07.2024    773    AnastasiaKl    2       

1

Новость Искусственный интеллект ИТ-Новость

В 2024 году «Сколково» выделит пилотным проектам в сфере искусственного интеллекта гранты на общую сумму 554 млн рублей. В результате отбора финансирование получат проекты с применением ИИ в областях производства, операционной деятельности и в работе предоставляемых сервисов.

12.04.2024    1661    AnastasiaKl    3       

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. chg 05.03.21 13:36 Сейчас в теме
А вот это уже очень интересно, новый шаг к независимости ИИ.
7. Darklight 33 10.03.21 11:57 Сейчас в теме
(1)Где Вы тут шаг к независимости ИИ усмотрели.
ИИ на основе созданного ранее человеком кода - пишет аналогичный (не привнося ничего нового) - причём не по поставленным задачам - а просто так - от себя - бессмысленный код - красиво сгенерированную и никому не нужную белиберду! То есть по зависимостям, но независимо генерирует независимый бред!
2. NeLenin 14 07.03.21 04:06 Сейчас в теме
Прогресс идет семимильными шагами. Такими темпами скоро в 1С jit-компиляция появится, или поддержка insert и update в запросах
3. portwein 09.03.21 09:43 Сейчас в теме
(2) Ага. А еще импорт/экспорт, ООП и рефлексия. Но этого "скоро" мы наверное не дождёмся.
6. Darklight 33 10.03.21 11:53 Сейчас в теме
(2)Прогресс идёт... но не в программировании на платформе 1С Предприятие 8 (всё что завезли в язык за последние 10 лет - это асинхронные методы, причём без параллельности - просто очередной синтаксический сахар).

Хотя, названные Вами возможности действительно могут со временем дойти и до 1С - в 9-м поколении, лет через 30. Когда в других языках и платформах вовсю будут внедряться ИИ технологии
9. NeLenin 14 11.03.21 09:53 Сейчас в теме
(6)Думаю, Вы правы. В моем сообщении выше изрядная доля сарказма.
4. dvsidelnikov 73 10.03.21 08:26 Сейчас в теме
осталась одна мааааленькая проблема: поставить перед ИИ задачу. Как это может выглядеть в принципе?
5. Darklight 33 10.03.21 11:12 Сейчас в теме
(4)Вот вот.
Однако код, созданный нейросетью, не всегда имеет практическую пользу

В этом то весь и смысл, точнее пока отсутствие этого смысла. Если в продукции ИИ нет пользы - это не ИИ - это балабол! Обезьяна, которая стучит по печатной машинке, просто у неё красивые буковки получаются. Даже слон, рисующий хоботом картины, и то полезнее.

Deep TabNine. Решение задействует искусственный интеллект, чтобы завершать строки кода

Вот от этого проекта хоть прок есть.

А вообще я уже несколько лет задумываюсь - как ИИ может помогать в программировании! И Это действительно сложный вопрос, если ставить его в рамках текущих возможностей и принципах функционирования информационных систем с ИИ. И даже если их экстраполировать на несколько десятилетий вперёд - особо ничего крутого, что мог бы сделать ИИ в программировании (кроме дописывания уже начатого кода), не приходит. Но, тем не менее с десяток пунктов я набрал, которые считаю вполне реализуемыми к середине XXI века:

1. Уже упомянутая помощь в дописывании кода - в основном циклов, условий ветвления, и иных повторяющихся паттернов - например последовательного (но не обязательно, но уже повторяющегося, хоть в разных местах) свойств объектов, вызов их методов. Когда в проекте над рядом объектов совершаются однотипные действия ИИ мог бы ускорять их ввод. А программисту нужно было бы только вносить небольшие корректировки. Например, если в форме нужно настроить ряд интерфейсных элементов - то код может быть очень монотонным - ИИ мог бы его помогать автоформировать

2. Полиморфная автогенерация кода - когда программист передаёт на вход входные объекты, и назначает применение какого-то паттерна, методики, шаблонного алгоритма (в т.ч. полученного на основе анализа уже написанного ранее кода) - ИИ применяет его к этим объектам и адаптирует. Например, так можно было быстро генерировать базовые алгоритмы, скажем, для печатных форм, для отражения в учёте, для заполнения по структуре данных и т.п. Суть именно в том, что ИИ быстро смог бы осваивать новые паттерны и шаблонные алгоритмы, и адаптивно их применять к новых входным структурам. А программисту в конце останется только внести корректировки по необходимости

3. Выправление стилистики кода, или применение к уже написанному коду каких-то паттернов или иных исправлений. Механизм машинного обучения позволяет ИИ понимать логические отличия в двух немного разных алгоритмах об одном и том же – чтобы видеть конструктивную разницу, не вдаваясь в детали конкретных идентификаторов и последовательностей/вложений расположения функциональных блоков программного кода – тем самым, определять, как из один вид алгоритма превращать в другой вид. Это применительно и к автогонерируемому коду – когда программист постоянно вносит в него правки – ИИ может со временем научиться понимать их «смысл» и «причины» - и тоже уметь их вносить (сразу при автогенерации или по команде – с выбором варианта правок).

4. ИИ может выполнять (да и уже выполняет в продвинутых IDE) анализ уже написанного кода с целью выявления в нём ошибок, неоптимальных последовательностей действий, устаревших паттернов. И предлагать для них автоисправления

5. Продолжая тему анализа – следующее, что мог бы делать ИИ – это авто исправления банальных ошибок, прямо «на лету» (при вводе кода). Причём с глубоким анализом, например, опечаток. Когда – неправильно написана переменная, или имя модуля – ИИ мог бы сам найти правильную (по нечёткому сопоставлению имени, или по иной сигнатуре использования). При этом он мог бы помнить о таких исправления и если в друг позже такое имя появится – то мог бы предупредить программиста о проведённых автозаменах и что, возможно они были не нужны (опечатка могла быть в исходных именах переменных, а не в местах использования)

6. Оптимизация алгоритмов – это то, ради чего ИИ-технологии сейчас активно развивают в IDE – ИИ мог бы не просто находить некорректные участки кода или неоптимальные/устаревшие паттерны программирования. ИИ мог бы производить (да и, собственно, уже производит) полную оптимизацию всего кода – как на уровне исходного кода, так и на уровне выходного (при компиляции). Тут очень много перспектив для развития ИИ. От автооптимизации. До советов программисту – как изменить его алгоритм, чтобы он стал лучше (ну там банальное развёртывание хвостовой рекурсии в циклы, или оптимизация работы с коллекциями, в т.ч. рекомендации по введению «индексов» для этих коллекций и т.п. – тут очень много что могут предложить технологии ИИ программисту). Добавлю, что оптимизировать можно не только алгоритмы, но структуры данных или классов

7. Автотестирование – так же ИИ может помочь в составлении и проведении автотестов алгоритмов

8. ИИ может активно помогать в наборе кода – давая интеллектуальные подсказки по применению тех или иных паттернов, выводя в ТОП списка Быстрой подсказки (или в иных окнах IDE) подходящие операторы/объекты/шаблоны – наиболее востребованные по текущему контексту) – тем самым сокращая их поиск/набор программистом. В том числе, сюда я отношу и поиск готовых паттернов по текстовым запросам (что-то типа GutHub GIST или FastCode 1C) прямо в IDE. При этом такие шаблоны могут быть параметризированы – а ИИ может интеллектуально находить в контексте подходящие для них переменные и константные значения параметров – для автоподстановки в шаблон паттерна)

9. ИИ может осуществлять автогенерацию алгоритмов по декларативным структурам или более высокоуровневым алгоритма. Я тут говорю о том, что программист может описывать желаемую концепцию решения задачи более декларативно и боле абстрактно (чем сейчас, в т.ч. применяя квазиязык, строя разные схемы, заполняя настройки шаблонов) – а ИИ уже на основе такого обобщённого высокоуровневого описания желаемых действий (над указанными в них данными) уже генерировал бы более низкоуровневых код алгоритмов, с большей привязкой именно к возможностям фреймворка конечной платформы назначения и аппаратные заморочки. То есть, я говорю, о дальнейшем развитии идеи управляемых языков программирования (как JavaScript, Python, 1C, SQL – последний ближе всего к сути идеи) – кода программист лишь описательно декларирует что ему нужно сделать над данными – а уже ИИ, анализирует весь контекст этого описания и на контекст фактического места и целей применения, и производит генерацию кода исполнения этих действий на более «машинном» (бинарно-чётком) языке, производя необходимую оптимизацию, в т.ч, опирающуюся на статистику (в т.ч. обрабатываемых данных) и машинное обучение. Программист не вдаётся в детали этой реализации. Например, он может указать, что ему нужно сопоставить несколько коллекций, по заданным правилам и фильтрам, произвести конвертацию некоторых свойств, а результат поместить в другую таблицу (если его там нет) – на описание этого понадобится десять строчек – а ИИ уже будет генерировать все вложенные циклы перебора, сопоставления, применения фильтров, и, при необходимости, внесёт индексы, произведёт распараллеливание выполнения – в итоге сгенерировать сотни строк кода (а вместе с интеллектуально подобранными вызовами библиотек – будет использовать тысячи/десятки тысяч строк кода)
И ещё – хоть я выше упомянул, что язык SQL сам по себе уже является примером декларативного языка. Но это не означает, что над ним нельзя построить ещё более описательные структуры. Банальный пример таких структур – это 1С Система компоновки данных. Вот в таком духе я и имею в виду дальнейшее развитие декларативного программирования. Но это в виде схем; а ещё я продвигаю идею создания более высокоуровневых языков программирования (6-го поколения) – которые были бы чем-то похожи на SQL (но более современные и широкие по возможностям) – то есть, обобщённо описывали бы, что нужно сделать над данными, не в даваясь в детали реализации того, как это нужно сделать. А уже ИИ даллее бы анализировал бы это обобщённое описание – и генерировал бы уже конкретную реализацию выполнения.
Так же этот пункт нуждается ещё в одном замечании. Выше я написал «бинарно-чётком» языке – т.е. я имел в виду язык, реализующий двоичную логику на платформенны (в т.ч. аппаратных) возможностях и особенностях исполнения алгоритмов. Сейчас большинство языков программирования такие. Но есть языки, реализующие нечёткую логику (для квантовых компьютеров), например OpenQASM, Q#, Quipper и другие). Так вот, в будущем (может к концу века) – такая автогенерация будет осуществляться и языки, реализующие нечёткую логику, для исполнения на квантовых компьетрах. Но человеку достаточно сложно писать на них программы. И тут ИИ вполне может помочь. Хотя нечёткая логика может быть и в исходных алгоритмах – но её всё-равно нужно будет конвертировать из поля-понятного проогаммисту (и заказчику), в поле-понятное компьютеру – какая бы архитектура у него не была бы


10. ИИ может выполнять статистический анализ выполнения кода, а также его отладку в рантайм (пока программист «спит») – то есть, анализировать ход выполнения уже написанного кода, сопоставлять его с обрабатываемыми данными, выявлять узкие и неоптимальные места, или, небезопасные/ошибочные места. В общем – накапливать реальную статистику выполнения программы. И вырабатывать пути оптимизации таких алгоритмов или архитектуры (например – вводя или отменяя распараллеливание алгоритмов, индексацию, меняя потерны алгоритмов и задействованные объекты). Конечно, в большинстве случае – в результате такой работы будут лишь подготовлены рекомендации для программиста по внесению таких изменений – делать или нет – это уже пусть сам решает изменять или нет эти алгоритмы. Но для автогенерируемого кода – ИИ может сразу его перестраивать, не дожидаясь, когда программист «проснётся» (ведь не он же его изначально писал, это код был сразу сгенерирован ИИ, поэтому он может в любой момент его «переиначить», следя за статистикой изменения ситуации в которой этот алгоритм работает)

Вот как-то так я вижу развитии ИИ в программировании. То есть – это не замена программиста. Это, скорее интеллектуальное ассистирование и анализ, в крайнем случае – кодирование по заданным правилам и прямым формализованным целеуказаниям. Тем самым я пока не верю в то, что ИИ в обозримом будущем сможет писать код по не очень чётко формализованным ТЗ (а чётко формализованные ТЗ можно отнести к пункту 9.). Соответственно, программисты ещё будут очень даже нужны и востребованы. Просто ИИ сможет несколько разгрузить их от рутины, повысив скорость набора кода, его качество и производительность. А сами программисты смогут сосредоточиться на более творческих, прикладных (задач бизнес-логики), или на продумывании более сложных схем обработки данных и интерфейсов взаимодействия.

В конце ещё добавлю. Что для ИИ так же крайне важны будут как процессы обучения – натаскивания на паттернах, базах знаний, программном коде и т.п. То есть - машинное обучение. Так и консолидация информации в базах знаний. Причём, не только локальной, но глобальной – тем самым накопленные знания и статистика будут нарастать как снежный ком, летящий кубарём с горы, только этих комов-знаний будут миллионы и лететь они будут с сотен тысяч гор. А масса знаний будет единой для всех. Но… тут могут встать проблемы правового толка, конфиденциальности и интеллектуальной собственности. Надеюсь, юристам в недалёком будущем это удастся эффективно решить не в ущерб ИИ. Ведь чем он будет умнее – тем выше будет его эффектность – и это даст высокие преимущества всем! Но разрешат ли всем в мире иметь единое преимущество? Но это уже глобальная политика… хотя, так как, программисты тут по-прежнему являются лучевым интеллектуальным звеном – то их индивидуальное участие в каждом конкретном проекте так и останется персональным/локальным преимуществом (или балластом – это уж как повезёт с людьми) конкретного предприятия – его интеллектуальным активом

P.S.
Буду рад - если кто-то предложит что-то ещё, как можно было бы применить ИИ в средине XXI века.
Так же буду рад конструктивной критике, замечаниям или поддержке данных идей.
Если тема будет интересна - то может напишу отдельную статью с более детальным повествованием на конкретных примерах
dvsidelnikov; +1 Ответить
8. Darklight 33 10.03.21 13:37 Сейчас в теме
Добавка

пункт
11+ - Это особый финальный пункт. Здесь я хочу указать на то, что в будущем (говоря это сейчас – я буду считать себя оптимистом, хотя найдутся и те, кто, скорее всего, посчитают меня пессимистом, но я уточню – когда я это, примерно, ожидают: во второй половине XXI века, скорее всего, ближе к концу) – ИИ научится и производить формализацию задач из постановки в произвольной разговорной форме, применяя накопленные знания обучения (в т.ч. о манере передачи информации заказчика) и текущие уже формализованные сведенья об архитектуре системы, её API и проходящих в ней бизнес-процессов. При этом ИИ сможет самостоятельно задать правильные уточняющие вопросы. И потому уже сгенерировать достаточно формализованное ТЗ. Сможет ли ИИ сразу же приступ и к его исполнению. Когда-нибудь сможет. Но вряд ли в XXI веке. Даже если это ТЗ будет хорошо формализовано – скорее всего оно будет нуждаться в доработках и исправлениях (а возможно и уточнениях) со стороны программиста (ну или квалифицированного постановщика задач (менеджера проектов, бизнес архитектора) – кто этим будет заниматься – не принципиально).
Но даже будучи таким вот «пессимистом» я всё же буду «оптимистом» и уточню, что если упросить данный пункт – то уже в ближайшие десятилетия ИИ научатся формализовывать задачи (да такие алгоритмы уже и сейчас разрабатываются) если они будут изначально передаваться не в произвольной форме, а уже сразу будут чётко описаны по заданным правилам (но без строгой айтишной терминологии, т.е. оставаясь на пользовательском уровне описания). То есть, пользователь может составлять обращение по заданному готовому шаблону, используя известные ему (и ИИ) термины и названия объектов и процессов. А ИИ будет обрабатывать этот шаблон, сопоставлять со своей базой знаний и архитектурой системы (анализировать учетные данные, задействованные алгоритмы, статистику, может даже самостоятельно проводить какие-то тесты – не влияющие на рабочий учет) – и генерировать более чётко-формализованное ТЗ. Которое, конечно далее должен будет проверить довести до ума человек (хотя, вероятно, не всегда это даже требоваться будет). Уверен, не менее половины обращений пользователей, вполне себе могут быть не то, что вполне грамотно формализованы несложными ИИ алгоритмами, но по ним может быть и составлен вполне чёткий план к действию: исправлению (например, по оптимизации или исправлению явной ошибки) или доработке (например, по модификации печатной формы, или созданию отчёта, или добавлению новых реквизитов).

И тут сразу надо выделить определённый класс задач – который, к программированию вообще не относится – это задачи, связанные с анализом данных в учёте с целью выявления причины той или иной проблемы – достаточно частые задачи, с которыми далеко не все пользователи справляются (да и не все программисты тоже – т.к. это вообще не специфические для них задачи). Так вот, такого рода обращения – это не задачи ИИ ассистента для программиста. Это задачи ИИ ассистента для пользователя – и тут не нужно формализовывать эти задачи в ТЗ – их нужно сразу решать. Но это уже выходит за рамки данного текста. Это другой ИИ. Но в итоге поиска проблемы – этот ИИ может определить, что проблема в некорректно отработавших алгоритмах – и уже самостоятельно составить ТЗ для передачи его в IT отдел (согласовав его с пользователем или его руководителем) для исправления.

Замечу, что большинство из вышеперечисленных задач вполне можно решать и без всяких «ИИ» - просто реализуя инструментарий на основе линейного математико-информационного анализа данных и кодогенерации (в том числе полиморфной кодогенерации прямо в рантайме) на основе заложенных формализованных правил. Поэтому, тут ещё важно задаться вопросом – в чём отличии ИИ-технологий от обычных алгоритмов обработки данных (в т.ч. с нечётким анализом)? Ну, наверное главное отличие в том, что ИИ не просто использует, а целиком базируется на базах знаний (в т.ч. специально сгенерированных им структур обучения, по специфическим для ИИ алгоритмам), так же широко использует оценочную статистку и постоянный процесс обучения и перестроения внутренней логики – то есть, полиморфные данные + полиморфные алгоритмы, которые постоянно подстраиваются под решения поставленных микрозадач (для комплексного решения исходных задач). Не буду дальше углубляться в принципы функционировании систем на базе ИИ. Просто акцентирую внимание на том, что, почти всё то, что, описано мной выше – вполне себе решаемые задачи и без ИИ. И именно без ИИ их и стоит внедрять в IDE различных сред программирования. И уже потом «ставить их на рельсы» ИИ – для дальнейшего усовершенствования возможностей и качества результата этих систем. Там и команда разработки получше освоится и с тем, что надо сделать, и как это надо сделать с применением ИИ, да и сами технологии ИИ ещё немного подрастут (пока они, пожалуй, ещё слишком примитивны – но потенциал есть).
dvsidelnikov; +1 Ответить
Оставьте свое сообщение