Перейти к содержимому
AUTHORВЫПУСК №008 → АВТОМАТИЗАЦИЯ АГЕНТАМИ: 90% НЕ ПРОМПТ / имейте совесть, когда будете делиться или копировать
>AISTUDY_
FOLDER №02 / SHEET 002 REV·01 / SCALE NTS BY · AUTHOR / 2026 DRAFT
002 FOLDER №02 / SHEET 002
· · ·  ВЫБОР МОДЕЛИ ПОД ЗАДАЧУ  · · ·
REV·01 / SCALE NTS / RU · 2026-05-08
PRE-FLIGHT · SELECT AUDIENCE

ВЫБЕРИ, КАК ЧИТАТЬ

Этот выпуск идёт в двух версиях. Выбери одну — выбор сохранится при возврате, переключиться можно в любой момент сверху страницы.

КЛАСС ЗАДАЧИ: SHORT-CONTEXT PAIR CLASSIFICATION · 11 КЕЙСОВ · 12 МОДЕЛЕЙ

РЕЖИМ:

OUTPUT ВЫПУСК №002

ВЫБОР МОДЕЛИ ПОД ЗАДАЧУ

Когда модель должна решить «связано или нет». Шаблон замера на 11 кейсах и 12 моделях. Дедупликация багов, маршрутизация поддержки, антифрод — задачи одного класса.

B01
ОПИСАНИЕ И ЗАЧЕМ SHEET 002 · B01 / 06

Дрейф, которого не было в обещаниях

Ставишь модель в работу — через месяц видишь, что-то поехало. Маршрутизация обращений промахивается на каждом пятом тикете. Дедупликация багов клеит несвязанное. Антифрод режет нормальных клиентов.

Идёшь читать про новую модель, может поможет. Там пишут: «лидер в рейтинге программистских задач», «лучше предыдущей на тысячу пунктов в каком-то тесте», «отличница по экзаменам с 89% правильных ответов». Цифры красивые. Только с твоей картиной они не сходятся.

Главное

Вопрос «какая модель лучше?» — неправильный. Правильный — «как замерить под мою задачу?». Чужие рейтинги проверяют общее, твоя задача узкая.

Почему чужие цифры не работают

Их называют бенчмарками — стандартные тесты, на которых модели сравнивают между собой. Бенчмарки проверяют общие умения: написать код, ответить на экзаменационный вопрос, перевести фразу. Они полезны, чтобы сравнить модель A с моделью B в общем. Но твоя задача узкая: сравнить две короткие записи и сказать — связано или нет. Общие тесты её не покрывают.

Решение простое. Берёшь 10–15 случаев из своей системы, у которых ты сам знаешь правильный ответ. В трекере багов это пары «коммит и закрытый им баг» — закрытие уже произошло, значит правильный ответ известен. В поддержке — пары «обращение и категория, в которой оно реально оказалось». В антифроде — транзакции, по которым уже есть вердикт. Эти пары с известным ответом называют эталоном (по-английски ground truth — «истина на земле»).

Прогоняешь эти случаи через 4–6 моделей. Смотришь, кто справился, кто нет, и на каких случаях ошибся.

Зачем именно 10–15 случаев?

Меньше — не видно характера: на 5 примерах любая модель может случайно угадать или случайно ошибиться, и ты не отличишь одно от другого. Больше 20 — лишние деньги и время без новой информации, потому что задача узкая и большинство случаев похожи друг на друга.

Зачем 4–6 моделей?

Одна — не с чем сравнить. Две — слишком мало разных «характеров». Шесть — уже видно, что одни модели любят отвечать сразу «да» или «нет», другие осторожничают и часто говорят «не уверен», третьи медленные, но точные. Это и есть характер модели — от него зависит, подходит ли она под твою задачу.

Прогон 15 случаев через 6 моделей занимает примерно час с учётом сборки данных и стоит десятки центов суммарно. Один раз сделал — понимаешь, кому отдать работу.

Что в итоге

Замер на своих данных даёт не победителя. Победителя в общем случае нет. Замер даёт другое: ты видишь, как разные модели ведут себя на твоём типе задач, и можешь обоснованно выбрать ту, чьё поведение совпадает с тем, что нужно продукту.

Дрейф метрик после релиза провайдера

Стандартная история. Модель в pipeline (kg_linker, antifraud_classifier, ticket_router — любой модуль, который классифицирует пары записей). Через месяц видно дрейф метрик. Идёшь к провайдеру — у них свежий релиз: Codeforces 3206, MMLU 89%, +3pp на HumanEval. Ставишь — на твоём кейсе хуже. Возвращаешь старую — на новых задачах хуже неё.

Что эти цифры значат и почему не сходятся

