Введение в инженерию машинного обучения и LLMOps с OpenAI и LangChain
Введение в машинное обучение и LLMOps с OpenAI и LangChain
Следующая статья основана на выдержке из второго издания книги “Машинное обучение с использованием Python” от Packt, 2023, автор Andy McMahon.
Жизнь в большом стиле с LLMs
На данный момент написания статьи, GPT4 был выпущен всего несколько месяцев назад, в марте 2023 года, компанией OpenAI. Эта модель потенциально является самой большой моделью машинного обучения, когда-либо разработанной, с заявленными одним триллионом параметров, хотя OpenAI отказывается подтверждать это число. С тех пор Microsoft и Google объявили о продвинутых возможностях чата, используя аналогично большие модели в своих продуктовых наборах, и был выпущен ряд открытых пакетов и инструментов, которые создают ощущение того, что каждый пытается их понять и применить. Все эти решения используют одну из самых больших моделей нейронных сетей, называемых Large Language Models (LLMs). LLMs являются частью еще более широкого класса моделей, известных как Foundation Models, которые охватывают не только текстовые приложения, но также видео и аудио. Автор классифицирует эти модели как слишком большие для большинства организаций, чтобы рассматривать возможность их обучения или даже размещения самими, и поэтому они обычно используются как сторонний сервис. Решение этой задачи интеграции надежным и безопасным способом является одной из основных проблем современного инжиниринга машинного обучения. Время не терпит, поскольку каждый день появляются новые модели и возможности. Поехали!
Понимание LLMs
Основное внимание систем, основанных на LLM, направлено на создание ответов, похожих на человеческие, на широкий спектр текстовых входных данных. LLMs основаны на архитектуре трансформеров, которая позволяет этим моделям обрабатывать входные данные параллельно, существенно сокращая время, необходимое для их обучения.
Архитектура трансформеров LLM, как и для любого трансформера, состоит из серии кодировщиков и декодеров, которые используют механизмы само-внимания и нейронные сети с прямой связью. В общих чертах можно сказать, что кодировщики отвечают за обработку входных данных, преобразование их в соответствующее числовое представление, а затем передачу этого представления в декодеры, из которых может быть сгенерирован вывод. Волшебство трансформеров заключается в использовании механизма само-внимания, который является механизмом для захвата контекстуальных связей между словами в предложении. Это приводит к векторам внимания, которые представляют это численно, и когда вычисляется несколько таких векторов, это называется “много-головное внимание”. Кодировщик и декодер используют механизмы само-внимания для захвата контекстуальных зависимостей входных и выходных последовательностей.
- Улучшение состояния активов и надежности сети с использованием машинного обучения
- Семантический поиск изображений для статей с использованием Amazon Rekognition, базовых моделей Amazon SageMaker и сервиса Amazon OpenSearch
- Построение конвейера машинного обучения для классификации английских акцентов
Одна из самых популярных моделей, основанных на трансформерах и используемых в LLMs, – это модель Bidirectional Encoder Representations from Transformers (BERT). BERT был разработан Google и является предварительно обученной моделью, которую можно настроить для различных задач естественного языка. Еще одна популярная архитектура – это модель Generative Pre-trained Transformer (GPT), созданная компанией OpenAI.
Система ChatGPT, выпущенная компанией OpenAI в ноябре 2022 года, видимо, использовала модель GPT третьего поколения, когда она сотрясла мир. На момент написания статьи в марте 2023 года, эти модели находятся на своем четвертом поколении и являются невероятно мощными. Хотя, когда я печатаю это, GPT-4 доступен только для определенных пользователей по всему миру, уже сейчас он вызывает ожесточенные дебаты о будущем искусственного интеллекта и достигнута ли искусственная общая интеллектуальность (AGI). Автор не считает, что мы достигли этого, но это все равно захватывающее время для нахождения в этой области!
То, что делает LLMs невозможными для обучения заново в каждом новом бизнес-контексте или организации, заключается в том, что они обучаются на колоссальных наборах данных. GPT-3, который был выпущен в 2020 году, обучался на почти 500 миллиардах токенов текста. Токен в данном случае – это небольшой фрагмент слова, используемый для процесса обучения и вывода в LLMs, примерно из четырех символов на английском языке. Так что это много текста! Затраты на обучение этих моделей соответственно велики, а даже вывод может быть чрезвычайно дорогим. Это означает, что организации, чье единственное внимание не сосредоточено на создании этих моделей, вероятно, не смогут получить масштабные экономические выгоды и необходимые доходы для обоснования инвестиций в них в таком масштабе. Это еще до того, как учесть необходимость в специализированных навыках, оптимизированной инфраструктуре и возможности получить все эти данные. Есть много аналогий с появлением публичного облака несколько лет назад, когда организации теперь больше не обязаны инвестировать в внутреннюю инфраструктуру или экспертизу, а вместо этого платят по принципу “плати за использование”. То же самое происходит с самыми сложными моделями машинного обучения. Это не значит, что более маленькие, более специализированные модели были исключены. Фактически, я считаю, что это останется одним из способов, которыми организации могут использовать свои собственные уникальные наборы данных для получения преимущества перед конкурентами и разработки лучших продуктов. Самые успешные команды будут теми, которые объединят этот подход с подходом к самым большим моделям в надежной манере.
Масштаб не является единственным важным компонентом. ChatGPT и GPT-4 не только обучались на огромных объемах данных, но и подвергались доводке с использованием техники, называемой обратной связью с помощью обучения с подкреплением (RLHF). Во время этого процесса модель представляется с подсказкой, такой как вопрос в рамках диалога, и генерирует ряд возможных ответов. Затем ответы предоставляются человеческому оценщику, который дает обратную связь о качестве ответа, обычно, ранжируя их, что затем используется для обучения модели вознаграждения. Эта модель затем используется для доведения основной языковой модели с применением таких техник, как метод ближайших политик (PPO). Подробности всего этого выходят за рамки этой книги, но, надеюсь, вы начинаете понимать, что это не типичная задача анализа данных, которую команда может быстро масштабировать. Поскольку это так, нам необходимо научиться работать с этими инструментами, рассматривая их как сторонние решения. Мы рассмотрим это в следующем разделе.
Использование LLM через API
Как уже было сказано в предыдущем разделе, главное изменение в нашем мышлении, как инженеров МО, которые хотят взаимодействовать с LLM и Foundation Models, заключается в том, что нельзя больше предполагать, что у нас есть доступ к модели, данным обучения или тестирования. Вместо этого мы должны рассматривать модель как сторонний сервис, к которому мы должны обращаться для использования. К счастью, существует множество инструментов и техник для реализации этого.
Следующий пример покажет вам, как построить конвейер, использующий LLM с помощью популярного пакета LangChain. Название происходит от того факта, что для использования мощи LLM мы часто должны объединять множество взаимодействий с ними с вызовами других систем и источников информации.
Сначала мы рассмотрим базовый пример вызова OpenAI API.
1. Установите LangChain и OpenAI Python-привязки:
2. Мы предполагаем, что пользователь настроил учетную запись OpenAI и имеет доступ к ключу API. Вы можете установить его как переменную окружения или использовать менеджер секретов для хранения, например, тот, что предоставляет GitHub. Мы предположим, что ключ доступен как переменная окружения.
3. Теперь в нашем скрипте или модуле Python мы можем определить модель, которую будем вызывать, используя API OpenAI через оболочку LangChain. Здесь мы будем работать с моделью gpt-3.5-turbo
, которая является самой совершенной из моделей для чата GPT-3.5:
4. Затем LangChain облегчает создание конвейеров, используя LLM с помощью PromptTemplates
, что позволяет стандартизировать способ подсказывания и обработки ответа моделей:
5. Затем мы можем создать нашу первую “цепочку”, которая является механизмом для объединения связанных шагов в LangChain. Эта первая цепочка – это простой механизм, который принимает шаблон подсказки и ввод, чтобы создать соответствующую подсказку для LLM API и возвращать ответ в соответствующем формате:
Затем вы можете запустить этот вопрос и вывести результат в терминал для тестирования:
Это возвращает:
Как модель искусственного интеллекта я не имею доступа к информации в реальном времени. Однако, Андрей Макмахон является фрилансером-датасаентистом и программистом из Бристоля, Великобритания.
Учитывая, что я являюсь инженером МО, работающим в крупном банке и базирующимся в Глазго, Великобритания, вы можете видеть, что даже самые сложные LLM могут ошибаться. Это пример того, что мы называем галлюцинацией, когда LLM дает неверный, но правдоподобный ответ. Однако это все равно хороший пример создания базового механизма, с помощью которого мы можем программно взаимодействовать с LLM стандартизированным способом.
LangChain также предоставляет возможность объединения нескольких подсказок с помощью метода в цепочке, называемого ‘generate’:
Ответ на эту серию вопросов довольно подробный, но вот первый элемент возвращаемого объекта:
Опять же, не совсем правильно. Вы получаете идею! С некоторой инженерией подсказок и лучшим дизайном диалога это можно легко улучшить. Попробуйте поиграть и повеселиться.
Это было краткое введение в LangChain и LLM, которое только затрагивает поверхность, но, надеюсь, дает вам достаточно информации для внедрения вызовов этих моделей в ваши рабочие процессы машинного обучения. Давайте перейдем к обсуждению еще одного важного способа, с помощью которого LLM становятся частью рабочего процесса при разработке программного обеспечения с помощью помощников на основе ИИ.
Строим будущее с помощью LLMOps
В связи с ростом интереса к LLM недавно не было недостатка в людях, выражающих желание интегрировать эти модели во все виды программных систем. Для нас, как инженеров машинного обучения, это должно сразу же вызывать вопрос: “Что это будет означать в операционном плане?” Как обсуждалось на протяжении этой книги, соединение операций и разработка систем машинного обучения называется MLOps. Однако работа с LLM может привести к своим интересным проблемам, и поэтому возникло новое понятие – LLMOps, чтобы дать этой подобласти MLOps хороший маркетинг. Разве это действительно так сильно отличается? Я не думаю, что это настолько различно, но это следует рассматривать как подобласть MLOps с собственными дополнительными проблемами. Некоторые из основных проблем, которые я вижу в этой области, включают:
- Большая инфраструктура, даже для настройки: Как уже обсуждалось ранее, эти модели слишком велики для типичных организаций или команд, чтобы рассматривать возможность обучения собственных моделей, поэтому команды должны использовать сторонние модели, будь то открытые исходные коды или проприетарные, и настраивать их. Настройка моделей такого масштаба все равно будет очень дорогой, поэтому будет больше акцента на построении очень эффективного процесса ввода данных, подготовки и обучения.
- Управление моделью отличается: Когда вы обучаете свои собственные модели, эффективная инженерия машинного обучения требует определения хороших практик для версионирования моделей и хранения метаданных, которые предоставляют историю экспериментов и обучения, которые мы прошли для создания этих моделей. В мире, где модели все чаще предоставляются внешними сервисами, это немного сложнее сделать, так как у нас нет доступа к данным обучения, к основным артефактам модели и, вероятно, даже к подробной архитектуре модели. Метаданные версионирования, вероятно, будут опираться на общедоступные метаданные для модели, думайте в терминах gpt-4-v1.3 и подобных названий. Это немного информации для анализа, поэтому вам, вероятно, придется придумать способы обогащения этих метаданных, возможно, с помощью своих собственных примеров запуска и результатов тестирования, чтобы понять, как себя ведет модель в определенных сценариях. Это также связано с следующим пунктом.
- Откаты становятся более сложными: Если ваша модель предоставляется внешним сторонним сервисом, вы не контролируете план развития этого сервиса. Это означает, что если у версии 5 модели возникнут проблемы и вы захотите вернуться к версии 4, у вас может не быть такой возможности. Это другой вид “дрейфа” от дрейфа производительности модели, о котором мы подробно говорили в этой книге, но это станет все более важным. Это означает, что у вас должна быть своя собственная модель, возможно, с далеко не таким уровнем функциональности или масштаба, готовая в качестве последнего запасного варианта для переключения при возникновении проблем.
- Производительность модели является более сложной задачей: Как уже упоминалось в предыдущем пункте, поскольку фундаментальные модели обслуживаются в качестве внешних хостинговых сервисов, вы больше не находитесь под таким же контролем, как раньше. Это означает, что если вы обнаружите какие-либо проблемы с моделью, которую вы используете, будь то дрейф или какие-либо другие ошибки, у вас очень ограничены возможности действий, и вам придется обратить внимание на этот вариант отката, о котором мы только что говорили.
- Применение собственных ограничений будет ключевым: LLM могут выдавать неверные данные, ошибаться, могут воспроизводить тренировочные данные, а также могут непреднамеренно оскорблять человека, взаимодействующего с ними. Все это означает, что по мере того как эти модели будут приниматься все большим количеством организаций, будет возрастать необходимость разработки методов применения индивидуальных ограничений к системам, использующим их. Например, если LLM используется для работы чат-бота следующего поколения, можно представить, что между службой LLM и интерфейсом чата можно установить системный уровень, который проверяет на резкие изменения настроения и важные ключевые слова или данные, которые должны быть замаскированы. Этот уровень может использовать более простые модели машинного обучения и различные другие техники. В самом сложном случае он может попытаться гарантировать, что чат-бот не нарушает этические или другие нормы, установленные организацией. Если ваша организация сделала проблему климатического кризиса основной сферой своей деятельности, вы можете хотеть проводить скрининг разговора в реальном времени на предмет информации, противоречащей критическим научным результатам в этой области, как пример.
Поскольку эра фундаментальных моделей только начинается, скорее всего, возникнут все более сложные проблемы, чтобы заставить нас, как инженеров машинного обучения, быть занятыми на долгое время. Для меня это одна из самых захватывающих задач, с которой мы сталкиваемся как сообщество: как мы используем одну из самых сложных и передовых возможностей, когда-либо разработанных сообществом машинного обучения, таким образом, чтобы программное обеспечение по-прежнему работало безопасно, эффективно и надежно для пользователей изо дня в день. Готовы ли вы принять этот вызов? Давайте подробнее рассмотрим некоторые из этих тем, начиная с обсуждения проверки LLM.
Проверка LLMs
Проверка генеративных моделей AI существенно отличается и, казалось бы, более сложна, чем проверка других моделей машинного обучения. Основная причина этого заключается в том, что при создании контента вы часто создаете очень сложные данные в результатах, которые ранее не существовали! Если LLM возвращает параграф сгенерированного текста, когда его просят помочь суммировать и анализировать некий документ, как определить, что ответ «хороший»? Если вы просите LLM переформатировать некие данные в таблицу, как можно создать подходящую метрику, которая отражает, сделано ли это правильно? В контексте генерации, что на самом деле означают «производительность модели» и «изменение», и как их вычислить? Другие вопросы могут зависеть от конкретной ситуации. Например, если вы создаете решение поиска информации или генерации на основе поиска (см. генерацию на основе поиска для задач NLP, требующих глубоких знаний), как оценить достоверность текста, сгенерированного LLM?
Также существуют важные вопросы о том, как мы отсеиваем выводы, сгенерированные LLM, на предмет возможных предвзятых или токсичных результатов, которые могут причинить вред или нанести ущерб репутации организации, использующей модель. Мир валидации LLM сложен!
Что мы можем сделать? К счастью, все это не происходило в пустоте, и было выпущено несколько инструментов и наборов данных для оценки, которые могут помочь нам в нашем путешествии. Пока таких инструментов не так много, но мы рассмотрим основные моменты, чтобы вы были осведомлены о текущей ситуации и могли быть в курсе того, как все развивается. Давайте перечислим некоторые из наиболее известных фреймворков и наборов данных для оценки LLMs:
- OpenAI Evals: Это фреймворк, разработанный OpenAI, который позволяет разрабатывать тесты на основе предлагаемых завершений текста, сгенерированных LLMs, с помощью краудсорсинга. Основная концепция, лежащая в основе evals, – это «Completion Function Protocol», механизм для стандартизации тестирования строк, возвращаемых при взаимодействии с LLM. Фреймворк доступен на GitHub.
- Holistic Evaluation of Language Models (HELM): Этот проект от университета Стэнфорда называет себя «живым бенчмарком» для оценки производительности LLM. Он предоставляет широкий набор наборов данных, моделей и метрик, и показывает производительность для различных комбинаций. Это очень мощный ресурс, который вы можете использовать для создания своих собственных тестовых сценариев или просто для получения информации о рисках и потенциальных выгодах использования конкретного LLM для вашего случая использования. Бенчмарки HELM доступны по ссылке.
- Guardrails AI: Это пакет на языке Python, который позволяет выполнять проверку результатов LLM в том же стиле, что и Pydantic, что является очень мощной идеей! Вы также можете использовать его для создания контрольных потоков с LLM в случае возникновения проблем, например, если ответ на запрос не соответствует вашим заданным критериям; в этом случае вы можете использовать Guardrails AI для повторного запроса LLM с надеждой получить другой ответ. Для использования Guardrails AI вы указываете файл Reliable AI Markup Language (RAIL), который определяет формат запроса и ожидаемое поведение в файле, похожем на XML. Guardrails AI доступен на GitHub.
Постоянно создается еще несколько подобных фреймворков, но знакомство с основными концепциями и доступными наборами данных станет все более важным, поскольку все больше организаций захотят превратить системы на основе LLM из интересных концепций в рабочие решения. В предпоследнем разделе этой главы мы кратко обсудим некоторые конкретные проблемы, связанные с управлением «подсказками» при создании приложений на основе LLM.
PromptOps
При работе с генеративным искусственным интеллектом, который принимает текстовые данные, данные, которые мы вводим, часто называются «подсказками», чтобы отразить разговорный характер работы с этими моделями и концепцию того, что вход требует ответа, так же, как от человека. Для простоты мы будем называть любые входные данные, которые мы передаем LLM, подсказкой, независимо от того, в пользовательском интерфейсе это или через вызов API, независимо от характера предоставленного содержимого.
Подсказки часто существенно отличаются от данных, которые мы обычно подаем на вход модели машинного обучения. Они могут быть свободными по форме, иметь различную длину и, в большинстве случаев, выражать намерение о том, как мы хотим, чтобы модель действовала. В других задачах моделирования машинного обучения мы, конечно, можем подавать неструктурированные текстовые данные, но здесь отсутствует этот аспект намерения. Все это приводит к некоторым важным соображениям для нас, как инженеров по машинному обучению, работающих с этими моделями.
Во-первых, важно формирование подсказок. Термин «инжиниринг подсказок» недавно стал популярным в сообществе данных и относится к тому, что за проектирование содержимого и формата подсказок часто требуется много размышлений. Это то, о чем мы должны помнить, когда проектируем наши системы машинного обучения с использованием этих моделей. Мы должны задавать вопросы, такие как «Могу ли я стандартизировать форматы подсказок для моего приложения или случая использования?», «Могу ли я предоставить соответствующее дополнительное форматирование или содержимое поверх того, что пользователь или система ввода предоставляет для получения лучшего результата?» и подобные вопросы. Я буду продолжать называть это инжинирингом подсказок.
Во-вторых, подсказки не являются типичным входом для машинного обучения, и отслеживание и управление ими представляет собой новую интересную задачу. Эта задача усложняется тем, что одна и та же подсказка может давать совершенно разные результаты для разных моделей или даже для разных версий одной и той же модели. Мы должны внимательно мыслить о том, как отслеживать родословную наших подсказок и результаты, которые они генерируют. Я называю эту задачу управлением подсказками.
Наконец, у нас есть задача, которая не обязательно является уникальной для подсказок, но становится более актуальной, если мы позволяем пользователям системы вводить свои собственные подсказки, например, в чат-интерфейсах. В этом случае нам необходимо применить некоторые правила скрининга и обфускации к данным, поступающим в модель и выходящим из нее, чтобы обеспечить то, что модель не может быть “взломана” таким образом, чтобы обойти какие-либо ограничения. Мы также хотели бы защититься от атак, направленных на извлечение обучающих данных из этих систем, тем самым получая лично идентифицируемую или другую критическую информацию, которую мы не хотим делиться. Когда вы начнете исследовать этот новый мир LLMOps вместе с остальным миром, важно помнить о таких вызовах, связанных с подсказками.
Примите вызов!
Надеюсь, предыдущие абзацы убедили вас в том, что есть некоторые уникальные области для исследования в области LLMOps и что эта область зрела для инноваций. Эти аспекты только затрагивают поверхность этого богатого нового мира, но я лично считаю, что они подчеркивают, что у нас еще нет ответов. Готовы ли вы помочь строить будущее?