Развертывание и использование дообученных моделей

40 минут Урок 25

Введение: Жизнь после обучения

Добро пожаловать в пятый модуль. К этому моменту вы уже прошли путь от подготовки данных до запуска процесса Fine-Tuning (дообучения). Вы нажали кнопку «Start Tuning» или запустили скрипт, и процесс пошел. Но что дальше?

Многие разработчики ошибочно полагают, что на этом работа заканчивается. На самом деле, создание модели — это только 30% успеха. Оставшиеся 70% — это грамотное внедрение (деплой), мониторинг и интеграция дообученной модели в продакшн-окружение.

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

1. Идентификация и статус модели

Когда вы запускаете процесс дообучения, Gemini API не выдает вам готовую модель мгновенно. Это асинхронный процесс. Сразу после запуска вы получаете объект метаданных, содержащий resource_name (имя ресурса).

Это имя обычно выглядит так: tunedModels/my-custom-model-name-v1 или содержит автоматически сгенерированный ID.

Машина состояний (State Machine)

Прежде чем отправлять промпты, критически важно понимать, в каком состоянии находится модель. У неё есть три основных статуса:

  • CREATING: Модель обучается. Попытка вызвать generate_content приведет к ошибке 400 или 404.
  • ACTIVE: Модель готова к работе. Только в этом статусе можно делать инференс.
  • FAILED: Обучение не удалось. Это может случиться из-за проблем с форматом данных, валидацией или внутренних ошибок сервиса.

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

python
import google.generativeai as genai
import time

# Настройка API ключа
genai.configure(api_key="ВАШ_API_KEY")

def wait_for_model_activation(model_name):
    """
    Блокирует выполнение до тех пор, пока модель не станет активной.
    """
    print(f"Ожидание активации модели {model_name}...")
    
    while True:
        # Получаем актуальный объект модели
        model_info = genai.get_tuned_model(model_name)
        state = model_info.state.name
        
        print(f"Текущий статус: {state}")
        
        if state == 'ACTIVE':
            print("Модель готова к работе!")
            return model_info
        elif state == 'FAILED':
            raise Exception(f"Обучение модели завершилось с ошибкой: {model_info.description}")
        
        # Пауза перед следующей проверкой (polling)
        time.sleep(10)

# Пример использования (предполагается, что у вас есть имя модели)
# wait_for_model_activation("tunedModels/generate-sql-expert-v1")

2. Инференс: Использование модели в коде

Как только модель перешла в статус ACTIVE, работа с ней практически не отличается от работы с базовыми моделями (например, gemini-1.5-pro), но есть нюанс в инициализации.

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

Важность параметров генерации

При использовании Fine-Tuned моделей параметры temperature (температура) и top_p играют особую роль:

  • Низкая температура (ближе к 0): Если вы обучали модель для строгих задач (классификация, JSON, SQL), снижайте температуру. Модель уже «видела» паттерны в обучающей выборке, ей не нужно «фантазировать».
  • Средняя температура: Если вы обучали модель стилю речи или креативному письму, оставьте пространство для вариативности.

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

python
def run_inference(tuned_model_name, prompt):
    """
    Запуск генерации на дообученной модели.
    """
    # Инициализация именно с вашим tuned_model_name
    # Важно: Не используйте здесь 'gemini-1.5-pro', используйте 'tunedModels/...' 
    model = genai.GenerativeModel(model_name=tuned_model_name)
    
    # Конфигурация генерации
    generation_config = genai.types.GenerationConfig(
        temperature=0.2, # Снижаем температуру для большей точности следования паттернам обучения
        top_p=0.8,
        top_k=40,
        max_output_tokens=1024,
    )

    try:
        response = model.generate_content(
            prompt,
            generation_config=generation_config
        )
        return response.text
    except Exception as e:
        print(f"Ошибка при генерации: {e}")
        return None

# Пример вызова
# result = run_inference("tunedModels/my-sql-helper", "Преобразуй вопрос в SQL: Сколько пользователей зарегистрировалось вчера?")
# print(result)

3. Паттерны надежности: Fallback-стратегии

В Enterprise-решениях нельзя полагаться на одну точку отказа. Что произойдет, если:

  1. Ваша дообученная модель будет временно недоступна?
  2. Вы достигнете лимитов квоты (quota limits) для Tuned Models (они часто отличаются от лимитов базовых моделей)?
  3. Модель начнет выдавать галлюцинации на новых, неожиданных данных?

Лучшая практика — использовать паттерн Graceful Degradation (Изящная деградация). Если вызов дообученной модели не удался, система должна автоматически переключиться на мощную базовую модель (например, Gemini 1.5 Pro) с использованием техники Few-Shot Prompting (передача примеров в самом запросе).

Это будет стоить дороже (из-за длинного контекста), но сохранит работоспособность сервиса для пользователя.

python
def robust_generation(tuned_model_name, base_model_name, prompt, few_shot_examples):
    """
    Пытается использовать Tuned Model, при ошибке откатывается к Base Model с примерами.
    """
    print("Попытка 1: Использование Fine-Tuned модели...")
    try:
        # Попытка вызова дообученной модели
        tuned_model = genai.GenerativeModel(model_name=tuned_model_name)
        response = tuned_model.generate_content(prompt)
        return response.text, "tuned"
        
    except Exception as e:
        print(f"⚠️ Ошибка Tuned Model: {e}. Переключение на Fallback...")
        
        # Fallback: Формируем контекст из примеров для базовой модели
        # few_shot_examples - это список строк или история чата
        full_prompt = "Следуй примерам ниже:\n\n" + few_shot_examples + "\n\nЗадание: " + prompt
        
        base_model = genai.GenerativeModel(model_name=base_model_name)
        response = base_model.generate_content(full_prompt)
        return response.text, "base_fallback"

4. Управление библиотекой моделей

Со временем у вас накопится множество экспериментов: v1, v1.2-more-data, v2-clean-dataset. Если не управлять этим зоопарком, вы запутаетесь.

API позволяет не только создавать, но и удалять модели. Это важно по двум причинам:

  • Квоты: У вас есть лимит на количество дообученных моделей в проекте.
  • Безопасность: Старые модели могут быть обучены на устаревших или чувствительных данных, которые больше не должны использоваться.

Обновление моделей

Важно понимать: Fine-Tuned модели в Gemini неизменяемы (immutable). Вы не можете «доучить» уже созданную модель новыми данными. Чтобы обновить модель, вы должны создать новую модель, используя старый датасет + новые данные. Поэтому версионирование в названиях моделей (суффиксы -001, -v2) критически важно.

Упражнение

Напишите Python-скрипт, который выполняет следующие действия: 1) Получает список всех ваших дообученных моделей. 2) Находит среди них те, которые находятся в статусе 'FAILED'. 3) Удаляет эти модели, чтобы очистить квоты. Выведите на экран имена удаленных моделей.

Вопрос

Вы только что запустили обучение модели и ваш скрипт немедленно попытался выполнить `generate_content` с новой моделью. Что произойдет?

Заключение

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

Ключевые выводы:

  • Всегда проверяйте статус модели перед использованием.
  • Fine-tuned модели неизменяемы: обновление = создание новой.
  • Используйте Fallback-стратегии для защиты продакшена.
  • Подбирайте параметры temperature индивидуально под дообученную модель, они могут отличаться от базовых.

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