Codeforces 3206 — рейтинг ELO на одноимённой платформе соревновательного программирования. Модель решает алгоритмические задачи (структуры данных, динамическое программирование, графы) и получает рейтинг по той же шкале, что и люди. 3206 — уровень grandmaster, выше большинства живых программистов в мире.

MMLU 89% — Massive Multitask Language Understanding, тест из 57 предметов от истории США до клинической медицины. Закрытые вопросы с четырьмя вариантами. Уровень эксперта-человека — около 90%.

+3pp на HumanEval — HumanEval, набор из 164 задач Python, оценивается через автоматический прогон тестов. +3pp = три процентных пункта прироста pass@1.

Все три бенчмарка качественные. Проблема не в их корректности, а в том, что у тебя другая задача:

input:  (text_A, text_B), оба ≤ 1000 токенов, на русском
output: одно из {YES, NO, MAYBE} с обоснованием 1-2 предложения
ground truth: размечена из истории закрытий тикетов
distribution shift: high — продакшен-данные не похожи ни на Codeforces, ни на MMLU

Дистрибуция (distribution) — характер данных, на которых модель проверяют. Если модель показывает 90% accuracy на алгоритмах и 89% на экзаменах — это не значит, что покажет 90% на твоём «русский короткий текст A vs русский короткий текст B». Может показать 60%, может 95% — заранее не известно.

Подход

11 кейсов с ground truth → один промпт-шаблон → asyncio.gather по 12 кандидатам → сводная таблица YES/NO/MAYBE × latency × cost. Стоимость прогона — десятки центов, время — час с учётом сбора кейсов.

В моём случае это дало неожиданный результат: top-модель Codeforces проиграла модели из второго эшелона по точности на ground truth, по скорости и по цене на порядок. Дальше — почему так выходит, какие универсальные правила вытащить, и как тот же шаблон применить к смежным задачам.

Что замер даёт на самом деле

Бенчмарк на своих данных даёт не победителя, а decision profile каждой модели на твоей дистрибуции. Decision profile — это уже продуктовое решение, не техническое. На нём строится выбор: decisive или hedged, режет в крайности или сохраняет неопределённость, держит latency-бюджет.

B02
КЛАСС ЗАДАЧ — ЧТО ВХОДИТ, ЧТО НЕТ SHEET 002 · B02 / 06

Семейство задач «связано или нет»

Звучит просто, но это целое семейство. У тебя могут быть такие случаи:

  • два бага в трекере — один и тот же или разные?
  • обращение в поддержку — в какую категорию положить?
  • транзакция и история клиента — подозрительная или нормальная?
  • описание товара от поставщика — соответствует карточке маркетплейса?
  • резюме — подходит к вакансии?
  • комментарий — спам или нет?

Все они работают по одной схеме. На входе короткий текст A и короткий текст B, на выходе одно из 3–5 решений. Контекст — до тысячи слов, ответ модели — обычно за секунду.

Почему этот класс удобен

Правильные ответы у тебя уже есть (из прошлых случаев). Кейсов нужно мало (15 хватает). Стоимость прогона — копейки. Один час времени окупается на годы вперёд.

Когда шаблон не работает

  • Длинные документы. Когда модель должна прочитать договор на 30 страниц и ответить на вопрос — она ведёт себя иначе, замер нужно делать по-другому.
  • Творческие задачи. Написать пост, придумать идею, отредактировать текст — нет «правильного ответа», по которому замерять.
  • Задачи с инструментами. Когда модель сама ходит в API, в код, в базы данных — там играет роль не столько модель, сколько как ты ей описал инструменты.
  • Генерация кода с тестами. Тесты сами проверяют, проходит код или нет. Это уже автоматический замер, ему отдельная методика.

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

Формальная рамка — short-context pair classification

  • Вход: пара (text_A, text_B), каждый ≤ 1K токенов
  • Выход: класс из закрытого набора (обычно 2–5 классов)
  • Ground truth: из истории закрытий, ручной разметки или правил
  • Метрики: accuracy / precision / recall / F1 / confusion matrix
  • SLA: типичный latency-бюджет — единицы секунд
  • Cost: тарификация по токенам, доли цента за инференс

В моём проекте конкретная задача — определить по описанию git-коммита и описанию открытого тикета, закрывает ли коммит этот тикет. Решение YES триггерит автоматическое закрытие, MAYBE — эскалейт человеку, NO — игнор.

Похожие задачи, переносится буквально

  • entity linking в knowledge graph при пограничной cosine-similarity (косинус 0.6–0.8 — нужен LLM-tie-breaker)
  • маршрутизация обращений в поддержку по категориям (text → category, multi-class)
  • триаж транзакций антифродом с трёхуровневым выходом {OK, REVIEW, BLOCK}
  • product matching между описанием поставщика и карточкой маркетплейса
  • модерация UGC по кратким правилам

