Версионирование моделей ИИ и A/B-тестирование

Материал из Документация Ключ-АСТРОМ

В контексте моделей ИИ A/B-тестирование имеет решающее значение для оценки влияния изменений в обучающем наборе данных, векторных базах данных, алгоритмах, функциях или конфигурациях на ключевые показатели эффективности, такие как точность, вовлеченность пользователей или доход. Путем предъявления различных сегментов пользователей каждому варианту и анализа их взаимодействия A/B-тестирование предоставляет основанные на данных сведения о том, какая версия конкретной модели обеспечивает лучшие результаты. Этот метод гарантирует, что обновления моделей ИИ будут основаны на измеримых улучшениях, минимизируя риски и оптимизируя результаты в реальных приложениях.

Что вы узнаете

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

Шаги

Общие этапы следующие:

  1. Изучение текущего дашборда.
  2. Настройка приложения для отправки пользовательских метаданных.
  3. Адаптация существующего дашборда.

Подробности каждого этапа см. ниже.

Изучение текущего дашборда

В рамках приложения AI Observability мы предоставляем готовый дашборд.  

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

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

Давайте посмотрим, как можно передать ваши пользовательские данные в Ключ-АСТРОМ.

Настройка вашего приложения

Ваше приложение уже должно быть оснащено необходимыми инструментами в соответствии с руководством по началу работы. Теперь мы можем адаптировать его для распространения дополнительных метаданных. Для этого мы используем OpenTelemetry и его API.

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

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

from traceloop.sdk import Traceloop

headers = { "Authorization": "Api-Token <YOUR_DT_API_TOKEN>" }

Traceloop.init(

    app_name="<your-service>",

    api_endpoint="https://<YOUR_ENV>.live.astromkey.com/api/v2/otlp", # or OpenTelemetry Collector URL

    headers=headers,

    resource_attributes={

        'model.version': os.getenv('MODEL_VERSION'),

        'dataset.id': os.getenv('DATASET_ID'),

    }

)

Параметр resource_attributes сопоставляет атрибуты, передаваемые в OpenTelemetry Resource Attributes. Следовательно, эти свойства прикрепляются ко всем сигналам, передаваемым в Ключ-АСТРОМ.

Это полезно для статических метаданных. Однако в некоторых случаях нам нужно добавить информацию, специфичную для запроса, например, значение флага функции во время эксперимента. Для этого мы можем использовать OpenTelemetry и создать диапазон, содержащий атрибуты запроса.

from opentelemetry import trace

def handle_request():

   ...

   with trace.get_tracer("my-awesome-app").start_as_current_span(name="handle_request") as span:

       span.set_attribute("feature_flag.key", "my-new-feature-enabled")

       span.set_attribute("feature_flag.result.value", "true")

       # rest of the handling logic

       ...

Адаптация существующего дашборда

Прежде чем изменять дашборд, давайте создадим копию существующего. Чтобы продублировать дашборд, откройте меню рядом с названием панели и выберите Дублировать.

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

Мы можем добавить первую переменную для версии модели. Назовём её ModelVersion и используем DQL в качестве определения типа. Наконец, давайте используем следующее DQL-выражение для заполнения возможных значений переменной:

fetch spans

| filter isNotNull(gen_ai.system) and isNotNull(model.version)

| summarize versions = collectDistinct(model.version)

| expand versions

Запрос извлекает все сегменты, имеющие значения для атрибутов gen_ai.system и model.version. Атрибут model.version— это тот, который мы добавили вручную на предыдущем шаге. Атрибут gen_ai.system устанавливается для всех сегментов, связанных с ИИ. Затем мы собираем все уникальные значения для атрибута model.version. Наконец, мы указываем DQL рассматривать каждое значение model.version как отдельное значение для заполнения выпадающего меню переменной с помощью команды expand. Выберите Выполнить, чтобы убедиться, что получены правильные значения.

Теперь мы можем использовать $ModelVersion в качестве переменной в DQL, и она будет заполнена значением, выбранным из выпадающего меню. Мы можем изменить существующие блоки, чтобы убедиться, что новая переменная используется для правильной фильтрации данных, добавив новое операторное выражение фильтра:

| filter model.version == $ModelVersion

Вот и всё! Теперь вы можете добавить больше переменных для фильтрации данных, используя дополнительные пользовательские метаданные.