Интерливинг: Смешивание текста, изображений и аудио в одном промпте

40 минут Урок 7

Введение: За пределами «Картинка + Подпись»

Добро пожаловать на урок, который изменит ваше представление о взаимодействии с ИИ. Долгое время мультимодальность воспринималась довольно примитивно: вы даете модели картинку, она её описывает. Или вы даете аудиофайл, а она делает транскрипцию. Это режим «один ко многим» или «многие к одному», но он всегда был линейным и раздельным.

Gemini 3 меняет правила игры с помощью концепции интерливинга (Interleaving).

Интерливинг — это способность модели воспринимать и обрабатывать смешанную последовательность данных разного типа в рамках одного потока контекста. Это не просто «прикрепить файл». Это возможность построить диалог так:

«Посмотри на этот график [Изображение 1], затем послушай, что сказал директор на собрании [Аудио], и сравни это с прогнозом на следующий квартал [Изображение 2]. В чем расхождение?»

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

Анатомия мультимодального промпта

Чтобы понять интерливинг, нужно спуститься на уровень API. В старых моделях (например, ранних версиях GPT-4 или PaLM) часто существовало разделение: системный промпт, затем текст пользователя, а изображения шли отдельным вложением.

В Gemini API структура запроса построена вокруг списка parts (частей). Сообщение пользователя — это не просто строка, это массив объектов. И порядок этих объектов имеет критическое значение.

Почему порядок важен?

Модель читает входные данные последовательно, слева направо (или сверху вниз), как человек читает книгу с иллюстрациями.

  • Если вы напишете: «Что на этой картинке?» -> [Изображение], модель воспримет это как вопрос, относящийся к следующему за ним контенту.
  • Если вы напишете: [Изображение] -> «Опиши стиль этого художника», контекст изображения уже загружен в «рабочую память» модели к моменту чтения вопроса.

Интерливинг позволяет создавать так называемые многошаговые рассуждения (Multi-step reasoning) без необходимости делать несколько сетевых запросов. Вы можете загрузить целый кейс в один промпт.

python
import google.generativeai as genai
import PIL.Image

# Представьте, что мы уже настроили API ключ
# genai.configure(api_key='YOUR_API_KEY')

model = genai.GenerativeModel('gemini-1.5-pro') # Используем Pro для лучшей мультимодальности

# Загружаем изображения (предположим, это локальные файлы)
img_chart_2023 = PIL.Image.open('chart_2023.png')
img_chart_2024 = PIL.Image.open('chart_2024.png')

# Создаем ИНТЕРЛИВИНГОВЫЙ промпт
# Обратите внимание: это один список, где типы данных смешаны
prompt_parts = [
    "Я хочу, чтобы ты выступил в роли бизнес-аналитика.",
    "Вот показатели наших продаж за 2023 год:",
    img_chart_2023,
    "Как видишь, был спад в третьем квартале.",
    "А теперь посмотри на 2024 год:",
    img_chart_2024,
    "Сравни динамику третьего квартала на обоих графиках. Удалось ли нам решить проблему сезонности?"
]

# Отправляем запрос
response = model.generate_content(prompt_parts)
print(response.text)

Глубокое погружение: «Сэндвич» из модальностей

В примере выше мы использовали структуру Текст -> Изображение -> Текст -> Изображение -> Текст. Это классический паттерн, который я называю «Сэндвич».

Почему это работает лучше, чем просто загрузить два изображения и спросить «сравни их»?

  1. Фокусировка внимания (Attention Guidance): Текст, стоящий перед изображением, работает как прайминг. Фраза «Вот показатели продаж» настраивает модель искать на картинке цифры и графики, а не, скажем, цвета или дизайн слайда.
  2. Промежуточные выводы: Текст между изображениями («Как видишь, был спад...») помогает модели сформировать промежуточное суждение. Вы как бы берете модель за руку и ведете её по логической цепочке.

Работа с Аудио в интерливинге

Аудио для Gemini — это такой же токен, как и текст или картинка. Модель не просто транскрибирует речь в текст; она слышит интонацию, паузы, фоновые шумы (если это поддерживается конкретной версией модели) и может учитывать это в контексте.

Представьте сценарий технической поддержки. Пользователь присылает фото сломанного прибора и аудиосообщение с описанием звука, который прибор издает.

python
# Пример с использованием Аудио и Изображения
# Для аудио нам нужно загрузить файл через File API, так как сырые байты аудио 
# в прямом запросе могут быть слишком тяжелыми или не поддерживаться напрямую в parts (зависит от версии SDK).

# Загрузка файла в облако Google (кэш/хранилище для обработки)
audio_file = genai.upload_file(path='strange_noise.mp3')
broken_device_img = PIL.Image.open('device_photo.jpg')

interleaved_prompt = [
    "Пользователь жалуется на поломку стиральной машины.",
    "Вот фотография панели управления в момент ошибки:",
    broken_device_img,
    "Пользователь говорит, что экран мигает. А теперь послушай звук, который она издает:",
    audio_file,
    "Основываясь на коде ошибки с фото и характере стука в аудио, какой узел вероятнее всего вышел из строя?"
]

response = model.generate_content(interleaved_prompt)
print(response.text)

Лучшие практики и подводные камни

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

  • Явные референсы: Если у вас 3 изображения, не пишите просто «на картинке». Пишите «на первом графике», «на фото двигателя», «на последнем скриншоте». Хотя модель понимает порядок, явные указания повышают точность.
  • Контроль токенов: Изображения и аудио потребляют много токенов. Gemini 1.5 Pro имеет огромное контекстное окно (до 2 млн токенов), но это не значит, что нужно быть расточительным. Чем больше «шума» в контексте, тем выше шанс галлюцинаций. Обрезайте аудио до сути и уменьшайте разрешение изображений, если детализация пикселей не важна.
  • Временная логика (для Видео/Аудио): Если вы используете видео (которое для модели часто является последовательностью кадров + аудио), помните, что модель воспринимает его линейно. Вы можете спрашивать: «Что произошло сразу после того звука взрыва?».

Паттерн «Few-Shot Prompting» с изображениями

Интерливинг позволяет делать мощнейший Few-Shot (обучение на примерах). Вы можете показать модели:

[Фото плохого товара] -> «Это брак, категория C»
[Фото среднего товара] -> «Это норма, категория B»
[Фото идеального товара] -> «Это идеал, категория A»
[Новое фото] -> «Какая это категория?»

Этот метод работает на порядок лучше, чем просто текстовое описание критериев качества.

Упражнение

Создайте сценарий 'Умный Риелтор'. <br><br>Задача: Написать структуру списка `parts` (псевдокод или Python), который имитирует запрос пользователя, выбирающего квартиру.<br><br>Вводные данные:<br>1. Фотография гостиной (img_living_room).<br>2. Фотография вида из окна (img_view).<br>3. Аудиозапись с шумом улицы при открытом окне (audio_noise).<br><br>Сценарий промпта:<br>- Сначала модель должна оценить дизайн гостиной.<br>- Затем оценить вид из окна.<br>- Затем прослушать аудио и сделать вывод: подходит ли эта квартира для семьи с маленьким ребенком, учитывая уровень шума и безопасность (вид из окна).

Вопрос

Как Gemini обрабатывает список parts, содержащий [Текст А, Изображение Б, Текст В]?