В мире природы животные используют инструменты, чтобы расширить свой поведенческий репертуар. Это отнюдь не свойственно одним лишь людям. Птицы мастерят крючки из проволоки, чтобы доставать недоступных иным способом личинок, осьминоги собирают кокосовую скорлупу, чтобы построить уютное подводное убежище, а слоны срывают листья плантана, чтобы использовать их в качестве мухобоек. Но именно приматы — такие как шимпанзе, гориллы и люди — являются непревзойденными мастерами в использовании инструментов. Наших ближайших родственников не раз заставали за тем, как они с помощью палочек достают термитов из гнезда, проверяют глубину водопоя перед переходом вброд и выковыривают колючие семена фруктов из своих волосатых задниц. Самка шимпанзе может тащить тяжелый плоский камень за несколько миль туда, где много орехов, чтобы использовать его как импровизированный кухонный стол для их раскалывания. Гоминиды начали использовать инструменты 2,6 миллиона лет назад, обтесывая камни и превращая их в удобные для руки молотки, топоры и ножи, что дало толчок развитию как цивилизации, так и когнитивной революции. С тех пор каждый скачок в усложнении нашего поведения шел рука об руку с открытием нового инструмента — будь то огонь, искусство, сельское хозяйство, письменность, порох, электричество или интернет. Сегодня практически все, что мы делаем, связано с использованием какого-либо инструмента. Попробуйте придумать занятие, которым вы регулярно занимаетесь вообще без каких-либо инструментов, — это непросто (если вы любите плавать в диких водоемах или пытаетесь забеременеть традиционным путем, это может подойти, хотя, очевидно, и в обоих этих случаях кое-какие инструменты могли бы пригодиться).
В нашу цифровую эпоху любимым инструментом каждого человека стал компьютер. Для большинства людей это смартфон, который они носят в кармане. Среднестатистический американец взаимодействует со своим телефоном более 2600 раз в день (примерно раз в двадцать секунд бодрствования), что дает ему практически постоянный доступ к цифровой вселенной веб-сайтов и программных приложений. Если бы вы захотели (как только что сделал я) быстро подсчитать, сколько секунд в сутках, вы всегда могли бы перемножить 60 × 60 × 24 в уме — возможно, используя рассуждения по цепочке (CoT), чтобы последовательно выполнить вычисления в уме. Но гораздо быстрее было бы ввести этот пример в калькулятор и мгновенно получить ответ (и в моем браузере, и в операционной системе есть встроенный калькулятор). Калькулятор использует специализированный микропроцессор, запрограммированный на безупречное выполнение арифметических операций, что делает его быстрым и надежным — в отличие от нейросети, он не допустит нелепых вычислительных ошибок. Однако калькулятор мало на что еще пригоден — он не умеет генерировать естественный язык, если не считать школьных попыток складывать неприличные слова из перевернутых цифр. Но, к счастью, современный компьютер — это цифровой швейцарский армейский нож. Он оснащен целым набором подобных инструментов: от калькуляторов и карт до поисковых систем, переводчиков и интерпретаторов кода. Таким образом, пользователи могут делегировать каждую задачу специализированному приложению, превращая множество узкопрофильных инструментов в один универсальный. Мы можем использовать одно устройство, чтобы перевести слово «catnip» на венгерский, узнать примерное время в пути на машине от Боготы до Медельина или посмотреть актуальную цену за грамм золота. Таким образом, цифровые инструменты дополняют человеческий разум (который отлично справляется с гибким решением открытых задач) скоростью и точностью электронного вычислительного устройства, обеспечивая нам колоссальный прирост когнитивного потенциала.
Подобно людям, LLM могут использовать цифровые инструменты для расширения своей функциональности. Использование инструментов работает за счет того, что языковые модели могут вызывать программный интерфейс приложения (или API) в процессе генерации своего ответа. API — это протокол для доступа к программному приложению или веб-сайту, описывающий формат, в котором данные должны отправляться и запрашиваться. Идея проста: LLM может генерировать специальные токены, которые вместо формирования слов отправляют данные в API. Любое полученное в ответ сообщение незаметно преобразуется в токены и добавляется к контексту. Это означает, что процесс генерации может быть дополнен актуальной информацией с работающих сайтов или приложений, примерно так же, как фрагменты текста извлекаются из автономного набора данных при генерации, дополненной поиском (RAG). Представьте, что я прошу LLM выполнить утомительную арифметическую операцию, например, разделить одно пятизначное число на другое — задача, которая порой ставит в тупик даже передовые, тонко настроенные модели. Если снабдить LLM калькулятором, она может научиться выдавать следующее:
Пользователь: Чему равно 12345 / 98765?
LLM: 12345 / 98765 = <API> calculator(12345 / 98765 → 0.125) </API> 0.125
Вывод между тегами <API> (что означает начало вызова) и </API> (конец вызова) пользователю не показывается. Вместо этого данное сообщение перенаправляется на калькулятор, который возвращает число, указанное после стрелки (0.125), и именно оно выводится на экран. Таким образом, пользователь видит только ответ «12345 / 98765 = 0.125». Это распространенный подход. Например, LaMDA, разработанная Google (с которой мы встречались в части 3, когда она убеждала Блейка Лемойна в наличии у нее сознания), оснащена как калькулятором, так и переводчиком.
Если вы предложите Gemini сложную арифметическую задачу, она применит изящный трюк. Когда я попросил ее разделить 12345 на 98765, она дала правильный ответ, но затем спросила, не хочу ли я, чтобы она «показала код, стоящий за этим результатом». Этим кодом оказалось следующее:
import pandas as pd
# Создать датафрейм
df = pd.DataFrame({‘12345 / 98765’: [12345 / 98765]})
# Вывести датафрейм
print(df)
Gemini решила использовать внешний инструмент для выполнения вычислений, но обратилась не к обычному калькулятору. Вместо этого она написала несколько строк кода на Python, импортировав библиотеку под названием Pandas (возможно, не самый очевидный выбор для простой арифметики среди программистов, но библиотека справляется со своей задачей). Эти строки автоматически отправляются (с помощью вызова API) в интерпретатор Python, где они выполняются, а выведенный результат (переменная под названием df ) возвращается в качестве ответа.
В одной статье 2023 года[*1] было показано, как этот подход, получивший название «языковое моделирование с помощью программ» (program-aided language modelling, или PAL), можно применять более широко, чтобы помочь LLM рассуждать математически. Например, известный бенчмарк под названием GSM8K содержит математические задачи школьного уровня, которые требуют от LLM сочетания понимания естественного языка с арифметическими навыками, например: Бет выпекает четыре партии печенья по две дюжины в каждой в неделю. Если разделить это печенье поровну между шестнадцатью людьми, сколько достанется каждому?
Это далеко не самый сложный вопрос, но он требует от LLM плавного переключения между интерпретацией значений слов (пониманием того, что «дюжина» означает двенадцать) и выполнением простейших вычислений — в данном случае расчетом (2 × 4 × 12)/16 = 6. Авторы показали, что когда модель просят преобразовать задачу такого типа в код на Python (с добавлением промежуточных шагов рассуждений на естественном языке), PAL достигает передовых результатов на GSM8K. Конечно, использование внешнего инструмента означает, что арифметика гарантированно будет верной, поэтому такое решение может показаться не совсем честным. Но на самом деле это не жульничество — авторы просто переформулировали задачу, превратив ее в обучение LLM переводу решения в код, что само по себе нетривиально. Это немного похоже на то, как студент сдает экзамен по математике, где разрешены калькуляторы — вы все равно можете провалиться, если не умеете пользоваться прибором.
Последние версии ведущих LLM, таких как ChatGPT и Gemini, пишут код довольно хорошо. В ходе предварительного обучения они анализируют огромных объемах созданных людьми скриптов и функций на таких языках, как Python, JavaScript, Perl и TypeScript. Некоторые варианты моделей даже проходят специальное обучение программированию. Например, в 2021 году OpenAI выпустила модель под названием Codex (потомок GPT-3), которая была дообучена на 159 гигабайтах кода, собранного из пятидесяти четырех миллионов репозиториев на платформе совместной разработки с открытым исходным кодом GitHub, а также текстов с технических форумов и документации. После такого обучения она продемонстрировала свободное владение четырнадцатью различными языками программирования (точно так же, как обычные LLM осваивают финский, африкаанс и хорватский после прочтения миллионов слов на этих языках). Codex служит движком для CoPilot — плагина для GitHub, работающего по подписке, который автономно преобразует описания программ на английском языке в блоки работающего кода. Все мои знакомые сходятся во мнении, что CoPilot невероятно полезен и существенно повышает их производительность, а широкое сообщество разработчиков уже использовало его для написания более 3 миллиардов строк кода.
Но даже универсальные LLM, такие как GPT-4, программируют вполне прилично. Например, я обратился к GPT-4 за помощью с простой задачей по программированию:
Пользователь: Я хотел бы написать программу на Python, которая принимает на вход список имен и сортирует их по фамилии в алфавитном порядке. Ты можешь это сделать?
GPT-4: Разумеется, я могу помочь вам с этим. Программа на Python будет принимать список имен, где каждое имя представляет собой строку в формате «Имя Фамилия». Затем она отсортирует этот список на основе фамилии. Вот как это можно сделать:
def sort_by_surname(names):
# Разделить каждое имя на имя и фамилию и отсортировать по фамилии
return sorted(names, key=lambda name: name.split(' ')[-1])
# Пример использования
names = ['John Doe', 'Anna Smith', 'Peter Johnson']
sorted_names = sort_by_surname(names)
print(sorted_names)
Если вы протестируете этот код в интерактивной среде, например в Google Colaboratory,[*2] то увидите, что он работает отлично. Вы можете просто передать список, подобный списку 'names' — причем любой длины, — и программа отсортирует его по фамилии в алфавитном порядке. Если вы учитель, библиотекарь или просто исключительно аккуратный человек, это вполне может вам пригодиться.
Эта задача с сортировкой имен требует лишь базовых навыков программирования. Но иногда написание кода действительно требует серьезного нестандартного мышления. На самом деле для некоторых людей программирование само по себе является соревнованием — сродни олимпийскому полумарафону или телешоу «Лучший пекарь Британии». Например, сайт под названием Codeforces проводит ежегодные соревнования, в которых элитные программисты состязаются друг с другом, пытаясь как можно более элегантно и с ходу решить целый ряд замысловатых задач. В качестве примера рассмотрим следующую задачу.
Вам дан список случайных целых чисел a1, a2,…, an, над которыми вы можете выполнять только одну из двух операций: (1) изменить порядок элементов в списке на обратный; или (2) циклически сдвинуть их так, чтобы последний элемент стал первым, а все остальные сдвинулись вправо. Напишите фрагмент кода для сортировки списка a с использованием исключительно этих двух операций так, чтобы он стал неубывающим (предполагая, что это возможно).
Это нетривиальная задача. Для ее решения требуется хитроумный код, который разбивает последовательность на возрастающие и убывающие отрезки чисел и циклически перемещает элементы к каждой точке перехода, чтобы развернуть их в одном направлении (там, где это возможно). Я протестировал ее и в Gemini, и в GPT-4, и ни одна из них не предложила жизнеспособного решения. Однако в 2022 году компания DeepMind обучила LLM (которую они назвали AlphaCode) на большом наборе подобных задач по программированию и заявила ее на соревнования Codeforces. Хотя AlphaCode и не победила, она оказалась примерно в середине турнирной таблицы, что весьма впечатляет, учитывая, что ее соперниками-людьми были сплошь гиками до мозга костей. В конце 2023 года усовершенствованная версия модели, получившая ряд улучшений и обученная на большем наборе данных, совершила качественный скачок, войдя в число лучших 15% участников, что принесло ей статус ведущей LLM в мире по уровню владения программированием.[*3]
LLM-виртуозы программирования получат доступ к самому универсальному набору инструментов, какой только можно себе представить, поскольку компьютерный код можно использовать практически для чего угодно — от веб-дизайна и разработки программного обеспечения до создания игр и аналитики данных. Его можно применять даже для управления физическими устройствами путем программирования встроенных систем в транспортных средствах, бытовых электроприборах или на промышленных производственных линиях. С его помощью можно разрабатывать протоколы для алгоритмической торговли на мировых финансовых рынках, а в случае с криптовалютами, такими как биткоин, — обеспечивать работу целых систем экономического обмена. Попав не в те руки, LLM, искушенные в программировании, могут однажды превратиться в опасных хакеров (или, наоборот, быть перепрофилированы в их заклятых врагов — экспертов по кибербезопасности). Системы ИИ, умеющие программировать, можно использовать даже для автономных исследований в области машинного обучения, что потенциально способно запустить рекурсивный цикл самосовершенствования, в которой все более сильный ИИ будет создавать все более мощные версии самого себя. Именно подобные идеи обычно муссируются в спорах о потенциальной «угрозе вымирания», которую ИИ несет человечеству.
Однако, прежде чем мы слишком увлечемся, важно помнить: когда речь заходит о программировании, написание элегантных решений для четко сформулированных задач лишь немногим сложнее, чем поиск мелких багов в своем скрипте. По-настоящему сложная часть программирования — самая абстрактная: четко сформулировать задачу, которую вы пытаетесь решить, разбить ее на логические шаги, написать модульные тесты для проверки правильности каждого промежуточного вычисления и понять, в какой момент программу следует остановить. Иными словами, написание кода для достижения реальных целей трудно по тем же причинам, по которым трудно любое планирование в реальном мире: оно требует размышлений над открытой, неопределенной и протяженной во времени задачей, а справиться с ней можно, лишь перебирая огромный список возможных решений, выделяя подцели, отслеживая ошибки и контролируя прогресс на пути к завершению. В решении хорошо структурированных задач написание кода языковыми моделями быстро догоняет лучших экспертов-людей. Но когда дело доходит до вызовов реального мира, LLM еще не готовы к выходу на большую сцену. Так что появление LLM, способной самостоятельно торговать активами на фондовом рынке, взламывать серверы NHS, чтобы украсть данные пациентов, или создавать собственную миниатюрную копию, нам пока не грозит — и, пожалуй, это к лучшему.
Пропустить примечания
*1 Gao et al., 2023.
*2 https://colab.research.google.com/.
*3 Оригинальную статью см. в Li et al., 2022, а технический отчет по AlphaCode 2 — на https://storage.googleapis.com/deepmind-media/AlphaCode2/AlphaCode2_Tech_Report.pdf.