Токенизация мультимодальных данных: Расчет и оптимизация

35 минут Урок 10

Токенизация мультимодальных данных: Расчет и оптимизация

Добро пожаловать в машинное отделение архитектуры ИИ-решений. Если в предыдущих уроках мы учились «водить» модель, то сегодня мы заглянем под капот, чтобы понять, сколько топлива она потребляет.

Для архитектора ИИ-решений понимание токенизации — это не просто вопрос лингвистики, это вопрос экономики и производительности. В мультимодальных моделях, таких как Gemini 3, понятие «токен» выходит далеко за рамки текста. Как посчитать «стоимость» картинки? Сколько контекста съедает минута видео 4K? И главное — как не обанкротить проект на этапе масштабирования?

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

1. Универсальная валюта ИИ: Токен

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

В текстовом мире мы привыкли к правилу: 1000 токенов ≈ 750 слов (для английского) или чуть меньше для кириллицы из-за особенностей кодировки BPE (Byte-Pair Encoding). Однако, когда мы подаем в модель изображение или видео, Gemini не «видит» картинку так, как мы. Она трансформирует её в последовательность векторов, которые для архитектуры Transformer выглядят так же, как и текстовые токены.

Почему это важно знать Архитектору?

  • Hard Limits: У Gemini 3 гигантское контекстное окно (до 2M+ токенов), но оно конечно. Час видео высокого разрешения может «съесть» значительную его часть.
  • Latency (Задержка): Время обработки запроса линейно (а иногда и квадратично в слоях внимания) зависит от количества входных токенов. Больше токенов = медленнее ответ.
  • Billing (Стоимость): Вы платите за токен. Оптимизация входных данных на 20% в высоконагруженном пайплайне может сэкономить десятки тысяч долларов в год.

python
import google.generativeai as genai
import os

# Базовая настройка API
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel('gemini-1.5-pro-latest') # Используем актуальную версию как прокси для Gemini 3

# Простой пример подсчета текстовых токенов
prompt = "Архитектура мультимодальных систем требует точности."

# Метод count_tokens - ваш лучший друг для предварительной оценки
response = model.count_tokens(prompt)
print(f"Текст: '{prompt}'")
print(f"Количество токенов: {response.total_tokens}")

# Обратите внимание: метод возвращает объект, содержащий total_tokens

2. Визуальная экономика: Изображения

С текстом всё интуитивно понятно. Но как Gemini считает картинки? Здесь подход кардинально отличается от ранних моделей, которые просто описывали картинку текстом.

Gemini использует нативную мультимодальность. Изображение разбивается на патчи (patches). Однако для упрощения расчетов и биллинга, API часто использует фиксированную стоимость или стоимость, зависящую от разрешения, но в дискретных шагах.

Алгоритм расчета (на примере Gemini 1.5/3):

В большинстве случаев изображение потребляет фиксированное количество токенов, независимо от того, является ли оно иконкой 64x64 или фотографией 4K. Для актуальных версий модели это значение часто составляет 258 токенов за изображение.

Нюанс для Архитектора:
Если ваше приложение отправляет 10 скриншотов интерфейса для анализа UX, вы потратите 10 * 258 = 2580 токенов. Это эквивалентно примерно 2000 слов текста. Это дешево, но если вы анализируете видеопоток, разбитый на кадры, цифры растут лавинообразно.

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

python
import PIL.Image

# Загружаем изображение (предположим, у нас есть файл architecture_diagram.png)
img = PIL.Image.open('architecture_diagram.png')

# Подсчет токенов для изображения вместе с промптом
response = model.count_tokens(["Проанализируй эту диаграмму:", img])

print(f"Токены (Текст + Изображение): {response.total_tokens}")

# Практический эксперимент: 
# Попробуйте изменить размер изображения (img.resize) и проверить, 
# изменится ли количество токенов. В большинстве режимов Gemini - нет.
resized_img = img.resize((256, 256))
response_resized = model.count_tokens(["Проанализируй миниатюру:", resized_img])
print(f"Токены (Текст + Миниатюра): {response_resized.total_tokens}")

3. Тяжелая артиллерия: Видео и Аудио

Видео — это самый ресурсоемкий тип данных. Наивная ошибка — думать о видео как о «30 изображениях в секунду». Если бы модель считала каждый кадр видео 60 FPS как отдельное изображение (258 токенов), одна минута видео стоила бы: 60 сек * 60 кадров * 258 токенов = 928,800 токенов. Это безумие.

Gemini использует сэмплирование. Модель не смотрит каждый кадр. Она выбирает кадры с частотой (обычно) 1 кадр в секунду для визуального ряда, плюс отдельно токенизирует аудиодорожку.

