Сеанс разоблачения магии в AI

Проблема с хайпом вокруг технологий заключается в том, что появляется огромное количество информационного шума, который делает технологию какой-то разновидностью волшебства. Так было с криптовалютами, и теперь такое же наблюдается вокруг AI и LLM. Тем более, что попробовать тот же ChatGPT несложно — это вам не с криптокошельком разбираться, — и общение в привычном интерфейсе вебчата или мессенджера дает какие-то разумные ответы, так что широкой аудитории вполне верится в утверждение «AI можно натренировать так-то и так-то». И это действительно так — натренировать можно, вот только непосредственный процесс тренировки как раз и становится той самой «магией», которая по всем правилам фокуса должна остаться непонятной профанам.

Я заранее хочу предупредить, что дальнейший текст будет излагать эту магию намеренно очень упрощенно, без математики, так сказать — для общего понимания. Мой собственный опыт довольно специфичен, я не провожу исследований и технически корректных экспериментов, но опыт использования накопить успел и для выводов вида «А вот для этого надо пробовать эту область решений» этого опыта часто хватает.

Итак, как же можно «натренировать» AI для решения каких-то специфических задач? Например, вы хотите, чтобы AI выполнял работу поддержки в вашем бизнесе, отвечая на постоянные вопросы пользователей. У вас есть какое-то количество информации — база знаний, — для ответов на вопросы, возможно, у вас есть архив общения с пользователями, где есть правильные ответы на частые вопросы.

Самый простой вариант, если объем специфической информации невелик (скажем, несколько страниц текста) — это использовать prompt engineering. То есть всю информацию вместе с прямыми инструкциями (типа «Отвечай только на вопросы о…») вы отправляете вместе с запросом пользователя в LLM (как правило, это происходит по API и ваша информация включается в system message).Получив запрос, LLM извлекает из промпта инструкции и факты, после чего отвечает на пользовательское сообщение, а, если необходимая информация отсутствует, руководствуется своим общим знанием.

Фактически, в этом варианте основная роль LLM — это распознать непредсказуемый вопрос пользователя, сопоставить его с имеющейся информацией и связно сформулировать релевантный ответ. Если провести аналогию, то это такая работа оператора поддержки, когда его с улицы без подготовки посадили отвечать на вопросы, дав несколько страниц фактической информации. Он и отвечает, а когда клиент интернет-провайдера вдруг жалуется на озноб и ломоту в костях, он говорит что-то типа «Ну, вообще чисто по-человечески я вам советую теплый чай с малиной».

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

Следующая опция, которую до сих пор часто выбирают — это Custom GPT у OpenAI (или Assistants, если вы используете API). Практически, вы работаете с той же моделью LLM, только в промпте вы даёте исключительно инструкции, а всю информации можете загрузить в виде файлов и модель будет ею руководствоваться при ответе на вопрос. В этом случае вы не так ограничены размером контекста (128K токенов для GPT, например), поскольку можно загрузить до 20 файлов, объемом в полгигабайта каждый, то есть всего 10 гигабайт информации. Если возвращаться к аналогии с поддержкой, то на этот раз у человека с улицы есть подробная инструкция, как отвечать на вопросы, и достаточно объемная библиотека, в которой можно найти требуемые факты.

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

Если вы хотите получить более гибкое решение по сравнению с Custom GPT, вам надо двигаться в сторону RAG-бота. RAG — Retrieval-Augmented Generation — это подход, который базируется на извлечении моделью информации из внешних источников и генерации ответа на основе найденного. В общем-то, он делает то же, что и Custom GPT с включенным file search — получает запрос, ищет в определенных источниках информацию по нему и формулирует связный ответ. Главное отличие от предыдущего пункта заключается в том, что вы не ограничены выбором одного провайдера, у вас нет ограничений по объему информации во внешних источниках, количеству и характеру источников, частоте их обновления. Впрочем, обратная сторона этих возможностей заключается в том, что вам придется заняться разработкой — даже развертывание готового решения для поиска по источникам потребует определенной квалификации, а если захотите написать что-то свое, например, с использованием text embeddings и векторной базы, то придется и код писать. Или озадачить этим тот же AI — в моем случае он вполне справился.

Масштабность разработки можно снизить, если прибегнуть к Function Call — возможности, которая есть и у OpenAI, и у Anthropic, и даже у многих открытых моделей. Фактически, вы отправляете в API промпт, в котором указываете, чтобы модель вызывала определенную функцию (например, ваш поиск по источникам) при ответе на определенные виды вопросов (или все вопросы).

У такого подхода есть еще ряд преимуществ, но давайте рассмотрим еще один вариант сначала. Часто говорят «Я натренировал модель» и это выглядит высшим пилотажем. Конечно, в большинстве случаев речь не идет о полном процессе обучения — по мере развития моделей это становится нереальным технически для рядовых разработчиков. Чаще говорят о fine-tuning (тонкой подстройке) существующей модели — это может быть как открытая модель на базе Llama или ряд моделей OpenAI. Anthropic не предоставляет такой возможности.

Что представляет из себя fine-tuning? Вы берете существующую модель и загружаете в неё обучающий набор данных, содержащий специфическое знание в той области, где вы хотите использовать модель. Например, это базовая информация о вашей отрасли, яркие примеры вопросов и ответов, нормативные документы и так далее. Модель, обучаясь на данных, перестраивает исходные параметры, «усваивая» базовую логику вашей деятельности, специфические термины, стиль ответов пользователям, большое количество фактической информации.

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

Правда, минусы этого подхода хорошо прослеживаются и в аналогии. Обучение даже в случае с fine-tuning — процесс не моментальный и не очень дешевый. Подготовка данных для обучения — процесс достаточно сложный. Если ваша модель должна отвечать на вопросы, касающиеся какой-то свежей информации, процесс обучения придется повторять регулярно. Кроме того, при fine-tuning модель не хранит весь корпус данных явно — поэтому она может «не вспомнить» конкретный факт или конкретный текст документа. Опять же напрашивается аналогия с человеком — даже прекрасно подготовленный специалист может забыть конкретную формулировку из какого-то редкого документа, хотя вполне понимает его логику.

Поэтому самый логичный выход заключается в комбинировании подходов. Пусть модель дообучится (fine-tuning) на специфической профессиональной информации, содержащей базовые понятия, логику, термины, примеры и кейсы, а затем при ответах на вопросы будет пользоваться не только этой базовой информацией, но и результатами поиска — как это выше делал RAG-бот. То есть теперь наш подготовленный специалист из аналогии получает в свое распоряжение обширную библиотеку с фактами и справочными данными.

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