Смешанные промпты: Сочетание текста, медиа и документов

40 минут Урок 9

Введение: За пределами текста

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

Мультимодальность в Gemini 3 — это не просто возможность прикрепить картинку и спросить «что здесь изображено?». Как архитектор решений, вы должны мыслить шире. Представьте сценарий: пользователь загружает видео поломки двигателя, прикладывает PDF с техническим мануалом и пишет: «На 15-й секунде слышен стук, сверься с документацией и скажи, какой узел проверять».

Это и есть смешанные промпты (Mixed Prompts). Это способность модели удерживать в контекстном окне одновременно визуальные, текстовые и документные данные, устанавливая между ними логические связи.

В этом уроке мы разберем:

  • Архитектуру запроса: как технически передать «солянку» из данных.
  • Работа с документами (PDF, CSV) через File API.
  • Стратегии смешивания: в каком порядке подавать данные для лучшего результата.

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

На низком уровне API Gemini (через Google AI Studio или Vertex AI) не разделяет мир на «картинки» и «текст» так жестко, как старые модели. Для Gemini всё это — токены. Картинка — это набор токенов, видео — последовательность наборов токенов, текст — тоже токены.

Ключевая структура, с которой мы будем работать — это список parts. В отличие от простых языковых моделей, где промпт — это одна строка, здесь промпт — это массив объектов.

Золотое правило архитектора: Порядок имеет значение. Модель обрабатывает информацию последовательно. Если вы сначала дадите инструкцию «Найди ошибку», а потом покажете код, это сработает. Но если вы используете сложные документы, часто лучше работает структура «Сэндвич»:

  1. Контекст/Роль: «Ты старший бухгалтер».
  2. Данные (Data): [Изображение чека], [PDF с налоговым кодексом].
  3. Инструкция (Task): «Проверь, соответствует ли чек требованиям из PDF».

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')

# Подготовка данных
# 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.
  • Стоимость: Вы платите за хранение и за токены при обработке.

python
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-часовых видеолекций. Какая стратегия работы с файлами будет архитектурно верной?