ИИ как платформа
Новая предметная область
ИИ — тема хайповая. Часто мы рассуждаем о том, сможет ли ИИ заменить мясных программистов и если сможет, то когда именно. Есть два базовых полярных мнения и множество комбинаций между ними: на одном полюсе считают, что скоро нам всем кирдык и интеллектуальный труд доживает последние дни. На другом полюсе — скептически ухмыляются, и говорят, что никакой особенной угрозы нет: у ИИ нет и никогда не будет того, что есть у человеческих мозгов.
У многих из нас уже есть опыт общения с разными нейросетями, как позитивный так и не очень. И еще имеется, я бы сказал, некий «странный» опыт, отдельная категория, от которого больше вопросов чем ответов. Техно-гиганты анонсируют повсеместное внедрение и тотальную разумность будущих железяк. А мы, тем временем, удивляемся, каким-же, кхм… тупым и ленивым может быть этот всемогущий ИИ, если его попросить сделать что-то действительно полезное.
В этой статье я предлагаю перейти от общих рассуждений в более прагматическую плоскость, и посмотреть на ИИ не как на возможную угрозу нашему будущему, а как на новую платформу для разработки, открывающую множество новых неизведанных и неожиданных возможностей, ну и, кучу новой работы для нас, программистов, естественно. Именно активное практическое применение современных возможностей ИИ я называю новой предметной областью, достойной пристального внимания и подробнейшего рассмотрения.
Уточню, на всякий случай: я предлагаю не вступать в споры о том, являются ли нейросети настоящим ИИ, мы используем эти термины как общепринятые, для удобства и краткости изложения. Под ИИ, в общем случае, мы понимаем различные нейросети в их различных сочетаниях.
ИИ-функции, нечеткая логика
Начнем с самого простого. Все мы знаем, что доступ к self-hosted нейросетям или публичным ИИ-сервисам возможен через API. Самое банальное, что можно тут придумать, это некая асинхронная функция, которая на вход получает текстовый промпт, а на выход выдает текст ответной генерации (если мы работаем с текстовой моделью).
Если в нашей кодовой базе есть такая функция, а также, какое-то управление конфигурациями и доступными моделями, мы можем практически любую часть нашей системы сделать «умной». Мы можем усложнять и развивать подобный ИИ-тулсет, и привести его к состоянию полноценной библиотеки общего назначения либо чего-то мощного, но узкоспециализированного. Мы можем использовать композицию таких функций для создания последовательных ИИ-конвейеров, решающих самые нетривиальные и неожиданные задачи.
Следующий пример. Представьте, что мы создаем корпоративного чат-бота, который должен вести себя почти как человек из вашей команды. Одно из очевидных внешних отличий живого человека от нейросети — это возможность проявления инициативы. Нейросеть работает по примитивной модели «I/O», а вам хочется, чтобы наш кибер-друг-эксперт сам мог включиться в диалог и предлагать помощь, если видит, что кожаные мешки без него не справляются. А может даже сам, внезапно, предлагать идеи. Философскую проблему свободы воли мы оставим на сладкое в комментариях, а пока, напишем функцию, которая сводит некий текстовый контекст к выводу `true` или `false`, по которому мы и определим стоит ли брать инициативу в свои руки. Подобные функции могут быть гораздо сложнее, и включать в себя динамический анализ внешней информации, например, читать новости через headless browser. Также, они могут срабатывать по расписанию, таймеру или «случайным» образом. Но это уже детали, я пока говорю о базовых принципах.
ИИ-функции выдают определенный результат с какой-то вероятностью, и даже если вы, в последствии, приводите его к примитивным значениям или к соответствию какой-то схеме — вы имеете дело с той самой нечеткой логикой, с которой ваша жизнь становится менее скучной, а работа более творческой.
Мультимодальность
Автор этих строк использовал «мультимодальный ИИ» в своей работе еще тогда, когда эту фичу только анонсировали крупные ИИ-вендоры. Вы спросите меня, как? Да очень просто, я уже раскрыл секрет выше по тексту: композиция ИИ-функций.
Опять пример. Допустим, вы хотите получить от ИИ статью о породах кошек. А какая может быть статья о кошках без ми-ми-картинок? А какая статья с картинками, может быть без разметки, которая определяет, куда и как, собственно, эти картинки будут вставлены? Мой ответ — никакая.
Поэтому, используем три ИИ-функции:
Первая, создает статью с перечислением пород котиков
Вторая, вставляет в текст предыдущей генерации плейсхолдеры для изображений и промпты, адаптированные под нужную нам модель
Третья функция, запрашивает у нашей «картиночной» нейросети картинки и вставляет их в финальный результат
Вуаля: на выходе мы получаем документ, который можно хоть сейчас с гордостью показать маме.
Таким нехитрым образом, мы можем решить множество задач, лежащих за пределами возможностей отдельно взятой генеративной модели. И чтобы делать такое, вам вовсе не обязательно иметь степень по математике, иметь кучу видеокарт и свой собственный, качественно размеченный дата-сет. Достаточно знания JavaScript или Python и немного смекалки.
Prompt engineering
Как вы понимаете, без навыков составления хороших запросов, в этой теме далеко не продвинешься. Я часто встречаю использование словосочетания промпт-инженер в ироничном контексте. Но мы должны принять то, что промпты — уже скоро станут полноправной частью нашей кодовой базы.
Контроль
Общение с ИИ через API дает нам гораздо более высокую степень контроля, чем через любой готовый UI. Мы можем менять параметры под каждый запрос, переключать версии моделей, добавлять в контекст нужную информацию автоматически и делать многое другое. Это увеличивает качество результата, в том смысле, что он гораздо больше соответствует нашим ожиданиям.
Пример: часто возникает ситуация, когда мы ну очень хотим, чтобы наша модель могла проанализировать актуальную информацию из интернета, а провайдер ИИ-сервиса такой возможности не дает. При работе через API, эту проблему решить не составит большого труда.
Контекст
Контекстом мы называем то, что описывает наш случай как частный. Это некий корпус данных, отсекающий для ИИ ненужные вектора и задающий нужные, для решения вашей конкретной задачи. Он может состоять из истории запросов и ответов, описания ролей, описания формата вывода, из загруженных документов и мультимедиа-файлов, из содержания веб-страниц, из результатов веб-поиска и многого другого. Контекст можно хранить локально, передавать между разными моделями, редактировать и оптимизировать. Контекст может иметь свою формальную структуру (например, идентификаторы записей) и даже свою разметку содержащую полезные мета-данные. Вывод генерации — это тоже часть контекста, и наш подход к работе с контекстом, во многом, определяет качество результата.
Формализация, стабилизация, валидация
Время привести следующий пример, логично вытекающий из предыдущего. Допустим, наша задача — создать полноценную веб-страницу с помощью ИИ. Обычно, веб-документ содержит следующие сущности: текст, разметку, стили, изображения, скрипты. Почти все это может быть создано как ответ на всего один запрос, но надеяться на то, что результат вас сразу удовлетворит — не стоит. Часто бывает так, что какая-то часть ответа ИИ вас вполне устраивает, а остальные — категорически нет. Мы можем итеративно добиваться лучшего результата, но без возможности вносить точечные изменения и кэшировать удовлетворительные ответы, жонглировать сущностями вывода будет очень непросто. Для решения этой проблемы, помимо последовательной обработки результата через цепочку функций, нужна некая формализованная структура вывода, позволяющая генерировать и модифицировать участки и целые сегменты ответа. Кроме этого, каждая часть должна соответствовать строгим критериям и не содержать ошибок, а проще говоря, правильно работать в браузере.
Недавно OpenAI представили такую штуку как Structured Outputs: это метод, позволяющий привести ответ ИИ к вашей JSON-схеме, что помогает извлекать данные по фиксированным ключам и проводить с ними какие-то дальнейшие манипуляции. Это очень похоже на то, что нам может потребоваться для решения вышеприведенной задачи. Веб-документ, конечно, можно представить в форме JSON-описания, но, для этого понадобиться отдельное решения для генерации итогового HTML…
Автор этой статьи, в своих экспериментах со структурированием, пришел к иному формату, основанному на HTML изначально. Как оказалось, ИИ довольно неплохо «разбирается» в XML-подобном синтаксисе и он (синтаксис) очень хорошо помогает с этим самым ИИ предметно «договариваться». Вы можете создать подробные инструкции по использованию тегов и атрибутов, как стандартных так и полностью ваших собственных. Вы можете задавать тегам уникальные идентификаторы и другие мета-данные, и использовать их в последующих запросах. Со стороны вашего кода, HTML можно удобно обрабатывать с помощью, внезапно, DOM API: искать и модифицировать элементы, менять структуру и так далее. Причем как в Node.js так и через API для управления headless browser, такому как Puppeteer или Playwright, имея в своем арсенале инструментов полноценный рендеринг или растеризацию.
ИИ-теги
Продолжу тему работы с ИИ под HTML-соусом, но, с немного неожиданной стороны. Среди современных HTML-стандартов и спецификаций, есть такая штука, как Custom Elements. Для тех, кто не в курсе: это способ создавать ваши собственные теги, которые браузер сам инициализирует, встречая их в разметке, запуская, заданную именно вами, логику поведения. Также, существует способ модифицировать поведение стандартных тегов (тут есть нюансы, но они не важны в рамках данного повествования).
А теперь представьте, в вашем HTML-файле, вместо:
Вы пишите, примерно, следующее:
И, в результате, получаете нужное изображение, которое еще и кэшируется в CDN по хешу промпта, для всех последующих посетителей вашей страницы.
Или делаем так:
И получаем список стран.
Или:
Lorem ipsum... some text.
И получаем блок текста с переводом на испанский. Как и возможность задавать язык перевода через… CSS Custom Properties!
Или:
И получаем блок текста-заполнителя про котиков. Или какую-нибудь SEO-простыню.
Итоговый документ, конечно же, можно сохранять и публиковать как статический файл.
Веб-технологии
Как вы заметили, в своем рассказе, я часто обращаюсь к веб-технологиям. На мой взгляд, в грядущей ИИ-революции у них может быть особая роль. Нам (всей человеческой цивилизации), необходим некий стандартизированный протокол общения с ИИ, чтобы мы оставались способны, в принципе, понимать и контролировать ИИ. Нам необходимы простые и стандартные способы визуализации данных. Нам нужны инструменты, которые обеспечивают некий детерминированный подход к типовым задачам. Иначе — сингулярность. Она, конечно, нас ждет в любом случае (и даже есть мнение, что она давно наступила), но нам нужна хотя-бы какая-то «ветка», за которую мы, в ближайшие годы, будем держаться. Нам нужны сущности, с которыми может, относительно просто, управляться средний человеческий мозг: читать, анализировать, воссоздавать самостоятельно, модифицировать в соответствии с собственными целями. Нам нужна «человекочитаемость». И такой набор стандартов и принципов у нас уже есть, это HTML, CSS и JavaScript. С помощью веб-технологий, мы можем создавать виджеты и мета-приложения, которые могут быть частью коммуникаций с ИИ. Мы можем добавлять мета-данные и нужную разметку (как в примерах выше). Мы можем легко и удобно решать сложные вопросы композиции сущностей и операндов. Мы можем скрывать чувствительные и конфиденциальные данные от попадания во внешние дата-сеты и избегать соответствующих утечек и уязвимостей.
Я знаю, что у многих есть предубеждения относительно веб-технологий. Но у меня, в свою очередь, есть веский аргумент: основное свойство Веба и почти всего, из чего он состоит — это прозрачность. Мы, буквально, видим из чего он состоит внутри. Мы можем открыть капот, и посмотреть, что там. И нам, для этого, не нужна никакая сложная декомпиляция или редкие знания. Многие, почему-то, в своих оценках технологий, этот фактор упускают, а он, на мой взгляд, чрезвычайно важен, особенно сейчас.
Telegram
Последние события, добавляют в тему, касающуюся мессенджера Telegram некую перчинку. Но я не хочу сейчас заниматься спекуляциями и предлагаю сосредоточится на чисто техническом аспекте. А именно на том, что Telegram — это потрясающая, своими возможностями, платформа.
С Telegram, из коробки, мы имеем авторизацию и управление пользовательскими правами и группами. Мы имеем обмен файлами и нотификации. Мы имеем возможность интеграции веб-приложений, блокчейн и многое другое. И, конечно, возможность создавать ботов.
Я считаю Telegram прекрасным «фронтендом» для различных решений, основанных на ИИ.
Железо
Множество проблем, сопровождающих разработку ИИ-сервисов, имеет решение в использовании self-hosted моделей. Это касается и безопасности, и лимитов, и даже самой возможности воспользоваться внешними публичными сервисами. Процессы R&D в области ИИ, особенно чувствительны ко всему вышеперечисленному, включая тот факт, что проверка ваших технических гипотез, сама по себе, способна сжечь немало ресурсов. На этом фоне, нас особенно интересует вопрос «железа» оптимального для работы с нейросетями. Хороший GPU и много памяти — основа рецепта, здесь сложно сказать что-либо новое.
Однако, лично мне, в этой перспективе, очень интересны новые процессоры Apple Silicon серии M4, с NPU на борту. С нетерпением жду грядущего обновления линейки Mac Mini. Мне кажется, это устройство может на ближайшее время стать отраслевым стандартом для self-hosted моделей, как корпоративных, так и домашних. Время покажет.
Итог
При подготовке этой статьи, мне пришлось удалить некоторые разделы для краткости и целостности повествования. Но тем для обсуждения и идей — огромное множество. Многие достойны отдельных статей и отдельного обсуждения.
Надеюсь, я подтолкнул вас к выводу, о том, что ИИ не отбирает у нас работу, а дает новую: увлекательную, творческую и полную новых возможностей.