July 25

Калькулятор сложнее Интернета

У меня была пара постов про базовые понятия машинного обучения в целом и обработки естественного языка в частности:

·         Про то, как обучается ИИ (просто и коротко);

·         Про то, как языковые модели работают с текстом.

Советую глянуть эти материалы перед тем, как читать дальше: так многое будет понятнее. А теперь к агентам.

Что такое ИИ-агент? В самом примитивном виде это модель, набор инструментов и инструкция по решению задачи.

Модель (она обучается)

Модель – это наши любимые gpt, llama, qwen и другие. В исходном виде это голенький трансформер (есть и другие архитектуры, но обычно это трансформер или ансамбль трансформеров). Они умеют получать на вход текст, превращать его в огромные матрицы с цифрами, умножать их на разные коэффициенты, получать новые огромные матрицы с цифрами и превращать их обратно в текст, но уже новый.

Я упрощаю, понятное дело, но прямо сейчас нам сложнее не нужно.

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

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

Конкретно так выглядит трансформация предложения в токены у GPT-4o и GPT-4o-mini

Можно зайти в специальный инструмент от OpenAI и поэкспериментировать с тем, как ваш текст «видят» модели этой компании.

Человеческой логики в том, как разбиты слова, нет. Это не корни и приставки, например, это довольно случайный набор букв и буквосочетаний, который получился в процессе предварительного обучения модели на огромном массиве текстов.

В процессе обучения токенами становятся наиболее часто встречающиеся в текстах сочетания букв. Если целое слово встречается часто, оно станет токеном. Если его компоненты встречаются чаще, слово будет разбито на эти компоненты и состоять из нескольких токенов. Какие на вход дали тексты, такие токены и получили на выходе.

Дальше каждый токен превращается в вектор из чисел, и затем с этими векторами происходят математические операции.

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

А вот что внутри этих операций, определяется в процессе обучения. То есть, в процессе обучения подбираются те числа, векторы и матрицы, на которые умножаются наши входные векторы.

Итак, на входе у нас текст – на выходе набор новых токенов и вероятность, с которой они должны быть выданы в ответ на предложение «Кошка сидит на диване».

Например, так:

[«И», 0,4]

[«Но », 0,1]

[«С», 0,5]

Модель как бы подбрасывает очень многомерную монетку с неравными вероятностями исходов и последовательно, токен за токеном, выдает свой ответ. Например, «С» -> «об» -> «ака» -> … -> «Собака сидит рядом».

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

Дальше, когда мы модель используем, она уже не обучается. Ее веса зафиксированы.

Инструмент

Как видите, языковая модель сама по себе не может, например, решить математический пример или сделать поиск в Интернете – ей нечем. Чтобы было, чем, надо добавить инструмент.

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

А дальше мы пишем модели: «Вот тебе инструмент X, бери его и найди в интернете то-то и то-то». Чтобы модель могла «взять его», ее обучают специальным образом (подробнее об этом писала здесь), чтобы она могла в нужный момент вызвать API.

API – это программный интерфейс. Как пользовательский интерфейс, только вместо нажатия кнопок нужно писать команды. Модель может писать команды, потому что это генерация текста, это доступно.

При работе с инструментом обучения не происходит: модель остается неизменной, а инструмент в принципе никак не обучается.

На самом деле, есть способы обучать модели в процессе работы с инструментами, конечно. Это удобно. Сами посудите: отправляешь модель искать что-нибудь в Википедии, она запоминает, что там написано, и работает немного лучше – отличная же идея. Но она требует специального подхода, потому что обучение модели – то есть, изменение ее весов – затратная процедура. Как-нибудь поговорим про это, пока просто знайте, что такая возможность есть, но это не вариант «по умолчанию».

Инструкция (промпт)

Промпт – это все, что мы пишем, чтобы модель выполнила задачу как нам надо: «Пойди туда, используй то, пиши на русском языке, результат оформи в виде таблицы».

Он определяет, как модель будет себя вести, какие инструменты использовать, с какими работать данными. Иногда можно встретить термины «системный промпт» (system prompt) и «пользовательский промпт» (user prompt). Это не какие-то строгие термины: их можно назвать системными / пользовательскими сообщениями (system / user message), а можно вообще не использовать.

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

В сложных системах такой промпт описывает взаимодействие между несколькими агентами: кто кому в какой момент передает какие данные.

Иногда хороший системный промпт – это половина успеха (хорошо написали инструкции – хорошо работает продукт), поэтому компании его могут прятать, чтобы конкуренты не скопировали.

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

Системный промпт, впрочем, может быть совсем простым, например: «Ты дружелюбный ассистент».

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

Как я сказала выше, такое деление не обязательно, но оно имеет много смысла, поэтому обычно создатели агентов его придерживаются.

Заметка на полях

Модели, инструмента и промпта еще недостаточно, чтобы получился агент. Агента отличает автономность, то есть, способность выполнить задачу самостоятельно.

Уровень необходимой автономности пока не определен. Когда само понятие ИИ-агентов только появилось, агенту было достаточно выполнять самостоятельно хотя бы одну операцию, например, отправить письмо.

Сейчас если вы сказали: «Отправь письмо,» – и агент отправил письмо, это уже не автономность. То есть, он уже не агент.

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

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

Если что, это не значит, что все кругом мошенники, или недобросовестные маркетологи, или глупые люди – просто сама область ИИ-агентов находится в стадии активного развития, и многое еще не устаканилось. Надо подождать немного.

Так почему калькулятор сложнее?

Это было длинное лирическое отступление, но оно было важно, чтобы мы все заговорили на одном языке и одинаково воспринимали термины. Теперь я, наконец, отвечу на вопрос.

В марте текущего года вышла статья «Can ChatGPT Learn to Count Letters?» («Может ли ChatGPT научиться считать буквы?») в одном из отраслевых журналов. Она совсем коротенькая и довольно простая, советую к прочтению.

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

Если коротко, то в большие языковые модели изначально не заложена способность считать. Они не могут посчитать буквы в слове, потому что не работают с буквами, а работают с токенами, превращенными в матрицы из чисел. Если вы ей напишете: «Реши пример: 3 + 2 =», этот запрос тоже будет разбит на токены, которые превратятся в матрицы из чисел, и для модели ваши 3 и 2 перестанут существовать, соответственно, она с ними ничего не сможет сделать.

В случае с поиском в Интернете все проще: на вход получили текст, написали текстовую команду для инструмента поиска, на выходе получили текст. Поиск похожих текстов или выявление в большом текстовом массиве нужных компонентов – это задачи, для которых языковые модели созданы и обучены. Добавление инструмента только дает им возможность сравнивать текст запроса пользователя с текстом из внешнего источника, только и всего.

А для счета нужно провести отдельное обучение. Во-первых, надо научить модель распознавать, что перед ней математическая задача. Во-вторых, – что надо использовать калькулятор или написать код. В-третьих, надо научить ее писать в калькулятор не все подряд, а числа, в правильном порядке и с правильными операциями (сложение, умножение).

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

Заключение

Фух.

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

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