Шаблон замера переносится между ними буквально: меняется только casebook и system prompt. На выходе три полезных артефакта: точностный профиль на твоей дистрибуции, поведение в серой зоне, реалистичный latency × cost.

Когда шаблон НЕ работает

  • long-context (RAG, документы) — другая чувствительность к compression и caching
  • генеративные задачи без ground truth — LLM-as-judge или human eval
  • agentic loops — значимы tool schema, max_tokens на reasoning, retry-стратегия
  • code generation с автотестами — pass@k, отдельная методика
B03
ШЕСТЬ ШАГОВ ЗАМЕРА SHEET 002 · B03 / 06

Каждый шаг — 5–30 минут. Полный замер укладывается в час-два.

Шаг 1. Определи свой класс задачи

Прежде чем мерить — ответь на три вопроса.

1

Сколько текста на входе?

Если оба текста суммарно меньше тысячи слов — наш шаблон работает. Больше — нужна другая методика, потому что на длинном контексте модели ведут себя иначе.

2

Какие у тебя ответы?

Закрытый список (да/нет, категория из 4-5) — работает. Свободный текст или развёрнутый ответ — нет, это другая задача с другим способом измерения.

3

Знаешь ли правильный ответ на прошлые случаи?

Знаешь — можешь делать замер. Не знаешь — сначала разметка (5–10 случаев глазами), потом замер.

Чек:

  • Контекст ≤ 1K токенов на пару (посчитай через провайдерский tokenizer, не на глаз — привет это 1 токен, а здравствуйте уже 4–5)
  • Output — closed-set classification, не generation
  • Ground truth ≥ 15 размеченных примеров

Все три «да» — едем дальше.

Шаг 2. Собери 11 кейсов с правильными ответами

Откуда брать. Самый удобный источник — твоя история. Если в системе уже происходили события «правильное соединение» (бот закрыл баг по PR, и человек подтвердил), это и есть твои правильные ответы.

Из истории отбираешь 6–8 случаев четырёх разных типов:

  • Очевидно связаны (правильный ответ — да): прямое закрытие.
  • Очевидно НЕ связаны (правильный ответ — нет): два разных бага, два разных тикета.
  • На границе (общая тема, но разные детали): модель должна сказать «не уверен».
  • Заведомо разные: две случайные несвязанные записи.
Зачем именно эти типы

На очевидных «да» и «нет» все модели справляются — ты не увидишь разницы. Граница и контроль — это и есть тест на характер. Здесь модели расходятся.

К реальным случаям добавляешь 3–5 синтетических — заведомо несвязанных пар, которые ты сочинил вручную. Они нужны как контрольная точка: если модель на них даёт «да» — значит, она ломается на твоём промпте, и проблема в формулировке, не в данных.

Итого 11–13 кейсов — этого достаточно.

Структура casebook (CSV):

case_id, kind,      ground_truth, text_a,   text_b,   note
1,       real,      yes,          "...",    "...",    прямое закрытие через PR
2,       real,      yes,          "...",    "...",    закрытие по ссылке в commit msg
3,       real,      no,           "...",    "...",    тематически близкие, разные баги
4,       real,      maybe,        "...",    "...",    серая зона, эскалейт
5,       real,      no,           "...",    "...",    разные модули
6,       real,      yes,          "...",    "...",
7,       synthetic, no,           "...",    "...",    контроль NO-1
8,       synthetic, no,           "...",    "...",    контроль NO-2
9,       synthetic, no,           "...",    "...",    контроль NO-3
10,      synthetic, maybe,        "...",    "...",    синтетический пограничный
11,      synthetic, no,           "...",    "...",    контроль NO-4

Распределение типов: ≈40% явно YES, ≈40% явно NO, ≈10% серая зона, ≈10% синтетический контроль.

Реальные кейсы — SQL-ом из таблицы событий:

SELECT a.id, a.text AS text_a, b.id, b.text AS text_b, e.verdict
FROM resolution_events e
JOIN entities a ON a.id = e.source_id
JOIN entities b ON b.id = e.target_id
WHERE e.verdict IN ('confirmed', 'rejected', 'escalated')
  AND e.created_at > now() - interval '90 days'
ORDER BY random()
LIMIT 30;

Из 30 рандомных руками отбираешь 6–8 нужных типов. Меньше 30 на старте — велик шанс плохого баланса.

Шаг 3. Напиши единый промпт

Один и тот же промпт получают все модели. Иначе сравнение нечестное: дашь одной длинную инструкцию, другой короткую — увидишь разницу инструкций, а не моделей.