Формула расчета видео (Gemini Pro/Ultra):

  • Визуальная часть: ~263 токена за секунду видео (при сэмплировании 1 FPS).
  • Аудио часть: ~32 токена за секунду аудио.

Таким образом, 1 минута видео со звуком обойдется примерно в:
60 * (263 + 32) = 17,700 токенов.

Это много, но подъемно для окна в 2 миллиона токенов. Это позволяет загружать целые фильмы или часовые лекции.

Оптимизация аудио

Аудио само по себе (без видео) крайне эффективно. Час аудиозаписи разговора — это всего лишь ~115k токенов. Это делает Gemini мощнейшим инструментом для транскрибации и анализа колл-центров, подкастов и совещаний, где видеоряд не важен.

Упражнение

Вы проектируете систему для анализа записей с камер видеонаблюдения (Security AI). Камера пишет в 1080p, 24fps. Вам нужно анализировать последние 10 минут записи на предмет аномалий каждые 10 минут. Рассчитайте примерное потребление токенов за один запрос (анализ 10-минутного фрагмента), учитывая, что звук на камерах отключен. Напишите функцию на Python для расчета.

4. Стратегии оптимизации: Думай как Архитектор

Зная, как считаются токены, мы можем применять стратегии для снижения костов и уменьшения задержки (Latency).

А. Снижение частоты кадров (Downsampling)

Если ваша задача — определить, есть ли на видео человек в красной куртке, вам не нужно 1 FPS. Вы можете самостоятельно извлечь кадры с частотой 1 кадр в 5 секунд, склеить их в коллаж или отправить как серию изображений. Это снизит потребление токенов в 5 раз.

Б. Удаление лишней модальности

Если вы анализируете вебинар ради содержания презентации, удалите аудиодорожку перед отправкой. Если вы анализируете тональность голоса оператора, отправляйте только аудио (без черного экрана видео).

В. Context Caching (Кэширование контекста)

Это killer-feature Gemini. Представьте, что вы загрузили 500-страничную спецификацию или часовое обучающее видео. Пользователь задает вопросы по этому материалу.

Без кэширования: Каждый вопрос = повторная отправка видео (18k токенов) + вопрос. Вы платите за видео каждый раз.
С кэшированием: Вы платите за загрузку видео один раз (плюс небольшая стоимость хранения), а последующие запросы стоят копейки (только текст вопроса и ответа).

Правило большого пальца: Если контекст будет использоваться более 3-4 раз, используйте Context Caching. Это снижает Latency (не нужно пересчитывать токены тяжелого файла) и Cost.

python
import time

# Псевдокод использования кэширования контекста

# 1. Создаем кэш для тяжелого файла
video_file = genai.upload_file(path="training_video.mp4")

# Ждем обработки файла
while video_file.state.name == "PROCESSING":
    time.sleep(2)
    video_file = genai.get_file(video_file.name)

# Создаем кэш с TTL (временем жизни)
cache = genai.caching.CachedContent.create(
    model="models/gemini-1.5-pro-001",
    display_name="course_video_cache",
    system_instruction="Ты эксперт по этому видеокурсу.",
    contents=[video_file],
    ttl=3600 # Живет 1 час
)

# 2. Используем кэш для создания модели
model_cached = genai.GenerativeModel.from_cached_content(cached_content=cache)

# 3. Задаем вопросы. Здесь мы платим ТОЛЬКО за текст вопроса и генерацию ответа.
# Токены видео уже не считаются в стоимость запроса (но есть стоимость аренды кэша).
response = model_cached.generate_content("О чем говорят на 15-й минуте?")
print(response.text)

5. Управление квотами и ограничениями

Даже с оптимизацией вы можете упереться в лимиты RPM (Requests Per Minute) или TPM (Tokens Per Minute). Архитектор должен предвидеть это.

  • Batching (Пакетная обработка): Если задержка не критична, объединяйте несколько мелких текстовых задач в один большой промпт. Это экономит на накладных расходах HTTP-запросов, но увеличивает потребление токенов за раз.
  • Fallback стратегии: Если Gemini Pro (дорогая модель) перегружена или вы превысили лимит токенов, переключайтесь на Gemini Flash для простых задач. Она быстрее и дешевле, и у неё свои, более высокие лимиты.
  • Token Counting Middleware: Внедрите в своё приложение промежуточный слой, который считает токены до отправки запроса (используя локальный токенизатор или метод `countTokens`). Если запрос превышает бюджет, отклоняйте его или обрезайте контекст на стороне клиента, не беспокоя API.

Вопрос

У вас есть 10-минутный видеофайл с аудиодорожкой. Вы хотите проанализировать его с помощью Gemini 1.5 Pro, используя стратегию Context Caching, так как планируете задать к нему 50 вопросов. За что вы заплатите в ПЕРВОМ запросе (создание кэша)?