← Блог

Two-Stage AI Pipeline: как платить вдвое меньше за генерацию

Сережа Рис · 23 January 2026

llmgeminiоптимизация

$87 в месяц на дайджесты чата. Посмотрел логи — Pro-модель тратит 80% токенов на поиск тем в JSON. Разделил на два этапа. Теперь $35.

Проблема

Делаю бота для дайджестов чата @vibecod3rs. 200-400 сообщений в день. На выходе — структурированный дайджест с ресурсами, решениями, инструментами.

Первая версия: всё в Pro. Она и темы извлекает, и текст пишет. Работает, но счёт за январь:

Pro отлично пишет. Но $2/1M токенов за то, чтобы найти в JSON нужные поля и сгруппировать? Дорого.

Решение

Два этапа вместо одного:

Stage 1 (Flash): найди все темы в сообщениях, верни JSON. Stage 2 (Pro): вот 12 тем — напиши из них дайджест.

Flash стоит $0.50/1M — в 4 раза дешевле Pro. Справляется с extraction без проблем. Structured output через Pydantic гарантирует формат — Gemini API поддерживает response_schema с ноября 2025.

Pro получает готовый список из 10-15 тем вместо сотен сообщений. Контекст сжался с 100K до 8-12K токенов.

Реализация

Написал Claude Code на Opus 4.5:

Раздели генерацию дайджеста на два этапа. Stage 1: Flash извлекает темы из сообщений и возвращает JSON с категориями (resource, solution, insight, tool). Stage 2: Pro получает готовые темы и пишет финальный текст. Используй Pydantic-схему для structured output.

Агент сделал:

  1. Создал TopicsResponse схему с полями category, title, summary, url
  2. Настроил Gemini API с response_schema — JSON гарантированно валидный
  3. Разделил DigestGenerator на _extract_topics() и финальную генерацию

Retry с эскалацией

Flash иногда обрезает JSON на больших входах. Попросил добавить retry:

Добавь эскалацию лимитов при обрезке: 16K → 32K → 65K токенов. Если TokenLimitExceeded — повтори с бóльшим лимитом.

За месяц (31 дайджест) retry сработал дважды. Оба раза хватило 32K.

Результат

Метрика До После
Токены Pro 80-120K 8-12K
Стоимость/дайджест $2.5-3.5 $1.0-1.2
Январь 2026 $87 $35

Бонус: Pro пишет чище с готовыми данными. Без шума из 300 сообщений — меньше “воды” в итоговом тексте.

Когда применять

Паттерн работает если:

  1. Extraction отделим от generation — сначала найти, потом написать
  2. Входные данные большие — сотни документов, логи, чаты
  3. Структура известна — опишешь Pydantic-моделью

Не подходит для суммаризации (нужен весь контекст) и коротких запросов (overhead не окупится).

Источники

Подписаться на обновления — @sereja_tech