Что должно быть в промпте
  • Что от модели хотят, одной фразой.
  • Что такое A и что такое B.
  • Список разрешённых ответов (только YES, NO или MAYBE — никаких других слов).
  • Требование короткого обоснования (1–2 предложения).
  • Требование структурированного формата (например, JSON), чтобы потом легко собрать в таблицу машинно.
Что НЕ ставить
  • Примеры ответов в правильную сторону — это сместит модель и испортит замер.
  • Логику «если уверен — пиши YES, иначе MAYBE» — это и есть то, что ты пытаешься замерить, не подсказывай.
  • Имя модели или провайдера — пусть промпт работает для всех одинаково.

Готовый шаблон промпта приложен в наборе скриптов ниже (P02). Скопируй, замени описание задачи под себя, прогоняй.

Шаблон, протестировать на 1–2 кейсах перед массовым прогоном:

SYSTEM:
Ты определяешь, закрывает ли изменение A событие B.
Возвращай JSON: {"verdict": "YES"|"NO"|"MAYBE", "reason": "..."}
- YES: A напрямую закрывает B
- NO: A не связано с B или связано косвенно (общая тема, разные изменения)
- MAYBE: есть прямая связь, но не хватает доказательства закрытия
Reason — 1-2 предложения, по-русски.

USER:
A: <text_a>
B: <text_b>

Что критично:

  1. Никаких few-shot примеров. Смещают распределение и маскируют истинный профиль.
  2. Никаких «будь уверен». Это пресет, а ты как раз меряешь работу без него.
  3. JSON-output. На 12 моделях × 11 кейсов разбирать произвольный текст — потеря времени.
  4. Слово json в user message — обязательно для DashScope (Qwen). Без него response_format=json_object отвечает 400.
  5. temperature=0 для воспроизводимости. Исключение — Anthropic extended thinking (там жёстко требуется 1.0).

Шаг 4. Прогон через всех кандидатов

Берёшь 4–6 моделей разного типа. Зачем именно разнотипных:

  • одна американская премиум — для верхней границы качества
  • одна-две китайские с дешёвым API — могут оказаться лучшим компромиссом
  • одна российская, если ты в РФ-инфре — чтобы понять, есть ли смысл их использовать
  • одна и та же модель в двух режимах: «с размышлением» и «без»
Про режимы

У большинства современных моделей есть переключатель: модель может перед ответом дольше думать про себя (это называют «размышлением» или thinking) — это помогает на сложных задачах, но дороже и медленнее. На простых задачах размышление часто не приносит пользы. Хорошо мерить обе версии.

Прогон — 11 запросов к каждой модели. Если делать по очереди — займёт несколько часов. Если параллельно (все модели одновременно, все кейсы одновременно) — уложится в минуту-две.

Для каждого кейса каждой модели сохрани: ответ (YES/NO/MAYBE), обоснование, время ответа, стоимость. Стоимость считается по тарифу провайдера: токены на входе × цена за тысячу + токены на выходе × цена за тысячу.

Кандидаты в шорт-лист (пример из моего замера, под свой стек подбирать аналогично):

provider     model              mode       why
anthropic    claude-sonnet      default    премиум-якорь
anthropic    claude-sonnet      thinking   сравнить ON vs OFF
deepseek     deepseek-v4-pro    thinking   топ Codeforces, проверка гипотезы
zai          glm-5.1            thinking   китайский reasoner
zai          glm-5.1            default    он же без thinking
dashscope    qwen3.6-plus       thinking   китайский universal
dashscope    qwen3.6-plus       default    он же без thinking
openrouter   kimi-k2.6          thinking   через router
sber         gigachat-2-max     default    российский, нет thinking-toggle
yandex       yandexgpt-5.1      default    российский, silently игнорирует effort

Запуск через asyncio.gather с Semaphore(6) для лимита одновременных коннектов на провайдера. Готовый скрипт bench-runner.py приложен ниже (P03) — копируй, ставь свои API-ключи, запускай.

Логировать в JSONL по строке на (модель, кейс) — потом агрегировать pandas.read_json(lines=True).

Шаг 5. Чтение результатов

Когда таблица собрана — не смотри на одну общую точность. Смотри на четыре вещи.

Что модель отвечает по типам кейсов

  • На «очевидно да»: все должны сказать YES. Кто говорит NO — пропускает реальные связи. В проде это «не закрыли баг», который реально был закрыт. Клиент видит висящий тикет.
  • На «очевидно нет»: все должны сказать NO. Кто говорит YES — это ложные тревоги. В антифроде — заблокировали невинного клиента. В дедупликации — слепили два разных бага в один.
  • На границе: тут уже про характер. Кто часто говорит MAYBE, кто срезает в YES/NO.

