Смешанные промпты (Interleaved Inputs): Текст, код и медиа в одном запросе
Введение: За пределами схемы «Картинка + Подпись»
Добро пожаловать на урок, который изменит ваше представление о том, как можно «разговаривать» с нейросетью. Если в предыдущих модулях мы рассматривали мультимодальность как способность модели просто «видеть» (например, загрузить изображение и спросить «что здесь?»), то сегодня мы переходим к настоящему диалогу с использованием медиа.
Смешанные промпты (Interleaved Inputs) — это возможность отправлять модели последовательность разнородных данных в одном запросе. Представьте, что вы объясняете задачу коллеге. Вы не просто молча суете ему в руку папку с фото. Вы говорите: «Посмотри на этот график (показываете график), сравни его с таблицей прошлого года (показываете таблицу), и обрати внимание вот на эту аномалию (текстовое пояснение), а затем напиши отчет».
Именно так работает Gemini. Она воспринимает информацию последовательно, где текст, изображения и видео являются равноправными токенами в потоке данных. Это открывает двери для сложных сценариев: от few-shot обучения на визуальных примерах до глубокого контекстного анализа.
Анатомия смешанного запроса
Традиционные LLM привыкли к структуре «Системный промпт -> Сообщение пользователя». В мультимодальном мире Gemini структура запроса становится списком (list), содержащим объекты разного типа.
Ключевой принцип здесь — порядок имеет значение. Модель читает ваш запрос сверху вниз (или слева направо). То, что идет раньше, создает контекст для того, что идет позже.
Типовые сценарии использования:
- Мультимодальное Few-Shot обучение: Вы показываете пример (Картинка А), даете правильный ответ (Текст А), показываете второй пример (Картинка Б), даете ответ (Текст Б), и наконец — целевую картинку.
- Документальное расследование: Загрузка серии страниц договора (как изображений) с текстовыми комментариями между ними, указывающими, на какой пункт обратить внимание.
- Сторителлинг: Генерация истории на основе последовательности кадров, где текст задает связки между сценами.
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: [Фото красного платья] + [Текст: JSON {color: red, style: evening}]
- Пример 2: [Фото синих джинсов] + [Текст: JSON {color: blue, style: casual}]
- Задание: [Фото новой куртки] + [Текст: Сгенерируй JSON для этого изображения]
Модель улавливает паттерн «Картинка -> JSON» и воспроизводит его для последнего элемента. Это значительно повышает точность и соблюдение формата вывода (output compliance).
# Пример реализации 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 промпта с изображениями важно соблюдать строгую последовательность [Пример Картинки -> Пример Ответа -> ... -> Целевая Картинка]?