Токенизация нового поколения и управление параметрами генерации
Урок: Токенизация нового поколения и управление параметрами генерации
Приветствую вас во втором уроке первого модуля. Если на прошлом занятии мы говорили об архитектуре Gemini 3 с высоты птичьего полета, то сегодня мы спустимся в «машинное отделение».
Мы разберем две фундаментальные вещи, без понимания которых невозможно построить качественное Enterprise-решение: как модель «видит» информацию (токенизация) и как мы можем управлять процессом её «мышления» (параметры генерации).
Многие разработчики воспринимают эти настройки как данность: выставил temperature=0.7 и забыл. Но в Gemini 3, обладающей мультимодальными возможностями и огромным контекстным окном, цена ошибки в этих настройках возрастает кратно. Неправильная стратегия токенизации может раздуть бюджет в 10 раз, а неверный параметр top_p — превратить аналитического бота в генератора галлюцинаций.
О чем пойдет речь:
- Мультимодальная токенизация: Как текст, изображения и видео превращаются в числа.
- Экономика токенов: Как считать, оптимизировать и предсказывать затраты.
- Анатомия генерации: Математика, стоящая за Temperature, Top-K и Top-P.
- Детерминизм vs Креативность: Паттерны настройки для разных бизнес-задач.
Часть 1: Эволюция Токенизации в Gemini 3
Давайте начнем с базы. Вы наверняка знаете, что LLM не читают текст так, как мы. Они оперируют токенами. Традиционно токен — это часть слова (примерно 0.75 слова для английского языка). Но Gemini 3 — это нативно мультимодальная модель. Это меняет правила игры.
Унифицированное пространство токенов
В старых архитектурах (до Gemini 1.0) для картинок использовались отдельные энкодеры (например, CLIP), а для текста — свои. Gemini 3 использует единый словарь.
Как это работает на практике?
- Текст: Используется продвинутый BPE (Byte-Pair Encoding) токенизатор, оптимизированный под код и многоязычность. Он эффективнее сжимает кириллицу и языки с иероглифической письменностью по сравнению с предшественниками.
- Изображения: Картинка разбивается на фрагменты (patches), каждый из которых кодируется в последовательность токенов. Для Gemini 3 стандартное изображение высокой четкости может занимать фиксированное количество токенов (например, 258 токенов), независимо от его сложности, но зависимо от разрешения.
- Видео: Видео не превращается в набор картинок «в лоб». Модель сэмплирует кадры (например, 1 кадр в секунду) и кодирует их, но также учитывает временную зависимость между кадрами, сжимая информацию.
Почему это важно для Enterprise?
Когда вы отправляете в API 100 страниц текста и 5-минутное видео, вы должны точно понимать, сколько это «весит» в контекстном окне. В Gemini 3 окно огромное (до 2 млн токенов и выше), но оно не бесконечное, и стоимость инференса рассчитывается именно за токены.
import google.generativeai as genai
import PIL.Image
# Инициализация модели Gemini 3 (Pro или Ultra)
model = genai.GenerativeModel('gemini-3.0-pro')
# Пример 1: Подсчет токенов для текста
text_prompt = "Объясни архитектуру трансформеров на примере кулинарного рецепта."
text_count = model.count_tokens(text_prompt)
print(f"Токенов в тексте: {text_count.total_tokens}")
# Пример 2: Подсчет токенов для мультимодального запроса
# Загружаем изображение (предположим, у нас есть файл architecture_diagram.png)
img = PIL.Image.open('architecture_diagram.png')
# Комбинированный запрос: Текст + Изображение
multimodal_prompt = [text_prompt, img]
multimodal_count = model.count_tokens(multimodal_prompt)
print(f"Токенов в мультимодальном запросе: {multimodal_count.total_tokens}")
# Обратите внимание: разница между multimodal_count и text_count
# покажет точную 'стоимость' изображения для модели.
Оптимизация токенов: Практические советы
В production-системах каждый токен — это деньги. Вот несколько стратегий управления токенизацией в Gemini 3:
- Сжатие контекста: Если вы передаете историю чата, не обязательно передавать её целиком. Используйте суммаризацию предыдущих диалогов. Gemini 3 отлично понимает сжатый контекст.
- Разрешение изображений: API позволяет управлять детализацией обработки изображений. Если вам нужно просто определить, есть ли на фото кошка, не отправляйте 4K изображение в полном качестве. Это сэкономит сотни токенов.
- Кэширование контекста (Context Caching): Это киллер-фича для Gemini. Если у вас есть огромная база знаний (например, книга правил или кодовая база), которую вы используете в каждом запросе, вы можете закэшировать эти токены один раз и платить за них по сниженному тарифу в последующих запросах. Это снижает latency и стоимость.
Часть 2: Управление параметрами генерации (Generation Config)
Теперь, когда мы поняли, как данные входят в модель, давайте разберем, как они выходят. Процесс генерации текста — это вероятностный процесс. Модель предсказывает следующий токен на основе всех предыдущих.
У нас есть «рычаги управления», которые находятся в объекте GenerationConfig. Рассмотрим их физический смысл.
1. Temperature (Температура)
Это самый известный, но часто неправильно понимаемый параметр. Диапазон обычно от 0.0 до 2.0.
- Механика: Перед тем как выбрать следующий токен, модель рассчитывает вероятности (логиты) для всех слов в словаре. Температура — это коэффициент скалирования этих логитов перед применением функции Softmax.
- Низкая температура (< 0.5): Различия между вероятностями усиливаются. Вероятный токен становится еще более вероятным. Модель становится консервативной, детерминированной и фактологической. Идеально для кода, SQL-запросов, извлечения данных.
- Высокая температура (> 1.0): Распределение вероятностей сглаживается. «Слабые» кандидаты получают шанс быть выбранными. Это добавляет креативности, но повышает риск галлюцинаций.
Важно: При temperature=0 модель всегда будет выбирать наиболее вероятный токен (Greedy Decoding). Один и тот же запрос всегда даст один и тот же ответ.
2. Top-K и Top-P (Nucleus Sampling)
Эти параметры работают в тандеме с температурой, ограничивая пул токенов, из которого модель делает выбор.
- Top-K: Модель рассматривает только K самых вероятных токенов. Если K=1, это то же самое, что Greedy Decoding. Если K=40 (стандартное значение), модель отсекает «длинный хвост» маловероятных слов, что помогает избежать генерации бреда, сохраняя разнообразие.
- Top-P (Nucleus): Более динамичный метод. Модель выбирает минимальный набор токенов, чья совокупная вероятность превышает P.
Пример: Если P=0.9, а у нас есть токены с вероятностями [0.5, 0.3, 0.15, 0.05...], модель выберет первые три (0.5+0.3+0.15 = 0.95 > 0.9) и будет выбирать только из них.
Золотое правило настройки: Обычно рекомендуется менять либо Температуру, либо Top-P, но не оба сразу экстремально. Для точных задач (RAG, классификация) используйте низкую температуру и низкий Top-P.
# Настройка конфигурации генерации для разных сценариев
# Сценарий 1: Строгий аналитик данных / Генерация SQL
# Нам нужна точность, воспроизводимость и никаких фантазий.
config_strict = genai.GenerationConfig(
temperature=0.0, # Полный детерминизм
top_p=0.95, # Высокий порог, но при temp=0 это менее важно
max_output_tokens=1024,
stop_sequences=[";"] # Остановиться после завершения SQL запроса
)
# Сценарий 2: Маркетинговый копирайтер
# Нам нужны яркие метафоры и разнообразные формулировки.
config_creative = genai.GenerationConfig(
temperature=1.2, # Высокая креативность
top_p=0.9, # Допускаем широкий спектр слов
top_k=40, # Но отсекаем совсем уж бессмысленные варианты
candidate_count=1 # Генерируем один вариант (в некоторых версиях API можно >1)
)
# Применение в вызове
response = model.generate_content(
"Напиши слоган для новой марки кофе.",
generation_config=config_creative
)
print(response.text)
Часть 3: Продвинутые техники управления (Advanced Controls)
Помимо базовой тройки параметров, Gemini 3 предлагает инструменты для специфических задач.
JSON Mode (Structured Output)
Одна из главных болей при работе с LLM — заставить их выдавать чистый JSON без вступительных слов вроде «Конечно, вот ваш JSON...». В Gemini 3 реализован режим response_mime_type.
Установив response_mime_type="application/json", вы принуждаете модель генерировать валидный JSON. Это критически важно для интеграции API в микросервисы, где вывод модели сразу парсится кодом.
Stop Sequences (Стоп-последовательности)
Вы можете задать список строк, при появлении которых генерация мгновенно прекратится. Это полезно для:
- Диалогов: Остановка, когда модель пытается генерировать реплику за пользователя (например, "User:").
- Структурированных форматов: Остановка после закрывающего тега XML или скобки JSON.
Max Output Tokens
Жесткое ограничение длины ответа. Полезно для контроля бюджета и времени отклика (latency). Если пользователю нужен лишь краткий заголовок, нет смысла позволять модели генерировать эссе на 2000 токенов.
Создайте функцию на Python, которая использует Gemini 3 для извлечения информации из неструктурированного текста резюме. <br><br>Требования:<br>1. Функция должна принимать текст резюме.<br>2. Возвращать данные СТРОГО в формате JSON с полями: 'name' (строка), 'skills' (список строк), 'experience_years' (число).<br>3. Использовать параметры генерации, исключающие 'фантазии' модели (максимальная фактологичность).<br>4. Предусмотреть ограничение по токенам, так как JSON не должен быть огромным.
Вы разрабатываете чат-бота для технической поддержки, который должен отвечать строго по документации, не выдумывая факты. При этом ответы должны быть естественными, не 'роботизированными', но точными по сути. Какую комбинацию параметров лучше всего выбрать?
Резюме урока
Сегодня мы разобрали механику взаимодействия с Gemini 3 на низком уровне. Понимание токенизации позволяет вам контролировать расходы и работать с мультимодальностью. Умение настраивать GenerationConfig дает вам контроль над «характером» модели.
В следующем уроке мы перейдем к теме Prompt Engineering 2.0 и узнаем, как новые возможности контекстного окна меняют подход к написанию промптов.