Скорость

Если задача в чате с пользователем, секунда vs пять секунд это разные продукты. Если в фоне раз в час — скорость не важна.

Цена

На 100 тысячах запросов в день разница 0.005 vs 0.05 доллара за запрос — это 150 vs 1500 долларов в месяц.

Что искать в таблице

Не «лучшую» модель, а ту, чей характер совпадает с архитектурой твоего продукта. Иногда выигрывает не самая точная, а самая быстрая и дешёвая, потому что точности «достаточно», а скорости и цены — нет.

Reading framework — четыре оси, не одна accuracy:

  1. Confusion matrix per ground-truth class. Sensitivity на YES-truth (recall на положительном классе), specificity на NO-truth, поведение на MAYBE-truth (сохраняет или режет). Это реальный профиль.
  2. Decision profile distribution. Доля YES/NO/MAYBE в ответах модели на одних и тех же 11 кейсах. Одна выдаёт 9/2/0, другая 6/2/3 — это два разных продукта. Какой нужен — вопрос архитектуры (есть ли эскалейт-канал), не вопрос модели.
  3. Latency p50 / max. На 11 кейсах p99 нереалистичен, но p50 и max уже показательны. Если max > 30с — модель не подойдёт под inline-сценарии независимо от accuracy.
  4. Cost per case. Учитывать reasoning_tokens отдельно — у некоторых провайдеров они тарифицируются как output, у других — отдельной строкой.

После такого чтения часто выясняется: топ по accuracy проигрывает по latency × cost, а decisive non-reasoning модель из второго эшелона даёт тот же decision profile в 5–10× дешевле.

Шаг 6. Деплой и повтор раз в полгода

Поставил выбранную модель — не забудь две вещи.

Запасной вариант

Если выбранный провайдер упадёт (бывает раз в месяц у любого), у тебя должна быть запасная модель того же класса. Лучше с худшей точностью, чем простой пайплайн.

Повтор замера

Раз в 3–6 месяцев модели обновляются, цены меняются, появляются новые. Casebook у тебя уже есть — прогнать заново те же полчаса. Иногда обнаруживается, что текущая модель стала вдвое дешевле или появился кандидат, который её обходит. Без повтора этого не узнаешь.

Production-чек:

  • Fallback model (тот же класс, цена ≤ 2× от основной, другой провайдер) с автоматическим переключением на 5xx / timeout
  • Версионирование промпта в коде (PROMPT_V = "v3") для воспроизводимости при дрейфе
  • Sample logging: 1–3% реальных запросов с полным input/output → S3 / pg, для еженедельного спот-чека на дрейф
  • Calendar reminder на 6-месячный re-benchmark; тот же casebook + 3–5 новых кейсов из последнего квартала

Triggers для внеочередного re-bench:

  • Major version у текущего провайдера
  • Изменение прайсинга > 20%
  • Появление нового кандидата с похожим профилем + меньшей ценой
  • Дрейф accuracy на сэмпле > 5pp от исходной
B04
ЧТО ВЫШЛО У МЕНЯ SHEET 002 · B04 / 06

Прогнал 12 моделей-режимов на 11 кейсах. Сводная таблица — анонимизированная: реальные имена сущностей убраны, оставлены model IDs и метрики.

АКТ ЭКСПЕРТИЗЫ
12 моделей × 11 кейсов · 2026-05
Модель Режим YES NO MAYBE Latency Cost / прогон YES-truth MAYBE-truth
sonnetdefault1911.9 с$0.0311/2NO ✗
sonnetthinking1554.4 с$0.0421/2MAYBE ✓
deepseek-v4thinking19112.1 с$0.0051/2NO ✗
kimi-k2.6thinking16418.5 с$0.0551/2MAYBE ✓
qwen3.6thinking26320.9 с$0.0232/2NO ✗
qwen3.6default2812.4 с$0.00172/2NO ✗
glm-5.1thinking2729.7 с$0.0152/2MAYBE ✓
glm-5.1default2632.8 с$0.00462/2MAYBE ✓
yandex-5.1default11000.71 с~$0.0251/2NO ✗
giga-2-maxdefault11001.63 с1/2NO ✗

★ — модель, поставленная в production. Дальше — пять уроков из этой таблицы.

Урок 1. Чемпион программистских рейтингов проиграл середняку

Топ-модель программистских рейтингов (DeepSeek V4 Pro thinking, уровень grandmaster по соревновательному программированию) проиграла GLM 5.1 без размышления:

  • На «явно да» (когда модель должна сказать YES): 1 правильный ответ из 2 против 2 из 2.
  • На границе (когда нужен MAYBE): сказала NO (ошибка) против MAYBE (правильно).
  • По скорости: 12.1с против 2.8с (в 4 раза).
  • По цене за прогон: примерно равно с размышлением, но без размышления GLM уходит в копейки.

