Спросите людей, создающих генеративный ИИ, для чего генеративный ИИ (GenAI) хорош сейчас — что их по-настоящему вдохновляет, — и многие ответят вам: для программирования.
«Это то, что очень воодушевляет разработчиков», — сказал этом месяце Джаред Каплан, главный научный сотрудник Anthropic: «Это действительно понимание того, что не так с кодом, его отладка».
Copilot, инструмент, созданный на основе больших языковых моделей OpenAI и запущенный компанией GitHub, поддерживаемой Microsoft, в 2022 году, сейчас используется миллионами разработчиков по всему миру. Ещё миллионы обращаются за помощью к универсальным чат-ботам, таким как Claude от Anthropic, ChatGPT от OpenAI и Gemini от Google DeepMind.
«Сегодня более четверти всего нового кода в Google генерируется искусственным интеллектом, а затем проверяется и принимается инженерами», — заявил генеральный директор Alphabet Сундар Пичаи во время отчёта о доходах в октябре. «Это помогает нашим инженерам делать больше и двигаться быстрее». Ожидается, что другие технологические компании догонят их, если уже не сделали этого.
Не только крупные компании внедряют инструменты для программирования на основе ИИ. На этот оживлённый рынок также вышла целая группа новых стартапов. Такие новички, как Zencoder, Merly, Cosine, Tessl (стоимостью 750 миллионов долларов в течение нескольких месяцев после основания) и Poolside (стоимостью 3 миллиарда долларов ещё до выпуска продукта), борются за свой кусок пирога. «На самом деле похоже, что разработчики готовы платить за помощников-пилотов, — говорит Натан Бенайх, аналитик инвестиционной компании Air Street Capital. — Таким образом, код — один из самых простых способов монетизации ИИ».
Такие компании обещают вывести помощников по генеративному кодированию на новый уровень. Вместо того, чтобы предоставлять разработчикам своего рода ускоренное автозаполнение, как большинство существующих инструментов, это новое поколение может создавать прототипы, тестировать и отлаживать код за вас. В результате разработчики, по сути, могут превратиться в менеджеров, которые могут тратить больше времени на просмотр и исправление кода, написанного моделью, чем на написание его с нуля самостоятельно.
Но это ещё не всё. Многие люди, создающие помощников для генеративного программирования, считают, что они могут стать кратчайшим путём к искусственному общему/универсальному интеллекту (AGI), гипотетической сверхчеловеческой технологии, которую, по заявлениям ряда ведущих компаний, они разрабатывают.
«Впервые мы увидим, что экономически значимая деятельность достигла уровня возможностей человека, в разработке программного обеспечения», — говорит Эйсо Кант, генеральный директор и соучредитель Poolside. (OpenAI уже хвасталась, что её последняя модель o3 превзошла главного научного сотрудника компании в соревновании по программированию.)
Добро пожаловать на вторую волну искусственного интеллекта.
Правильный код
Инженеры-программисты говорят о двух типах корректности. В том смысле, что синтаксис (грамматика) программы корректен, то есть все слова, числа и математические операторы находятся на своих местах. Это гораздо важнее, чем грамматическая корректность в естественном языке. Если в тысячах строк кода будет хоть одна ошибка, программа не запустится.
Первое поколение помощников в программировании уже довольно хорошо справляется с написанием корректного в этом смысле кода. Обученные на миллиардах фрагментов кода, они усвоили поверхностные структуры многих типов программ.
Но есть и другой смысл, в котором функция программы является правильной: конечно, она работает, но действительно ли она делает то, что вы хотели? Именно на этот второй уровень правильности нацелена новая волна помощников по генеративному программированию, и именно это действительно изменит подход к созданию программного обеспечения.
«Большие языковые модели могут писать код, который компилируется, но они не всегда могут написать программу, которую вы хотели, — говорит Алистер Пуллен, соучредитель Cosine. — Для этого вам нужно воссоздать мыслительные процессы, которые прошёл бы программист-человек, чтобы получить конечный результат».
Проблема в том, что данные, на которых обучалось большинство помощников по программированию, — миллиарды фрагментов кода, взятых из онлайн-репозиториев, — не отражают эти мыслительные процессы. Они представляют собой готовый продукт, а не то, что было использовано для его создания. «Там много кода, — говорит Кант. — Но эти данные не отражают разработку программного обеспечения».
Пуллен, Кант и другие исследователи обнаружили, что для создания модели, которая делает гораздо больше, чем просто автозаполнение, — модели, которая может создавать полезные программы, тестировать их и исправлять ошибки, — нужно показать ей гораздо больше, чем просто код. Нужно показать ей, как этот код был составлен.
Цель состоит в том, чтобы создать модели, которые не просто имитируют то, как выглядит хороший код — независимо от того, работает он хорошо или нет, — но имитируют сам процесс создания такого кода.
Breadcrumbs
Для этого вам нужен набор данных, описывающий этот процесс — шаги, которые может предпринять разработчик при написании кода. Представьте эти шаги в виде «хлебных крошек», по которым машина может пройти, чтобы самостоятельно создать похожий фрагмент кода.
Сначала вам нужно понять, из каких материалов черпать информацию: какие разделы существующей кодовой базы и любые другие источники информации необходимы для выполнения конкретной задачи программирования? «Контекст имеет решающее значение, — говорит основатель Zencoder Эндрю Файлев. — Инструменты первого поколения очень плохо справлялись с контекстом, они в основном просто просматривали ваши открытые вкладки. Но в вашем репозитории [хранилище кода] может быть 5000 файлов, и они пропустят большую их часть».
Zencoder нанял группу ветеранов поисковых систем, чтобы они помогли создать инструмент, который может анализировать большие базы кода и определять, что является релевантным, а что нет. По словам Файла, такой подробный контекст уменьшает количество ошибок и повышает качество кода, который могут генерировать большие языковые модели: «Мы называем это анализом репозиториев».
Cosine также считает, что контекст имеет ключевое значение. Компания собирает все возможные «хлебные крошки» и использует их для создания нового типа набора данных. Компания попросила десятки программистов записывать, что они делали, выполняя сотни различных задач по программированию. «Мы попросили их записывать всё, — говорит Пуллен. — Почему вы открыли этот файл? Почему вы прокрутили его наполовину? Почему вы его закрыли?» Они также попросили программистов аннотировать готовые фрагменты кода, помечая разделы, для написания которых требовались знания о других фрагментах кода или специальной документации.
Затем Cosine собирает всю эту информацию и генерирует большой набор синтетических данных, в котором типичные шаги, которые предпринимают программисты, и источники информации, на которые они опираются, сопоставляются с готовыми фрагментами кода. Этот набор данных используется для обучения модели, которая определяет, по какому пути ей нужно пройти, чтобы создать конкретную программу, а затем как по этому пути пройти.
Компания Poolside, базирующаяся в Сан-Франциско, также создаёт набор синтетических данных, которые отражают процесс программирования, но в большей степени опирается на метод, называемый RLCE — обучение с подкреплением на основе выполнения кода. (Компания Cosine тоже использует этот метод, но в меньшей степени.)
RLCE аналогична технике, используемой для создания чат-ботов, таких как ChatGPT, которые умеют вести беседу, и известной как RLHF — обучение с подкреплением на основе обратной связи от человека. При RLHF модель обучается создавать текст, который больше похож на тот, который, по словам тестировщиков, им нравится. При RLCE модель обучается создавать код, который больше похож на тот, который выполняет то, что должен выполнять при запуске (или выполнении).
Игровая система
И Cosine, и Poolside говорят, что их вдохновил подход DeepMind к игровой модели AlphaZero. AlphaZero были даны шаги, которые она могла предпринять, — ходы в игре, — а затем она снова и снова играла сама с собой, методом проб и ошибок выясняя, какие последовательности ходов являются выигрышными, а какие — нет.
«Они позволили ему исследовать ходы на каждом возможном ходу, смоделировать столько игр, сколько можно было вычислить, — и это привело к победе над Ли Седолем», — говорит Пэнмин Ван, один из основателей Poolside, имея в виду корейского гроссмейстера го, которого AlphaZero обыграла в 2016 году. До прихода в Poolside Ван работал в Google DeepMind над применением AlphaZero за пределами настольных игр, в том числе над FunSearch — версией, обученной решать сложные математические задачи.
Когда этот подход AlphaZero применяется к программированию, шаги, необходимые для создания фрагмента кода, становятся доступными ходами в игре, а правильная программа становится выигрышной в этой игре. Если модель предоставлена самой себе, она может совершенствоваться гораздо быстрее, чем человек. «Программист-человек пробует и терпит неудачу за неудачей, — говорит Кант. — Модели могут пробовать что-то по 100 раз за раз».
Ключевое различие между Cosine и Poolside заключается в том, что Cosine использует пользовательскую версию GPT-4o, предоставленную OpenAI, что позволяет обучать модель на большем наборе данных, чем базовая модель, а Poolside создаёт собственную большую языковую модель с нуля.
Кант из Poolside считает, что обучение модели коду с самого начала даст лучшие результаты, чем адаптация существующей модели, которая поглотила не только миллиарды фрагментов кода, но и большую часть Интернета. “Меня совершенно устраивает, что наша модель забывает об анатомии бабочки”, — говорит он.
Компания Cosine утверждает, что её помощник по генеративному программированию под названием Genie лидирует в рейтинге SWE-Bench — стандартного набора тестов для моделей программирования. Компания Poolside всё ещё создаёт свою модель, но утверждает, что то, что у неё уже есть, по производительности не уступает Copilot от GitHub.
«Лично я очень сильно верю в то, что большие языковые модели помогут нам стать такими же способными, как разработчики программного обеспечения», — говорит Кант.
Однако не все придерживаются такой точки зрения.
Нелогичные LMS
По мнению Джастина Готтшлиха, генерального директора и основателя Merly, большие языковые модели — неподходящий инструмент для этой работы, и точка. Он приводит в пример свою собаку: «Никакое количество тренировок не поможет моей собаке научиться программировать, этого просто не произойдёт, — говорит он. — Она может делать множество других вещей, но она просто неспособна к такому глубокому уровню познания».
Готтшлих, более десяти лет работавший над генерацией кода, столкнулся с похожей проблемой при работе с большими языковыми моделями. Программирование требует способности решать логические задачи с непоколебимой точностью. Независимо от того, насколько хорошо большие языковые модели могут научиться имитировать действия программистов-людей, по своей сути они всё равно остаются статистическими игровыми автоматами, говорит он: «Я не могу научить нелогичную систему быть логичной».
Вместо того, чтобы обучать большую языковую модель генерировать код, предоставляя ей множество примеров, Merly вообще не показывает своей системе код, написанный человеком. Готтшлих утверждает, что для создания модели, способной генерировать код, нужно работать на уровне базовой логики, которую представляет код, а не самого кода. Поэтому система Merly обучается на промежуточном представлении — что-то вроде машиночитаемого формата, в который преобразуется большинство языков программирования перед запуском.
Готтшлих не говорит, как именно это выглядит и как работает этот процесс. Но он приводит аналогию: в математике есть идея, что единственные числа, которые должны существовать, — это простые числа, потому что все остальные числа можно вычислить, используя только простые. «Возьмите эту концепцию и примените её к коду», — говорит он.
Этот подход не только позволяет сразу перейти к логике программирования, но и работает быстро, поскольку миллионы строк кода сокращаются до нескольких тысяч строк промежуточного языка, прежде чем система их проанализирует.
Меняющиеся установки
То, что вы думаете об этих конкурирующих подходах, может зависеть от того, какими вы хотите видеть помощников в генеративном программировании.
В ноябре Cosine запретила своим инженерам использовать инструменты, отличные от собственных продуктов. Теперь компания наблюдает за влиянием Genie на своих инженеров, которые часто наблюдают за тем, как инструмент генерирует для них код. «Теперь вы задаёте модели желаемый результат, а она заботится о реализации за вас», — говорит Ян Ли, ещё один соучредитель Cosine.
Пуллен признаёт, что это может сбивать с толку и требовать смены подхода. «Наши инженеры выполняют несколько задач одновременно, переключаясь между окнами, — говорит он. — Пока Джинн выполняет код в одном окне, они могут попросить его сделать что-то другое в другом».
Эти инструменты также позволяют одновременно тестировать несколько версий системы. Допустим, вы разрабатываете программное обеспечение, в которое нужно встроить платёжную систему. Вы можете попросить помощника по программированию одновременно протестировать несколько разных вариантов — Stripe, Mango, Checkout — вместо того, чтобы писать код для каждого из них по отдельности.
Джинн может круглосуточно устранять ошибки. Большинство команд разработчиков используют инструменты для сообщения об ошибках, которые позволяют людям загружать описания ошибок, с которыми они столкнулись. Джинн может читать эти описания и предлагать исправления. Затем человеку нужно только проверить их перед обновлением базы кода.
Ни один человек не может понять триллионы строк кода в крупнейших современных программных системах, — говорит Ли, — и по мере того, как всё больше и больше программного обеспечения будет создаваться другим программным обеспечением, объём кода будет только увеличиваться».
Это сделает незаменимыми помощников в написании кода, которые будут поддерживать этот код для нас. «Узким местом станет скорость, с которой люди смогут проверять код, сгенерированный машиной», — говорит Ли.
Как ко всему этому относятся инженеры Cosine? По словам Пуллена, по крайней мере, просто отлично. “Если я задам вам сложную задачу, вы все равно будете думать о том, как вы хотите описать эту проблему модели”, — говорит он. “Вместо того, чтобы писать код, вы должны написать его на естественном языке. Но в этом по-прежнему много размышлений, так что вы на самом деле не лишаете себя радости инженерного дела. Зуд все еще ощущается ”.
Некоторые могут адаптироваться быстрее других. Cosine любит приглашать потенциальных сотрудников провести несколько дней в программировании со своей командой. Пару месяцев назад компания попросила одного из таких кандидатов создать виджет, который позволил бы сотрудникам делиться интересными фрагментами программного обеспечения, над которыми они работали, в социальных сетях.
Задача была непростой и требовала знания нескольких разделов из миллионов строк кода Cosine. Но кандидат справился с ней за несколько часов. «Этот человек, который никогда не видел нашу кодовую базу, появился в понедельник, а во вторник днём уже что-то отправил, — говорит Ли. — Мы думали, что у него уйдёт на это вся неделя». (Они его наняли.)
Но есть и другой аспект. Многие компании будут использовать эту технологию, чтобы сократить количество нанятых ими программистов. Ли считает, что вскоре мы увидим несколько уровней инженеров-программистов. На одном конце будут элитные разработчики с зарплатами в миллионы долларов, которые смогут диагностировать проблемы, когда ИИ даёт сбой. На другом конце будут небольшие команды из 10–20 человек, которые будут выполнять работу, для которой раньше требовались сотни программистов. «Это будет похоже на то, как банкоматы изменили банковскую сферу», — говорит Ли.
«Всё, что вы захотите сделать, будет зависеть от вычислений, а не от количества сотрудников, — говорит он. — Я думаю, все согласны с тем, что эпоха, когда в вашу организацию можно было нанять ещё несколько тысяч инженеров, закончилась».
Искривляющие двигатели
Действительно, для Готтшлиха машины, которые могут программировать лучше людей, будут иметь решающее значение. По его мнению, только так мы сможем создавать обширные и сложные программные системы, которые, как он считает, нам в конечном счёте понадобятся. Как и многие в Кремниевой долине, он предвидит будущее, в котором люди переселятся на другие планеты. Это станет возможным только в том случае, если мы научим ИИ создавать необходимое программное обеспечение, говорит он: «Настоящая цель Мерли — отправить нас на Марс».
Готтшлих предпочитает говорить о ”машинном программировании“, а не о ”помощниках по программированию», потому что, по его мнению, этот термин неправильно формулирует проблему. “Я не думаю, что эти системы должны помогать людям — я думаю, что люди должны помогать им”, — говорит он. “Они могут двигаться со скоростью искусственного интеллекта. Зачем ограничивать их потенциал?”
«Есть такой мультфильм под названием «Флинтстоуны», где у них есть машины, но они движутся только тогда, когда водители нажимают на педали, — говорит Готтшлих. — Я чувствую, что большинство людей используют ИИ для программных систем примерно так же».
«Но то, что строит Мерли, — это, по сути, космические корабли, — добавляет он. Он не шутит. — И я не думаю, что космические корабли должны приводиться в движение людьми на велосипедах. Космические корабли должны приводиться в движение варп-двигателем».
Если это звучит дико — так оно и есть. Но есть серьёзный момент, связанный с тем, что люди, разрабатывающие эту технологию, считают конечной целью.
Готтшлих не одинок со своей галактической точкой зрения. Несмотря на то, что они сосредоточены на продуктах, которые разработчики захотят использовать уже сегодня, большинство этих компаний нацелены на гораздо более высокую прибыль. Посетите веб-сайт Cosine, и компания представится как «Лаборатория человеческого мышления». Она рассматривает программирование как первый шаг к более универсальной модели, которая может имитировать решение задач человеком в ряде областей.
У Poolside схожие цели: компания открыто заявляет, что создаёт AGI. «Код — это способ формализовать рассуждения», — говорит Кант.
Ван говорит об агентах. Представьте себе систему, которая может запускать собственное программное обеспечение для выполнения любой задачи на лету, — говорит он. «Если вы дойдёте до того, что ваш агент сможет решать любую вычислительную задачу, которую вы хотите, с помощью программного обеспечения, — это, по сути, демонстрация СИИ».
Здесь, на Земле, такие системы остаются несбыточной мечтой. В то же время разработка программного обеспечения меняется быстрее, чем ожидали многие передовые компании.
«Мы ещё не достигли того уровня, когда всё делается машинами, но мы определённо отходим от привычной роли инженера-программиста, — говорит Пуллен из Cosine. — Мы видим зачатки этого нового рабочего процесса — того, каким будет инженер-программист в будущем»