This commit is contained in:
2026-05-20 20:55:03 +03:00
commit d67af98363
54 changed files with 15487 additions and 0 deletions

View File

@@ -0,0 +1,397 @@
# ГЛАВА 18. МУЛЬТИМОДАЛЬНЫЕ СИСТЕМЫ: ТЕКСТ, ИЗОБРАЖЕНИЯ, ДОКУМЕНТЫ, ГОЛОС
---
Представьте консультанта, который работает исключительно по телефону. Он блестяще рассуждает, ловко ведёт переговоры, помнит тысячи фактов — но не видит документ, который вы положили перед ним. Не может прочитать диаграмму на экране. Не слышит тон голоса собеседника. Текстовый LLM — именно такой консультант: весь его мир проходит через узкий канал токенов.
Мультимодальные модели «расширили» каналы восприятия. Claude Opus 4.6, GPT-5.4, Gemini 3 — все они принимают изображения, аудио, иногда видео. Но «видеть» и «видеть хорошо» — разные вещи. Визуальные токены стоят в разы дороже текстовых. Пространственное мышление моделей ненадёжно. Мультимодальный вход открывает новые поверхности атаки (инъекции через изображения). А выбор между OCR и LLM vision, между speech-to-speech и цепочкой STT→LLM→TTS — это инженерные решения с измеримыми последствиями для стоимости, латенси и качества.
В [Главе 1, раздел 1.5](01_tokens_vectors_and_semantic_space.md) мы разобрали *механику*: как изображения превращаются в токены через ViT-патчи, как аудио квантуется в дискретные единицы. В [Главе 3, раздел 3.4](03_hallucinations.md) затронули мультимодальные галлюцинации. Эта глава — инженерная: как строить production-системы, которые обрабатывают визуальный, текстовый и аудио-вход вместе.
---
## 18.1. Токенизация изображений: правила и стоимость
### Механизм: от пикселей к токенам
Напомним суть из [Главы 1](01_tokens_vectors_and_semantic_space.md): визуальный энкодер (как правило, Vision Transformer, ViT) разбивает изображение на прямоугольные патчи, каждый патч проецируется в embedding-пространство модели. Конкретная формула зависит от провайдера — и разница существенна.
### Правила по провайдерам
| Провайдер | Модель | Правило токенизации | Макс. изображений | Примечания |
|-----------|--------|---------------------|--------------------|----|
| **OpenAI** | GPT-5.4 | Patch-based: патчи 32×32 px. До 10 000 патчей (`original`), ≤2 500 (`high`), 256 патчей (`low`, 512×512 px) | — | Уровень `"detail": "original"` для задач локализации |
| **Anthropic** | Claude Opus 4.6 | После автомасштабирования до 1568 px по длинной стороне считает примерно один токен на 750 пикселей | 600 (API), 20 (UI) | 1 MP ≈ 1 334 токена |
| **Google** | Gemini 3 | 258 токенов если ≤384 px; иначе тайлы 768×768, каждый = 258 токенов | 3 600 | Поддержка HEIC/HEIF. Параметр `media_resolution` |
### Практический расчёт стоимости
Возьмём Anthropic Claude Opus 4.6 ($5/M input tokens, по данным anthropic.com/pricing). Практическое правило простое: после автомасштабирования длинной стороны до 1568 px модель считает примерно один токен на 750 пикселей.
**4K скриншот (3840 × 2160):** масштабируется до 1568 × 882 → 1 843 токена. Стоимость: 1 843 × $5/1M ≈ **$0.0092**.
**Предварительно ресайзнутое изображение (1024 × 768):** 1024 × 768 / 750 ≈ 1 049 токенов. Стоимость: 1 049 × $5/1M ≈ **$0.0052**.
Экономия: ~43% токенов при предварительном ресайзе.
> **AI-промпт для генерации калькулятора:** «Напиши Python-функцию `estimate_image_tokens_anthropic(width, height)`, которая вычисляет количество визуальных токенов для Anthropic Claude: автомасштабирование длинной стороны до 1568 px, затем оценка по правилу “примерно один токен на 750 пикселей”. Покажи примеры для 4K (3840×2160) и ресайзнутого (1024×768) изображений.»
Ключевой вывод: **предварительный ресайз изображений** — самая простая оптимизация стоимости. 4K-скриншот, ресайзнутый до 1024 px по длинной стороне, теряет минимум качества для большинства задач, но экономит 4060% токенов.
### Стоимость аудио
Gemini 3 токенизирует аудио примерно как 32 токена в секунду.
1 минута = 1 920 токенов. Максимум — 9.5 часов аудио в одном запросе. При $1.00/M audio input tokens (Gemini 3 Flash Preview): 1 час аудио ≈ 115 200 токенов ≈ $0.115.
---
## 18.2. Vision-language промпты: паттерны и приёмы
Визуальные модели принимают изображения, но качество ответа критически зависит от того, *как* вы структурируете запрос. Три ключевых паттерна.
### Паттерн 1: Image-first ordering
Anthropic рекомендует размещать изображения *перед* текстом в сообщении. Это работает у всех провайдеров: модель «видит» изображение, формирует визуальные представления, а затем читает инструкции — attention-веса к визуальным токенам оказываются сильнее.
Схема сообщения: сначала блок `image` (с base64 или URL), затем блок `text` с инструкцией. Это единый паттерн для OpenAI, Anthropic и Google.
> **AI-промпт для генерации кода:** «Покажи пример вызова Anthropic Messages API с изображением в base64: сначала блок image (тип base64, media_type image/png), затем блок text с задачей «Извлеки все позиции из счёта в формате JSON». Используй `anthropic` Python SDK, модель claude-opus-4-6.»
### Паттерн 2: Управление уровнем детализации
OpenAI предоставляет три уровня детализации:
| Уровень | Токены | Когда использовать |
|---------|--------|--------------------|
| `low` | 256 патчей (512×512 px, patch-based) | Классификация, общее описание. «Это фото кота или собаки?» |
| `high` | До 2 500 (патчи, сжатое представление) | Анализ, чтение текста на изображении |
| `original` | До 10 000 (патчи 32×32, макс. 6000 px) | Локализация объектов, детальная диагностика |
Практическое правило: начинайте с `low`. Если качество недостаточно — переходите на `high`. `original` — только для задач, где нужна точная пространственная привязка.
### Паттерн 3: Координатный grounding (bounding boxes)
Gemini нативно поддерживает задачи object detection. Модель возвращает координаты в формате `[ymin, xmin, ymax, xmax]`, нормализованные к диапазону 01000. Промпт для grounding: «Найди все таблицы на этой странице. Верни bounding boxes в формате [ymin, xmin, ymax, xmax], нормализованные к 01000».
> **AI-промпт для генерации кода:** «Напиши Python-скрипт, который отправляет изображение в Gemini 3 Flash через `google-genai` SDK и просит вернуть bounding boxes всех таблиц в формате [ymin, xmin, ymax, xmax], нормализованных к 01000. Используй модель gemini-3-flash-preview.»
Координатный grounding полезен для:
- понимания структуры документа (где таблица, где заголовок, где подпись);
- visual QA с привязкой к регионам изображения;
- автоматической нарезки страницы на зоны для дальнейшего OCR.
### Антипаттерны
| Что делают | Почему это проблема | Что делать вместо |
|------------|--------------------|--------------------|
| Спрашивают о мелких деталях в режиме `low` | Модель буквально не видит их — 256 патчей на всё изображение | Использовать `high` или `original` |
| Отправляют полноразмерный скриншот для извлечения текста | Перерасход токенов в 35× | Ресайз + кроп до области с текстом |
| Просят модель *точно посчитать* объекты | Модели плохо считают — это известное ограничение | Использовать grounding + подсчёт bounding boxes программно |
| Отправляют множество изображений без указания порядка | Модель не знает, в каком порядке их анализировать | Нумеровать: «Image 1: …, Image 2: …» |
---
## 18.3. OCR и обработка документов
### Два уровня: понимание vs точность
Визуальные LLM и специализированный OCR решают разные задачи:
- **LLM vision** — *понимает* документ: видит layout, связывает таблицу с контекстом, извлекает смысл из формы целиком. Но может «додумать» текст, который плохо виден.
- **Специализированный OCR** — *читает* документ: детерминированный вывод, пиксельная точность, обработка плотных таблиц, рукописного текста, нестандартных шрифтов. Но не понимает контекст.
### Когда что использовать
| Сценарий | Подход | Почему |
|----------|--------|--------|
| General document QA | LLM vision | Понимает layout + содержание в контексте |
| Массовое извлечение структурированных данных | OCR + LLM | Детерминированный OCR + LLM для нормализации |
| Регуляторный / аудит | Специализированный OCR | Нужен детерминированный, воспроизводимый вывод |
| Рукописный текст, исторические документы | Специализированный OCR | LLM vision ненадёжен на нестандартных шрифтах |
| Визуально сложные формы (чертежи, схемы) | LLM vision + OCR | LLM для layout, OCR для точного текста |
### Инструменты
- **Google Document AI** — интеграция с Gemini, поддержка 200+ языков, специализированные процессоры для invoices, receipts, identity documents.
- **Azure Document Intelligence** — layout analysis, prebuilt модели для типовых форм, custom extraction.
- **DocTR** (open-source) — end-to-end OCR: detection + recognition. Python, PyTorch / TensorFlow. GitHub: [mindee/doctr](https://github.com/mindee/doctr).
### Pipeline: PDF → структурированный JSON
Типичный production-пайплайн для обработки документов:
```
PDF → Рендеринг страниц (PNG, 150 DPI)
→ Отправка в LLM vision (image-first, base64)
→ Structured output (JSON с валидацией схемой)
```
> **AI-промпт для генерации кода:** «Напиши Python-функцию `extract_invoice_data(pdf_path)`, которая: (1) открывает PDF через PyMuPDF (`fitz`), (2) рендерит каждую страницу в PNG при 150 DPI, (3) отправляет base64-изображение в Anthropic Messages API (модель claude-opus-4-6) с инструкцией извлечь позиции счёта в JSON (поля: description, quantity, unit_price, total; null для неразборчивых значений). Используй паттерн image-first. Добавь валидацию JSON-ответа через pydantic.»
Ключевые решения в этом пайплайне:
- **DPI при рендеринге**: 150 DPI — разумный баланс. 72 DPI теряет мелкий текст, 300 DPI — перерасход токенов.
- **Инструкция о `null`**: явно скажите модели, что делать, когда текст неразборчив — иначе она будет галлюцинировать.
- **Постобработка**: JSON-ответ нужно валидировать схемой. LLM может вернуть дополнительные поля или пропустить обязательные.
---
## 18.4. Multimodal RAG: ColPali и визуальный retrieval
### Проблема: OCR теряет визуальную структуру
Классический RAG для документов работает так: PDF → OCR → текстовые чанки → embedding → vector DB → retrieval → LLM. Проблема в первом шаге: OCR *теряет layout*. Таблица превращается в поток текста, где столбцы перемешаны. Диаграмма исчезает. Подпись под графиком отрывается от графика. Информация заключена не только в тексте, но и в *визуальном расположении*а OCR-based RAG это расположение уничтожает.
### ColPali: retrieval по скриншотам страниц
ColPali (Faysse et al., 2024) предлагает радикально другой подход: пропустить OCR полностью. Вместо этого:
1. Рендерим каждую страницу документа как изображение.
2. Подаём изображение в vision-language модель (VLM), которая генерирует *мультивекторные* embeddings — по одному вектору на каждый патч изображения.
3. При поиске: текстовый запрос также превращается в набор векторов.
4. Сопоставление — late interaction в стиле ColBERT: каждый вектор запроса ищет максимально похожий вектор в документе, затем скоры суммируются.
```
Классический RAG: PDF → OCR → Чанки → Embed → Vector DB → Retrieve → LLM
ColPali: PDF → Скриншот → Embed (VLM) → Vector DB → Retrieve → LLM (с изображением)
```
### Почему это работает
Мультивекторное представление страницы сохраняет *пространственную* информацию. Вектор, соответствующий патчу с таблицей, будет близок к запросу «выручка за Q3». Вектор патча с графиком — к запросу «динамика продаж». При этом не нужен OCR, не теряется layout, не разрываются связи между элементами страницы.
### Бенчмарк: ViDoRe
ViDoRe (Visual Document Retrieval) — бенчмарк для оценки визуального retrieval. По данным ViDoRe leaderboard (апрель 2026), лидирующие модели на базе ColQwen3.5 достигают ~90+ NDCG@5.
**Оптимизация хранения**: мультивекторные embeddings занимают больше места, чем одновекторные. Token pooling (иерархический mean pooling с pool factor 3) сокращает количество векторов на 66.7%, сохраняя 97.8% NDCG. Это делает ColPali практичным для коллекций в десятки тысяч страниц.
### Когда использовать ColPali, а когда классический RAG
| Критерий | ColPali | Классический RAG (OCR + text embed) |
|----------|---------|--------------------------------------|
| Документы с таблицами, диаграммами | Layout сохранён | OCR разрушает структуру |
| Чисто текстовые документы | Избыточен | Проще и дешевле |
| Скорость индексации | Медленнее (VLM inference) | Быстрее (OCR + text embed) |
| Размер индекса | Больше (мультивекторный) | Меньше (одновекторный) |
| Финансовые отчёты, слайды, чертежи | Основной сценарий | Потеря визуальной информации |
---
## 18.5. Audio и speech: два контура
Голосовой интерфейс к LLM — это не просто STT + LLM + TTS. Существуют две принципиально разные архитектуры, и выбор между ними определяет латенси, контроль, стоимость и возможности отладки.
### Контур 1: Speech-to-speech (Realtime API)
OpenAI Realtime API (General Availability) позволяет вести двусторонний голосовой диалог с моделью. Модель принимает аудио напрямую и генерирует аудио-ответ — без промежуточного текста.
**Транспорт:**
- WebRTC — для браузерных приложений (p2p, низкая латенси);
- WebSocket — для серверных приложений;
- SIP — для интеграции с VoIP-телефонией (PSTN).
**Возможности:**
- Function calling и MCP-серверы — модель может вызывать инструменты прямо в середине разговора;
- Прерывание (interruption) — пользователь может прервать модель, она остановится и ответит на новый вопрос;
- Несколько голосов на выбор.
**Ограничения:**
- Ограниченный контроль над промежуточным текстом — нельзя «подкрутить» транскрипцию до того, как модель её обработает.
- Сложнее логировать и модерировать: контент проходит через аудиоканал, а не через текст.
- Стоимость: аудио-токены дороже текстовых.
### Контур 2: Цепочка STT → LLM → TTS
Альтернатива — последовательная обработка: сначала транскрибируем аудио в текст, затем передаём текст в LLM, затем синтезируем ответ.
**Компоненты (OpenAI):**
- STT: `gpt-4o-transcribe` (высокое качество), `gpt-4o-mini-transcribe` (дешевле), `gpt-4o-transcribe-diarize` (с метками спикеров).
- TTS: `gpt-4o-mini-tts` — управляемый синтез речи.
> **Примечание:** модели STT/TTS у OpenAI остаются в линейке `gpt-4o-*`, а не в семействе GPT-5.x. Speech-модели развиваются отдельно от text-флагманов.
**Компоненты (Google):**
- STT: Cloud Speech-to-Text или Gemini Live API.
- TTS: Cloud Text-to-Speech или Gemini.
**Преимущества:**
- Полный контроль над текстом на каждом этапе — можно логировать, модерировать, трансформировать.
- Промежуточный текст доступен для structured outputs, tool use, RAG.
- Проще дебажить: каждый этап можно проверить отдельно.
**Недостаток:** латенси. Три последовательных вызова: STT (200500 мс) + LLM (5002000 мс) + TTS (200500 мс) = 13 секунды суммарно. Для телефонного разговора это ощутимо; для асинхронной обработки — приемлемо.
### Выбор контура
| Критерий | Speech-to-speech | STT → LLM → TTS |
|----------|------------------|------------------|
| Латенси | ~300800 мс | ~13 с |
| Контроль над текстом | Ограничен | Полный |
| Логирование и аудит | Сложнее | Просто |
| Tool use | Поддерживается | Поддерживается |
| Модерация контента | Через аудио-канал | На этапе текста |
| Интеграция с RAG | Ограничена | Полная |
| Сценарий | Голосовой ассистент, call-центр | Обработка записей, QA-бот с голосом |
### Оценка стоимости аудио
Gemini токенизирует аудио на уровне модели: 32 токена/секунду. Перед токенизацией аудио даунсэмплируется до 16 kbps mono.
Пример расчёта: 5-минутный звонок = 300 с × 32 = 9 600 токенов. При $1.00/M audio input (Gemini 3 Flash Preview): $0.0096.
### Live voice agents: from demo to production
В 20252026 live voice agents перешли из демо в production. OpenAI Realtime API (GA) и Gemini Live API — уже не эксперимент, а production-surface с SLA и поддержкой tool use.
Ключевое различие: voice agent — это не speech-to-speech обёртка, а *агент*, работающий в голосовом цикле. Он вызывает tool'ы, принимает решения, управляет workflow — всё в реальном времени, пока пользователь ждёт на линии. Архитектурно это тот же agent loop из [Главы 10](10_agent_not_chat.md), но с жёстким latency budget: ~500 мс на ответ для естественного диалога. Tool call внутри voice loop должен укладываться в этот бюджет. Если tool медленный — нужны filler phrases («Секунду, проверяю…»), partial responses или async execution с callback.
Следствие для проектирования tool'ов: все инструменты, вызываемые из voice loop, должны иметь p95 latency < 300 мс (оставляя ~200 мс на сетевой overhead и генерацию). Медленные операции (RAG-запрос, обращение к внешнему API) требуют отдельного паттерна: модель произносит filler, запускает tool асинхронно и возвращается к ответу после получения результата.
### Transport и session management
Три транспортных протокола для live voice определяют архитектурные ограничения:
| Протокол | Латенция | Deployment | Типичный сценарий |
|----------|----------|------------|-------------------|
| **WebRTC** | Минимальная (p2p) | Браузер | Web-приложения, клиентский ассистент |
| **WebSocket** | Низкая (через сервер) | Backend | Серверный voice bot, кастомная логика |
| **SIP** | Средняя (телефонная сеть) | PSTN / VoIP | Call-центр, IVR-замена |
Session state в голосовом цикле сложнее текстового: сессия это долгоживущее соединение (минуты часы). Четыре аспекта, которые необходимо контролировать:
1. **Turn-taking** определение, кто сейчас говорит, и передача «слова» между пользователем и моделью.
2. **Barge-in (interruption)** пользователь перебивает модель до завершения ответа. Правильное поведение: модель останавливает генерацию, отбрасывает незавершённый аудио-ответ, переключается на слушание. В Realtime API barge-in реализован на уровне протокола; в цепочке STT LLM TTS управлять им сложнее нужен cancel pipeline, который прерывает TTS и сбрасывает буфер.
3. **Silence detection** определение момента, когда пользователь закончил говорить, без преждевременного cut-off.
4. **Session timeout** завершение сессии при продолжительном молчании, с корректным сохранением состояния.
### Наблюдаемость voice workflows
Отладка голосовых агентов сложнее текстовых: по умолчанию нет текстового лога, а аудио нельзя быстро просканировать глазами. Минимальный набор для production:
- **Запись аудио** каждой сессии для post-mortem и compliance.
- **Transcript каждого turn** даже для speech-to-speech режима нужен параллельный STT для логирования. Без transcript нет ни поиска по сессиям, ни модерации.
- **Trace с timeline** кто говорил когда, какие tool calls были, сколько длилась каждая фаза (STT, LLM inference, TTS, network).
- **Latency breakdown по turn** STT latency, LLM latency, TTS latency, network latency отдельно. Без этого невозможно понять, где «тормозит».
Ключевые метрики voice agent: response latency p50/p95, interruption rate (высокий показатель = пользователь не дожидается ответа), successful task completion rate, user hang-up rate (индикатор плохого UX). Интеграция с OpenTelemetry (см. [Главу 17](17_observability_and_operations.md)): voice span tool call span LLM span единый trace от входного аудио до ответа.
---
## 18.6. Мультимодальные галлюцинации
В [Главе 3](03_hallucinations.md) мы разобрали механику галлюцинаций: модель генерирует правдоподобные, но ложные утверждения, потому что оптимизирована на правдоподобие, а не на истинность. В визуальной модальности та же проблема проявляется специфическими способами.
### Четыре типа визуальных галлюцинаций
**1. Галлюцинация объектов.** Модель «видит» объекты, которых нет на изображении. Бенчмарк POPE (Polling-based Object Probing Evaluation) (Li et al., 2023) измеряет это систематически: модели задают вопросы вида «Есть ли на изображении X и проверяют, не соглашается ли она, когда X отсутствует. Даже фронтирные модели допускают ненулевой процент ложноположительных ответов проблема не решена полностью.
**2. Ошибки пространственного мышления.** «Кот слева от собаки» когда он справа. «Третья строка таблицы содержит…» когда это четвёртая строка. Пространственные отношения одна из самых слабых сторон vision-language моделей: attention-механизм агрегирует патчи, но может терять точную позиционную привязку.
**3. Ошибки подсчёта.** Все три фронтирных провайдера (OpenAI, Anthropic, Google) явно указывают в документации: модели *оценивают* количество объектов, а не считают их. «Примерно 78 человек» это потолок точности для типичной сцены. Детерминированный подсчёт требует object detection + программный count.
**4. Ошибки OCR в визуальном режиме.** Мелкий текст, повёрнутый текст, нестандартные шрифты, не-латинские скрипты всё это зоны риска. Модель может «прочитать» слово, которое визуально похоже на правильное, но отличается на один-два символа.
### Антигаллюцинационные паттерны для мультимодальных систем
**Bounding box верификация.** Прежде чем спрашивать модель *о* объекте попросите её *найти* объект. Если модель не может указать координаты, она, скорее всего, галлюцинирует наличие. Двухшаговый паттерн:
- **Шаг 1 (локализация):** «Есть ли на изображении штрих-код? Если да укажи bounding box [ymin, xmin, ymax, xmax].»
- **Шаг 2 (извлечение):** Если bbox получен «Прочитай штрих-код в области [ymin, xmin, ymax, xmax]. Верни числовое значение
**Перекрёстная проверка несколькими изображениями.** Для критичных задач (медицина, финансы) отправьте то же содержимое в разных ракурсах или масштабах. Если ответы расходятся доверие падает.
**Гибридный пайплайн.** Для текста на изображениях: специализированный OCR для извлечения, LLM для понимания. Два канала два шанса поймать ошибку.
**Явная инструкция об неопределённости.** Добавьте в prompt: «Если текст неразборчив или объект не виден чётко, укажи это явно, а не угадывай». Без такой инструкции модель будет догадываться и звучать уверенно.
---
## 18.7. Стоимость и латентность мультимодальных систем
### Сравнительная таблица модальностей
| Модальность | Токенов на единицу | Типичная стоимость (input) | Влияние на латенси |
|-------------|-------------------|---------------------------|-------------------|
| Текст | ~0.75 токенов/слово | $115/M токенов | Baseline |
| Изображение (1 MP) | ~1 3001 600 токенов | $424 за 1K изображений | +0.52 с на изображение |
| Аудио (1 мин) | ~1 920 токенов (Gemini) | Варьируется | +25 с на STT |
| Видео (1 мин, 1 FPS) | ~15K25K токенов | Высокая | +515 с |
### Стратегии оптимизации
**1. Предварительный ресайз.** Самый простой и эффективный способ ресайзить изображения до минимально необходимого разрешения ДО отправки в API. 4K 1024 px = экономия 4060% токенов.
**2. Управление уровнем детализации.** Для классификации это чек или не чек?») `low` (256 патчей). Для анализа `high`. Не используйте `original` по умолчанию.
**3. Кэширование визуальных embeddings.** Если один и тот же документ обрабатывается повторно (например, RAG-индекс) кэшируйте embeddings, а не перевычисляйте при каждом запросе.
**4. Батчинг изображений.** Все провайдеры поддерживают несколько изображений в одном запросе. Один запрос с 5 изображениями дешевле по overhead, чем 5 отдельных запросов.
**5. ColPali для retrieval.** Для поисковых задач используйте ColPali один проход для индексации. Не пересчитывайте визуальные токены при каждом запросе.
**6. Edge-модели для latency- и privacy-sensitive задач.** Для мультимодальной обработки с минимальной латенси или без передачи данных в облако существуют on-device модели (Gemma 4 E2B/E4B) подробнее в [Главе 24, §24.4](24_landscape_2026.md).
### Пример расчёта бюджета
Сценарий: обработка 10 000 страниц финансовых отчётов в месяц (Claude Opus 4.6, $5/M input tokens).
```
Без оптимизации (4K сканы):
10,000 страниц × 1,843 токена = 18.4M токенов = $92/мес
С ресайзом до 1024 px:
10,000 страниц × 1,049 токенов = 10.5M токенов = $52.5/мес
С ColPali (retrieval, не нужно отправлять все страницы):
Retrieval: 10,000 × индексация (одноразово)
LLM calls: top-5 страниц × 1,049 = 5,245 токенов на запрос
1,000 запросов/мес × 5,245 = 5.2M токенов = $26/мес
```
---
## Практический вывод
Мультимодальные системы добавляют к LLM-инженерии три новых измерения: визуальные токены (дорогие), пространственное мышление (ненадёжное) и аудиоканал (с выбором архитектуры). Чек-лист для production-системы:
1. **Ресайз перед отправкой.** Минимальное разрешение, при котором задача решается. Не отправляйте 4K, если хватает 1024 px.
2. **Выбирайте уровень детализации.** `low` для классификации, `high` для анализа, `original` для локализации. По умолчанию не `original`.
3. **OCR vs LLM vision — не "или", а "когда".** LLM для понимания; специализированный OCR для точности, воспроизводимости и регуляторных требований. Для сложных документов оба.
4. **ColPali для визуально-насыщенных документов.** Если ваши документы полны таблиц, диаграмм и схем ColPali сохраняет layout при retrieval. Для чисто текстовых классический RAG дешевле.
5. **Speech: два контура — два сценария.** Realtime API для разговорных агентов, где латенси критична. STT LLM TTS для пайплайнов, где нужны логирование, модерация, structured outputs.
6. **Ожидайте визуальные галлюцинации — и проектируйте защиту.** Bounding box верификация, перекрёстная проверка, гибридные пайплайны, явная инструкция об неуверенности.
7. **Считайте стоимость мультимодальных вызовов отдельно.** Токены изображений в 510× дороже токенов текста *в пересчёте на единицу извлечённой информации*. Мониторьте визуальные токены как отдельную cost-линию.
### Задания
1. **Сравнение OCR vs LLM vision.** Возьмите 10 разнородных PDF-документов (счета, таблицы, формы): обработайте каждый (a) специализированным OCR (DocTR или Document AI) и (b) LLM vision (Gemini 3 или Claude Opus 4.6). Сравните по метрикам: точность извлечения текста (Character Error Rate), сохранение структуры таблиц, стоимость на страницу, латенси. **Ожидаемый результат:** таблица сравнения для принятия решения о выборе подхода для вашего типа документов.
2. **Оптимизация стоимости визуальных токенов.** Возьмите реальный пайплайн с изображениями и проведите A/B-тест: (А) оригинальные изображения vs (Б) ресайз до 1024 px по длинной стороне. Измерьте: количество токенов, стоимость, качество ответов (ручная оценка на 20 примерах). **Ожидаемый результат:** понимание порога ресайза, при котором качество не деградирует для вашей задачи.
3. **Проверка визуальных галлюцинаций.** Соберите 10 изображений с известным содержимым. Отправьте в модель вопросы в стиле POPE: «Есть ли на изображении X (где X заведомо отсутствует). Оцените долю ложноположительных ответов. Попробуйте bounding box верификацию: снижает ли она долю галлюцинаций? **Ожидаемый результат:** количественная оценка надёжности вашей модели и эффективности антигаллюцинационного паттерна.
---
## Источники
- OpenAI. "Vision." https://developers.openai.com/api/docs/guides/images-vision
- Anthropic. "Vision." https://platform.claude.com/docs/en/docs/build-with-claude/vision
- Google. "Image Understanding." https://ai.google.dev/gemini-api/docs/image-understanding
- Google. "Audio Understanding." https://ai.google.dev/gemini-api/docs/audio
- OpenAI. "Realtime API." https://developers.openai.com/api/docs/guides/realtime
- Faysse, M., et al. (2024). "ColPali: Efficient Document Retrieval with Vision Language Models." arXiv:2407.01449. ICLR 2025.
- Li, Y., et al. (2023). "Evaluating Object Hallucination in Large Vision-Language Models." EMNLP 2023. arXiv:2305.10355.
- DocTR open-source OCR. https://github.com/mindee/doctr
---
**Навигация:**
- Назад: [Глава 17. Наблюдаемость и эксплуатация LLM-продукта](17_observability_and_operations.md)
- Далее: [Глава 19. Дообучение и post-training](19_fine_tuning_and_post_training.md)