Топ-модель Codeforces (DeepSeek V4 Pro thinking, рейтинг 3206 — уровень grandmaster) проиграла GLM 5.1 без thinking:

  • YES-truth recall: 1/2 vs 2/2
  • MAYBE-truth: NO (false) vs MAYBE (correct)
  • Latency: 12.1s vs 2.8s (×4.3)
  • Cost per run: примерно равно с включённым thinking; без thinking GLM уходит в копейки
CONTRAST «ВПЕЧАТЛЯЕТ В РЕЙТИНГЕ» ≠ «ПОДХОДИТ ПОД ТВОЮ ЗАДАЧУ» правильный инструмент vs не тот
ЧЕРТЁЖ · СПЕЦ ПОД ЗАДАЧУ

YES-TRUTH

Замер на 11 кейсах твоей дистрибуции. Размечен из реальных закрытий.

2 / 2

GLM 5.1 default · 2.8 секунды · $0.005

Один и тот же чемпион. Слева — что важно для задачи. Справа — то, что красиво в брошюре.

Чему это учит: рейтинг по алгоритмам не предсказывает работу на твоей задаче. Совсем не предсказывает.

Урок 2. Размышление модели не всегда платится

Та же Qwen 3.6 Plus в двух режимах:

  • С размышлением: 6 NO, 2 MAYBE, 3 YES; 21 секунда, $0.023 за прогон.
  • Без размышления: 8 NO, 1 MAYBE, 2 YES; 2.4 секунды, $0.0017 за прогон.

Характер ответов почти не меняется (одно решение перетекает MAYBE → NO). При этом скорость в 9 раз, цена в 13 раз.

Главное

На задачах с коротким контекстом и чёткими правильными ответами размышление часто не приносит ценности — модель тратит токены впустую. На длинном контексте или сложной логике — другое дело, мерить отдельно.

Та же Qwen 3.6 Plus в двух режимах:

  • thinking ON: 6 NO / 2 MAYBE / 3 YES; 21s; $0.023
  • thinking OFF: 8 NO / 1 MAYBE / 2 YES; 2.4s; $0.0017

Decision profile почти не меняется (одно решение перетекает MAYBE → NO). Скорость ×9, цена ×13.

На short-context + чёткой ground truth thinking жжёт reasoning_tokens без прироста точности. На long-context / сложной логике — мерить отдельно, там может выиграть.

Урок 3. Decisive vs hedged — продуктовое решение

Две группы моделей с разным «характером ответов»:

  • Decisive (всегда YES/NO): российские, китайские без размышления. MAYBE редко или никогда.
  • Hedged (часто MAYBE): американские с размышлением, китайские reasoner-модели. Осторожные.

Какой характер нужен — не вопрос «лучше/хуже», а вопрос архитектуры:

  • Есть менеджер, разбирающий «не уверен» → нужен hedged. Иначе MAYBE некуда деть.
  • Автомат должен сразу решать → нужен decisive. Иначе MAYBE превращается в зависший тикет.

Выбирать модель по точности без учёта характера — менять одну непригодную модель на другую непригодную.

Две группы моделей с разным decision profile:

  • Decisive: российские модели, китайские без thinking. Distribution YES/NO/MAYBE — 1/10/0 или 2/8/1.
  • Hedged: американские с extended thinking, китайские reasoner-модели. Distribution — 1/5/5 или 2/6/3.

Архитектурный выбор:

  • Hedged подходит, когда есть escalation queue для MAYBE-результатов
  • Decisive подходит, когда система должна принимать решение без human-in-the-loop
  • Hedged без эскалейт-канала = бессмысленно: MAYBE всё равно будет приведено к решению эвристикой

Урок 4. Родной язык корпуса не означает преимущества

Гипотеза «российские модели лучше понимают русский, потому что обучены на русском корпусе» на спорных кейсах не подтвердилась. На пограничных случаях (общая тема, разные детали) российские модели проигрывают и Sonnet, и GLM по точности. Преимущество корпуса нивелируется отсутствием размышления и более простой архитектурой.

Вывод

Не ставь модель «по национальному признаку» (и не отказывайся от неё по нему же). Замер всё равно нужен — он покажет реальный профиль, а не предполагаемое преимущество.

Гипотеза «native-language corpus advantage» на нашем casebook опровергнута: yandex-5.1 и giga-2-max показали 1/2 на YES-truth и NO на MAYBE-truth, в то время как GLM 5.1 (Mandarin/English-base) даёт 2/2 + MAYBE. Reasoning chain в hedged-моделях перевешивает языковое преимущество корпуса.

