Смешанные промпты: Сочетание текста, медиа и документов
Введение: За пределами текста
Добро пожаловать в один из самых захватывающих разделов курса. Если до этого мы работали с ИИ как с очень начитанным собеседником в чате, то сегодня мы научим его «видеть» и «читать» документы так, как это делает человек.
Мультимодальность в Gemini 3 — это не просто возможность прикрепить картинку и спросить «что здесь изображено?». Как архитектор решений, вы должны мыслить шире. Представьте сценарий: пользователь загружает видео поломки двигателя, прикладывает PDF с техническим мануалом и пишет: «На 15-й секунде слышен стук, сверься с документацией и скажи, какой узел проверять».
Это и есть смешанные промпты (Mixed Prompts). Это способность модели удерживать в контекстном окне одновременно визуальные, текстовые и документные данные, устанавливая между ними логические связи.
В этом уроке мы разберем:
- Архитектуру запроса: как технически передать «солянку» из данных.
- Работа с документами (PDF, CSV) через File API.
- Стратегии смешивания: в каком порядке подавать данные для лучшего результата.
Анатомия смешанного запроса
На низком уровне API Gemini (через Google AI Studio или Vertex AI) не разделяет мир на «картинки» и «текст» так жестко, как старые модели. Для Gemini всё это — токены. Картинка — это набор токенов, видео — последовательность наборов токенов, текст — тоже токены.
Ключевая структура, с которой мы будем работать — это список parts. В отличие от простых языковых моделей, где промпт — это одна строка, здесь промпт — это массив объектов.
Золотое правило архитектора: Порядок имеет значение. Модель обрабатывает информацию последовательно. Если вы сначала дадите инструкцию «Найди ошибку», а потом покажете код, это сработает. Но если вы используете сложные документы, часто лучше работает структура «Сэндвич»:
- Контекст/Роль: «Ты старший бухгалтер».
- Данные (Data): [Изображение чека], [PDF с налоговым кодексом].
- Инструкция (Task): «Проверь, соответствует ли чек требованиям из PDF».
import google.generativeai as genai
import PIL.Image
# Настройка API (предполагаем, что ключ уже в переменных окружения)
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel('gemini-1.5-pro-latest')
# Подготовка данных
# 1. Текстовая инструкция
instruction = "Проанализируй этот график и сравни его с текстовым описанием ниже."
# 2. Изображение (загружаем локально)
img_chart = PIL.Image.open('sales_chart.png')
# 3. Дополнительный контекст текстом
context_text = """
Контекст: На графике показаны продажи за 2023 год.
Ожидалось падение в Q3 из-за сезонности, но мы видим рост.
"""
# Сборка смешанного промпта (список parts)
prompt_parts = [
instruction,
img_chart, # Библиотека сама конвертирует PIL Image в нужный формат blob
context_text
]
# Вызов модели
response = model.generate_content(prompt_parts)
print(response.text)
Работа с тяжелыми документами: File API
В примере выше мы передали изображение напрямую. Это отлично работает для небольших картинок. Но что, если у вас есть 50-страничный PDF-отчет или 10-минутное видео?
Передавать их напрямую в тело запроса (Base64) — плохая практика. Это раздувает JSON, вызывает тайм-ауты сети и просто неудобно.
Для этого в экосистеме Gemini существует File API. Это временное облачное хранилище, куда вы загружаете файлы, получаете на них ссылку (URI), и передаете модели только эту ссылку. Модель сама «сходит» за файлом, когда начнет обрабатывать запрос.
Важные нюансы File API:
- Временность: Файлы хранятся ограниченное время (обычно 48 часов), затем удаляются. Это не Google Drive, это кэш для обработки.
- Типы файлов: Поддерживаются PDF, видео (MP4, MOV и др.), аудио (MP3, WAV), и даже CSV.
- Стоимость: Вы платите за хранение и за токены при обработке.
import time
# 1. Загрузка файла в облако Google
# Допустим, у нас есть PDF с инструкцией к прибору
pdf_file = genai.upload_file(path="manual_v3.pdf", display_name="Technical Manual")
# 2. Проверка состояния обработки
# Тяжелые файлы (особенно видео) требуют времени на процессинг на стороне Google
while pdf_file.state.name == "PROCESSING":
print("Файл обрабатывается...")
time.sleep(2)
pdf_file = genai.get_file(pdf_file.name)
if pdf_file.state.name == "FAILED":
raise ValueError("Не удалось обработать файл")
print(f"Файл готов: {pdf_file.uri}")
# 3. Использование в смешанном промпте
# Сценарий: Пользователь прислал фото сломанной детали и просит найти решение в мануале
user_photo = PIL.Image.open('broken_part.jpg')
response = model.generate_content([
"Ты эксперт по ремонту. Посмотри на фото поломки.",
user_photo,
"Теперь изучи этот мануал и найди страницу, где описана процедура замены этой детали.",
pdf_file, # Передаем объект файла напрямую
"Укажи номер страницы и краткий алгоритм действий."
])
print(response.text)
# 4. Уборка за собой (Good Practice)
# genai.delete_file(pdf_file.name)
Стратегия «Интерливинг» (Interleaving)
Термин Interleaving означает чередование. В контексте мультимодальности это способность перемешивать текст и медиа в любой последовательности. Это критически важно для создания сложных диалоговых систем.
Многие новички думают, что можно загрузить только «один файл + один промпт». Это не так. Вы можете создать диалог, где пользователь сначала показывает фото, модель отвечает, потом пользователь кидает PDF, модель уточняет детали, а затем пользователь присылает еще одно фото для сравнения.
Как это меняет архитектуру приложений?
Вы перестаете строить линейные пайплайны (Загрузил -> Получил ответ). Вы строите контекстно-зависимые ассистенты. Например, в образовании: студент присылает фото уравнения, модель объясняет первый шаг. Студент присылает фото своего решения первого шага, модель проверяет его и подсказывает второй шаг.
Важно помнить про контекстное окно. Видео и PDF потребляют много токенов. Gemini 1.5 Pro имеет окно в 1-2 миллиона токенов, что огромно, но не бесконечно. Видео считается посекундно (примерно 258 токенов в секунду для видео без звука, плюс токены за аудиодорожку).
Создайте скрипт 'Умный HR-ассистент'. Задача: На вход подается фото резюме кандидата (изображение) и текстовое описание вакансии (строка). Скрипт должен вывести JSON с оценкой кандидата от 1 до 10 и списком недостающих навыков.
Лучшие практики и типичные ошибки
Завершая урок, давайте разберем, где чаще всего ошибаются разработчики при создании смешанных промптов.
- Ошибка: «Слепая» вера в OCR. Хотя Gemini отлично читает текст с картинок, рукописный врачебный почерк или текст под сильным углом может быть интерпретирован неверно. Всегда просите модель указывать степень уверенности или цитировать прочитанное, если это критично.
- Ошибка: Игнорирование разрешения изображений. Gemini масштабирует изображения, но если вы подаете превью 64x64 пикселя и просите прочитать мелкий шрифт, чуда не произойдет. Старайтесь подавать оригиналы (в разумных пределах, до 20МБ на картинку).
- Совет: Якорные ссылки. При работе с длинными видео или PDF просите модель указывать тайм-коды (для видео) или номера страниц (для PDF). Промпт: «Дай ответ и укажи ссылку на источник в формате [страница X]». Это резко снижает галлюцинации.
Вы разрабатываете систему для анализа 2-часовых видеолекций. Какая стратегия работы с файлами будет архитектурно верной?