Развертывание и использование дообученных моделей
Введение: Жизнь после обучения
Добро пожаловать в пятый модуль. К этому моменту вы уже прошли путь от подготовки данных до запуска процесса 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).
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) на моделях, обученных для жесткого форматирования, может привести к тому, что модель начнет игнорировать выученную структуру.
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-решениях нельзя полагаться на одну точку отказа. Что произойдет, если:
- Ваша дообученная модель будет временно недоступна?
- Вы достигнете лимитов квоты (quota limits) для Tuned Models (они часто отличаются от лимитов базовых моделей)?
- Модель начнет выдавать галлюцинации на новых, неожиданных данных?
Лучшая практика — использовать паттерн Graceful Degradation (Изящная деградация). Если вызов дообученной модели не удался, система должна автоматически переключиться на мощную базовую модель (например, Gemini 1.5 Pro) с использованием техники Few-Shot Prompting (передача примеров в самом запросе).
Это будет стоить дороже (из-за длинного контекста), но сохранит работоспособность сервиса для пользователя.
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) этих моделей, чтобы на цифрах доказать, что дообучение принесло пользу.