Урок 5. Модель врёт о себе и параметры могут игнорироваться молча

Спросил одну из моделей: «расскажи, какой у тебя контекст и cutoff». Ответила: «128K, май 2025». По документации провайдера — 1M, март 2026. Модели часто не знают свою точную спецификацию из training data: она появилась после обучения.

Похожая история с параметрами API. Один из российских провайдеров принимает параметр «думай больше» без ошибки, статус 200, ответ возвращается. Только дополнительных размышлений нет, скорость идентична обычному режиму, ответы те же. Параметр silently ignored — release notes провайдера явно говорят «не поддерживается в этой версии», но API его молча принимает.

Спросил DeepSeek V4 Pro: «what's your context window and training cutoff?». Ответ: «128K, May 2025». По официальной документации провайдера — 1M context, March 2026 cutoff. Модель не знает свою точную спецификацию из training data — она появилась после.

С API параметрами та же история. YandexGPT 5.1 принимает reasoning_effort: "high" со статусом 200, без ошибки. При этом reasoning_tokens=0, latency идентична default-режиму, decisions те же. Release notes провайдера прямо говорят: «not supported in this version» — но API молча принимает.

CONTRAST «ОТВЕТИЛО ОК» ≠ «РАБОТАЕТ» источник правды vs ответ модели
ИСТОЧНИК ПРАВДЫ · ДОКУМЕНТАЦИЯ

DeepSeek V4 Pro

Context window: 1 048 576 токенов (1M).

Training cutoff: март 2026.

Источник: provider docs · models.list() endpoint.

Проверяется одним curl-запросом. Никаких сюрпризов.

Слева — правда. Справа — то, что модель говорит о себе. Это разные источники.
CONTRAST API ПРИНЯЛ ≠ API СРАБОТАЛ silently ignored параметры
ЧЕРТЁЖ · SANITY CHECK

CHECK

Прогон одного кейса с тремя значениями параметра. Сравнить:

  • latency меняется?
  • reasoning_tokens > 0?
  • decisions расходятся?

Все три «нет» → параметр игнорируется. Удалить из кода.

Статус 200 ≠ параметр учтён. Только sanity-check замером даст ответ.

Итог пятого урока: спецификация модели — только из доков провайдера и models.list, не из ответа самой модели. Sanity-check параметров — через сравнение latency, output_tokens и decisions при разных значениях. Идентично — параметр не работает.

B05
ПРОМПТЫ И ГОТОВЫЙ НАБОР СКРИПТОВ SHEET 002 · B05 / 06

Работаешь с Claude Code, Codex или другим CLI-агентом — четыре фразы ниже делают замер за тебя. Плюс приложен готовый набор скриптов: скачал, поставил свои API-ключи, запустил.

P1

СБОРКА КЕЙСОВ — ПРОМПТ ДЛЯ АГЕНТА

Скажи агенту:

Собери 11 кейсов для бенчмарка модели. Задача: классифицировать пары
(text_A, text_B) на YES, NO, MAYBE: связано или нет.

Источник реальных кейсов: история событий из такой-то таблицы с разметкой
результата.

Распределение: 5 явно YES, 4 явно NO, 1 пограничный MAYBE,
1 синтетический NO как контроль.

Вывод: CSV с колонками case_id, kind, ground_truth, text_a, text_b, note.
Все на русском, описание не короче 30 слов и не длиннее 200.
Пограничные и синтетические кейсы пометь в note, чем именно они трудные.

Тот же промпт с уточнениями для engineer'а:

Собери 11 кейсов для бенчмарка модели. Задача: classify (text_A, text_B)
into {YES, NO, MAYBE}: связано или нет.

Источник: SQL-запрос к resolution_events, JOIN с entities. Возьми последние
90 дней, ORDER BY random() LIMIT 30, потом руками отбирай нужный баланс.

Распределение: 5 явно YES, 4 явно NO, 1 на границе MAYBE, 1 synthetic NO
как sanity check.

Вывод: CSV с колонками case_id, kind, ground_truth, text_a, text_b, note.
Текст на русском, 30-200 слов на запись.
Synthetic кейсы — заведомо unrelated пары (контроль NO).
Пограничные — общая тема, но разные изменения.
P2

ПРОМПТ КЛАССИФИКАЦИИ — ПРОМПТ ДЛЯ АГЕНТА

Скажи агенту:

Напиши system prompt и user template для классификации пар (A, B) на
YES, NO, MAYBE.

Требования:
- Ответ строго JSON: verdict и reason
- Reason на русском, 1 или 2 предложения
- Без few-shot примеров: примеры YES/NO в промпте смещают распределение
- Слово json должно быть в user message (требование DashScope для json_object)
- Чёткие определения YES, NO, MAYBE в system prompt

