Инженерный замер · экономика делегирования

Делегировать bulk-работу на локальную LLM — окупается?

Замер на реальных данных: сколько токенов контекста frontier-модели экономит выгрузка объёмной обработки на локальную Qwen3-Coder 30B — и модель падений: после скольких провалов делегации выгоднее сделать самому.

Метод: solo vs delegated, tiktoken o200k как прокси Данные: 4 реальных файла, 2.5–96 КБ Стенд: RTX 4090 · qwen3-coder:30b Дата: 2026-07-10
Стенд

Железо реального замера

Конфигурация прогона
GPU
RTX 4090 · 24 ГБ
CPU
Core i9-13900KF
RAM
64 ГБ
Runtime
Ollama 0.31.1
Модель
qwen3-coder:30b
Архитектура
MoE · ~3B active

Все числа замера ниже — фактический прогон на этом железе. Токены — tiktoken o200k_base как прокси токенизатора frontier (ratio-надёжен, абсолюты ±10–15%). Конфиги 8 ГБ / 12 ГБ в таблице ниже — расчётная экстраполяция по той же физике, не отдельный прогон.

TL;DR

Три вывода

90–97%
экономия контекста на файлах ≥26 КБ. Наступает рано — не с сотен КБ.
~10 КБ
порог рентабельности. Ниже — solo проще, делегация не окупается.
N = 2
дефолт: два подряд провала → делай сам. Но тип падения важнее числа.
Метод

Что и как меряли

Задача — bulk-обработка (суммаризация лога, извлечение полей, классификация): читать сырой файл целиком в контекст frontier-модели дорого. Альтернатива — локальная модель жуёт файл у себя (0 токенов frontier) и отдаёт компактную JSON-выжимку; frontier видит только выжимку.

solo = весь файл в контекст + инструкция. Стоимость S.
delegated = локальная LLM → JSON-выжимка + обёртка вызова. Стоимость D.

Счётчик: tiktoken o200k_base как прокси токенизатора frontier (точный API-счётчик недоступен без ключа). Для отношения экономии это корректно — solo и delegated меряются одним счётчиком, systematic bias сокращается; абсолюты ±10–15%. Калибровка сошлась: 96 КБ = 27 680 ток ≈ 3.5 симв/ток.

Результат · экономия

Экономия контекста наступает рано

ФайлКБsolo ток deleg токэкономия 
текст-карточка2.5511509 0.4%
код-анализ26.56 732579 91.4%
changelog50.914 225435 96.9%
JSON-лог96.427 6801 243 95.5%

Между break-even (~3 КБ) и 90%+ (~26 КБ) — узкая зона. Вывод: делегируй bulk уже с ~10 КБ / ~150 строк, не жди «сотен КБ и тысяч строк».

Поправка к интуитивной прикидке. Ручная оценка давала «мелкий файл → −100% (хуже)», потому что считала стоимость написать helper с нуля каждый раз. В steady-state скрипт написан один раз и лежит в проекте → overhead ≈ 0, мелкий файл выходит в break-even (+0.4%), а не в минус. На крупных файлах реальность оказалась лучше прикидки (95% против ожидаемых 83%).

Результат · деньги

Сколько это в деньгах — Fable, Opus, Sonnet

Экономия — это input-токены (файл в контексте = input; делегация меняет его на компактную выжимку). Долларовая цена = сэкономленные токены × input-цена модели:

$saved = (S − D) × ценаin / 1 000 000 // за один файл

За один файл — десятые цента. Значимость проявляется в объёме. Ниже — экономия за 1000 файлов одного класса (типичный bulk-прогон):

Файл (×1000)экон. ток Fable 5
$10/1M
Opus 4.8
$5/1M
Sonnet 5
$3/1M
Sonnet intro
$2/1M
текст-карточка 2.5 КБ2 тыс $0.02$0.01$0.01<$0.01
код-анализ 26 КБ6.15 млн $61.53$30.76$18.46$12.31
changelog 51 КБ13.8 млн $137.90$68.95$41.37$27.58
JSON-лог 96 КБ26.4 млн $264.37$132.19$79.31$52.87
Цена растёт с моделью, экономия % — нет. Процент экономии контекста инвариантен к модели (тот же файл, тот же токенизатор); в деньги он превращается по input-цене, поэтому на Fable дороже контекст → делегация окупается вдвое сильнее, чем на Opus, и в 3–5 раз сильнее, чем на Sonnet. Чем дороже frontier — тем ценнее выгрузка на локальную LLM.
Прикидка · другое железо

А если карта слабее — что меняется

Замер сделан на RTX 4090 с qwen3-coder:30b. На слабом железе ставят модель поменьше. Две независимые оси, не путать:

Ось $ — frontier-модель. Долларовая экономия зависит только от того, какая frontier-модель платит за контекст (Fable/Opus/Sonnet). Локальная LLM бесплатна — её размер на $-экономию не влияет.
Ось надёжности — локальное железо. Меньше карта → меньше модель → ниже скорость и надёжность выжимки, чуть больше D (±20–30%). Экономия % почти та же.

Проверка пессимизмом (мелкая модель, D×2, JSON-лог): (27 680−2 500)/27 680 = 91% вместо 95.5% — всё ещё 90%+. Порог рентабельности (~10 КБ) и цифры экономии переносятся на 7b/14b почти без изменений.

ПараметрНоут 3070 · 8 ГБДесктоп 3060 · 12 ГБ Референс 4090 · 24 ГБ
Модель классаqwen2.5-coder:7bqwen2.5-coder:14b qwen3-coder:30b✓ замер
VRAM модели (Q4)~4.4 ГБ~9 ГБ 18 ГБ (MoE)
Экономия % (≥26 КБ)83–94%88–96% 91–97% ✓
Порог рентабельности~10 КБ / 150 стртот же тот же
$-экономия / 1000 файлов одинакова на любом железе — задаётся frontier-моделью (см. секцию «деньги»), не картой
Скорость ген. (оценка)50–90 tok/s20–30 tok/s ~34 tok/s
Надёжность выжимкиниже средняяякорь
Дефолт N подряд → solo1 22
Делегировать числанет осторожно, строже валидацияда, со сверкой

Скорости — грубая оценка по VRAM-bandwidth (3060 ≈360 ГБ/с, 4090 ≈1008 ГБ/с); 30b — MoE с ~3B активных, потому быстрая несмотря на 18 ГБ веса. 8/12 ГБ — расчёт, не прогон.

Модель + настройки Ollama под железо

ЖелезоVRAMМодельQuant num_ctxkeep_alive
Ноут 3070 / 40608 ГБqwen2.5-coder:7b Q4_K_M81925m
Десктоп 306012 ГБqwen2.5-coder:14b Q4_K_M1638410m
Десктоп 4090 (замер)24 ГБqwen3-coder:30b Q4·MoE3276830m
CPU-only fallbackqwen2.5-coder:3b Q440962m
// extraction-вызов, Ollama HTTP API
"format": "json", // форс JSON-грамматики → режет bad_json
"options": { "temperature": 0, // детерминизм → меньше галлюцинаций
  "num_ctx": 16384, // по VRAM: 8ГБ→8192, 24ГБ→32768+
  "num_predict": 2048 // потолок выхода = потолок D }
Модель падений

Делегация падает — когда бросить и сделать самому

Каждый провал делегации тоже жжёт токены frontier: надо прочитать ошибку/мусор и решить «повторить или escalate». Обозначим цену одного провала f. Решение forward-looking (уже потраченное — sunk cost, в расчёт не идёт):

E[retry] = D + f·(1−p)/p // ожидаемая стоимость «повторять до успеха»
solo выгоднее, когда E[retry] > S

Провалы на одном входе не независимы — патологичный файл ломает систематически. Оценка вероятности успеха по Лапласу после k провалов подряд: p̂ = 1/(k+2)(1−p)/p = k+1. Критерий сворачивается в порог:

Nswitch = ⌊(S − D) / f⌋ // столько провалов подряд терпим, дальше — solo
Цена провала

Тип падения решает — не количество

Измеренная стоимость f одного провала в токенах контекста frontier:

Тип паденияf, токКак измерено 
пустой ответ130обёртка вызова
HTTP 500143строка ошибки
timeout145traceback
VRAM-guard150строка
bad_json (проза вместо JSON)885реальный прогон, 755 ток прозы
галлюцинацияD + α·Sвалидация дочитывает долю α источника

Инфра-сбои дёшевы (~140 ток), bad_json дороже, галлюцинация — самая дорогая: она невидима, и проверка выжимки заставляет дочитывать сам источник.

Матрица порога

Сколько провалов терпеть — Nswitch

ФайлS−Dинфра ~140bad_json 885 галлюц α=0.25галлюц α=0.5
текст-карточка 2.5 КБ2 00 00
код-анализ 26 КБ6 153 41–476 21
changelog 51 КБ13 790 91–10615 31
JSON-лог 96 КБ26 437 176–20329 31
Токен-порог нельзя брать буквально. Для инфры он огромен (40–200), но ретраить 200 раз нельзя: доминирует время (N × timeout) и политика «краш локальной модели → отчёт, не молчаливый бесконечный ретрай». Реальный порог = min(токен-порог, practical cap).

Правило

Операциональный критерий

Суть: дешёвый и видимый провал (пусто/HTTP/timeout) — ретрай почти бесплатен, не паникуй. Дорогой и скрытый (галлюцинация) — уходи в solo рано, пока не потратил больше, чем сэкономил.

Честные оговорки

Границы применимости