Смешанные промпты (Interleaved Inputs): Текст, код и медиа в одном запросе

45 минут Урок 9

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

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

Смешанные промпты (Interleaved Inputs) — это возможность отправлять модели последовательность разнородных данных в одном запросе. Представьте, что вы объясняете задачу коллеге. Вы не просто молча суете ему в руку папку с фото. Вы говорите: «Посмотри на этот график (показываете график), сравни его с таблицей прошлого года (показываете таблицу), и обрати внимание вот на эту аномалию (текстовое пояснение), а затем напиши отчет».

Именно так работает Gemini. Она воспринимает информацию последовательно, где текст, изображения и видео являются равноправными токенами в потоке данных. Это открывает двери для сложных сценариев: от few-shot обучения на визуальных примерах до глубокого контекстного анализа.

Анатомия смешанного запроса

Традиционные LLM привыкли к структуре «Системный промпт -> Сообщение пользователя». В мультимодальном мире Gemini структура запроса становится списком (list), содержащим объекты разного типа.

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

Типовые сценарии использования:

  • Мультимодальное Few-Shot обучение: Вы показываете пример (Картинка А), даете правильный ответ (Текст А), показываете второй пример (Картинка Б), даете ответ (Текст Б), и наконец — целевую картинку.
  • Документальное расследование: Загрузка серии страниц договора (как изображений) с текстовыми комментариями между ними, указывающими, на какой пункт обратить внимание.
  • Сторителлинг: Генерация истории на основе последовательности кадров, где текст задает связки между сценами.

python
import google.generativeai as genai
import PIL.Image

# Представьте, что мы настроили API ключ
# genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel('gemini-1.5-pro-latest')

# Загружаем изображения (в реальной практике используйте пути к вашим файлам)
img_chart_2023 = PIL.Image.open('chart_2023.jpg')
img_chart_2024 = PIL.Image.open('chart_2024.jpg')

# Формируем смешанный (interleaved) запрос
# Обратите внимание: это просто список, где чередуются текст и объекты изображений
prompt_parts = [
    "Ты - финансовый аналитик. Посмотри на показатели 2023 года:",
    img_chart_2023,
    "Теперь посмотри на показатели 2024 года, особенно на сегмент B2B:",
    img_chart_2024,
    "Сравни эффективность сегмента B2B за эти два года и назови процент роста."
]

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

Стратегия 1: Визуальный Few-Shot (Обучение на примерах)

Это, пожалуй, самая мощная техника в арсенале инженера промптов при работе с Gemini. Вместо того чтобы писать километровые инструкции о том, как нужно описывать товар или анализировать UI-интерфейс, вы просто показываете паттерн.

Допустим, вам нужно получить описание одежды в формате JSON с конкретными полями (цвет, стиль, сезон). Словесное описание формата часто дает сбои. Смешанный промпт решает это элегантно:

  1. Пример 1: [Фото красного платья] + [Текст: JSON {color: red, style: evening}]
  2. Пример 2: [Фото синих джинсов] + [Текст: JSON {color: blue, style: casual}]
  3. Задание: [Фото новой куртки] + [Текст: Сгенерируй JSON для этого изображения]

Модель улавливает паттерн «Картинка -> JSON» и воспроизводит его для последнего элемента. Это значительно повышает точность и соблюдение формата вывода (output compliance).

python
# Пример реализации Few-Shot промптинга для классификации монет

# Подготовка примеров (шотов)
example_penny = PIL.Image.open('penny.jpg')
example_quarter = PIL.Image.open('quarter.jpg')
target_coin = PIL.Image.open('unknown_coin.jpg')

# Смешанный промпт, задающий паттерн поведения
fs_prompt = [
    "Задача: Определить номинал монеты и год выпуска.",
    
    # Shot 1
    example_penny,
    "Номинал: 1 цент. Год: 1995. Состояние: Потертое.",
    
    # Shot 2
    example_quarter,
    "Номинал: 25 центов. Год: 2002. Состояние: Отличное.",
    
    # Target (Целевой запрос)
    target_coin,
    "Номинал:"
]

response = model.generate_content(fs_prompt)

# Модель продолжит текст, следуя заданному формату
# Ожидаемый ответ: "... [номинал]. Год: [год]. Состояние: [состояние]."

Стратегия 2: Сэндвич-контекст (Context Sandwiching)

При работе с большим количеством медиа-контента (например, 10 скриншотов интерфейса или длинное видео) важно правильно управлять вниманием модели.

Эффективная структура «Сэндвич» выглядит так:

  • Верхняя булочка (Инструкция): «Проанализируй следующие скриншоты процесса оформления заказа на предмет UX-ошибок».
  • Начинка (Контент): [Скрин 1, Текст «Шаг 1: Корзина», Скрин 2, Текст «Шаг 2: Ввод данных»...].
  • Нижняя булочка (Уточнение/Триггер): «Особое внимание удели доступности кнопок на 3-м шаге. Сформируй список рекомендаций».

Разбиение изображений короткими текстовыми «якорями» (например, «Шаг 1», «Вид сзади», «Деталь крупным планом») критически важно. Без них модель может «смешать» все пиксели в одну кашу в своем латентном пространстве, потеряв последовательность событий.

Упражнение

Представьте, что вы создаете бота-помощника для сборки мебели. У вас есть 3 фотографии процесса сборки (начало, середина, конец). Напишите структуру списка `parts` (псевдокод или Python), который заставит модель описать, что изменилось между этапами, используя технику 'Interleaved Input'.

Особенности работы с Видео и Текстом

Gemini 1.5 Pro и Flash способны обрабатывать видео как нативный формат. Однако технически видео разбивается на кадры и аудиодорожку. При использовании смешанных промптов с видео, логика остается той же, но масштабы контекста растут.

Вы можете загрузить видеофайл и спросить: «На какой минуте появляется красный автомобиль?». Но гораздо интереснее использовать смешанный подход:

[Видео файл] + "Найди момент, где герой берет телефон." + [Скриншот конкретной модели телефона] + "Это именно эта модель?"

В этом примере мы комбинируем темпоральный (видео) и статический визуальный (картинка) контексты. Модель должна найти объект в динамике видео и сопоставить его с эталонным изображением.

Ограничения и советы

  • Токены: Каждое изображение тратит токены (стандартно 258 токенов на изображение в Gemini 1.5, но это может меняться). Смешанные промпты «тяжелые». Следите за лимитами.
  • Ясность намерений: Если вы даете два изображения без текста между ними, модель воспримет их как единый контекст. Если вам нужно сравнение — напишите «сравни с...» между картинками или перед ними.
  • Порядок: Инструкции, данные в конце (после контента), часто выполняются точнее (эффект Recency Bias), но глобальная задача должна быть обозначена в начале.

Вопрос

Почему при создании Few-Shot промпта с изображениями важно соблюдать строгую последовательность [Пример Картинки -> Пример Ответа -> ... -> Целевая Картинка]?