После шаблона приведи короткое объяснение, какие формулировки могут
сместить распределение к YES или к NO, и почему я должен этого избежать.

То же, плюс просьба прокомментировать distribution-bias:

Напиши system prompt и user template для 3-class classification пар
(A, B) → {YES, NO, MAYBE}.

Constraints:
- response_format strict JSON: {verdict, reason}
- reason — 1-2 sentences in Russian
- NO few-shot examples (smear distribution)
- слово "json" в user message (DashScope requirement for json_object mode)
- crisp definitions of YES/NO/MAYBE in system prompt

После шаблона: какие формулировки в system prompt могут сместить
распределение к YES или к NO. Конкретные паттерны для избегания.
P3

ПРОГОН БЕНЧМАРКА — ПРОМПТ ДЛЯ АГЕНТА

Скрипт уже есть в наборе выше — bench-runner.py. Если хочется адаптировать под другие провайдеры или изменить логику логирования, попроси агента:

Возьми bench-runner.py из набора. Адаптируй под мою задачу:
- Удали провайдеров, к которым у меня нет ключа.
- Добавь провайдера такого-то с base_url таким-то.
- Измени cost calculation: <провайдер X> тарифицирует cached тоже.
- Логируй дополнительно поле  в JSONL.

Запусти sanity-check на одном кейсе перед массовым прогоном.

Когда нужны мелкие тонкости:

Возьми bench-runner.py из набора. Поправь:
- MODELS array: убрать те провайдеры, где key=None
- PRICING dict: обнови, если есть свежий прайс
- Добавь поддержку streaming (если хочешь видеть ответы в реальном времени)
- Добавь retry-логику с экспоненциальным backoff на 5xx и rate-limit

Тест: один кейс на одной модели, проверить parse_response, latency,
cost calculation. Потом полный прогон.
P4

ЧТЕНИЕ РЕЗУЛЬТАТОВ — ПРОМПТ ДЛЯ АГЕНТА

Скажи агенту:

Прочитай results.jsonl. Для каждой модели посчитай:
- Decision profile: доля YES, NO, MAYBE
- Sensitivity на YES-truth, specificity на NO-truth
- Поведение на MAYBE-truth: сохраняет или режет
- Latency p50 и max
- Средняя стоимость за прогон 11 кейсов

Выведи markdown-таблицу: модель и все метрики.
В отдельной секции под таблицей — расхождения между моделями на одних
и тех же кейсах (где decisions разошлись), с цитатами reason.

Под этим — твоя интерпретация: какая модель ближе к decisive, какая к
hedged, и какая даёт лучший компромисс по latency, cost и accuracy.
Не выбирай победителя сам, дай мне три кандидата с обоснованием выбора
под три разных продуктовых сценария:
1. Inline-классификация в чате с пользователем
2. Фоновая обработка раз в час
3. Триаж с эскалейтом человеку

В наборе уже есть analyze-results.py — он делает базовое. Для более глубокого анализа попроси агента:

Возьми analyze-results.py из набора. Расширь:
- Confusion matrix per ground-truth class
- Cohen's kappa между моделями (на каких парах модели согласны)
- Bootstrap confidence intervals для accuracy на 11 кейсах
- Cost / accuracy Pareto frontier

Вывод оставь markdown-таблицами, добавь секцию с тремя кандидатами под
три продуктовых сценария (inline / batch / triage с эскалейтом).
B06
ФИНАЛ SHEET 002 · B06 / 06

Замер на своих данных — не разовая работа. Раз в полгода прогнать тот же casebook через текущих кандидатов занимает час, но защищает от двух тихих проблем: дрейфа качества у текущей модели и упускания нового кандидата, который стал лучше или дешевле. У меня в календаре стоит напоминалка раз в квартал.

И ещё одна мысль. Когда читаешь чужой бенчмарк со словами «модель X лучше Y на 5 пунктов» — это всегда о чужих данных. Может быть лучше на твоих, может быть хуже. Узнать только одним способом — собрать свои 11 кейсов и прогнать самому. Час времени и десятки центов — против месяцев в проде с моделью, которая «как у всех», но не подходит твоему продукту.

Замер — periodic, не one-shot. Раз в 3–6 месяцев прогон того же casebook против текущего шорт-листа: час работы, защита от provider drift и от регрессии на собственной дистрибуции. Calendar reminder — обязателен, иначе забывается.

Бенчмарк-claim в чужой статье — это claim о чужой distribution. Своя 11-кейсовая выборка стоит десятки центов, твоя истина — только в ней.

// Обсуждение

Можно писать анонимно. Укажите email, чтобы получать уведомления об ответах.