На этой неделе на Хабре спорили, нужны ли программисту самые умные модели: «Я перестал пользоваться самыми умными ИИ‑моделями». Автор считает, что для рутины хватает дешёвых, а упирается всё теперь в скорость. Под статьёй почти триста комментариев. Я прочитал, наверное, половину: мнений много, замеров на одинаковых задачах не нашёл ни одного. Стало интересно, сел и проверил на своих.
Что мерил
Взял пять задач из тех, что обычно скидываю агенту и иду за кофе. Всё на Python, от одного до пяти файлов:
Off-by-one в пагинации, тест падает, надо починить.
Переименовать функцию во всём проекте. С подвохом: в одном месте имя лежит строкой в словаре и вызывается через
getattr.Нормализация российского номера телефона по описанию словами.
Функция на полсотни строк с тройной копипастой. Надо разбить так, чтобы вывод остался байт в байт, а каждая функция влезала в двадцать строк.
Делёж счёта на n человек, в котором теряются копейки. В требованиях написано: лишние копейки достаются первым в списке, и для возвратов с отрицательной суммой тоже должно работать.
Модели — четыре штуки из одного семейства, от младшей к старшей: Haiku 4.5, Sonnet 5, Opus 5, Fable 5.1. Агент везде один (Claude Code в режиме -p, MCP отключил), промпт один, на каждый прогон чистая папка. Каждую задачу гонял по два раза на каждой модели, итого сорок прогонов. Проверял скрытым скриптом, которого модель не видит: там мои тесты и проверка, что видимые тесты никто не подправил.
Сразу скажу, чем это плохо. Задачи мелкие. Два прогона на клетку — это ни о чём. Семейство одно. Так что это замер на коленке, на бенчмарк не претендую. Задачи и проверки выложу, если кому-то надо.
Что получилось
Модель |
Решено |
Время на 10 прогонов |
Ходов агента |
Токенов вывода |
Цена к младшей |
|---|---|---|---|---|---|
Haiku 4.5 |
8 из 10 |
395 с |
100 |
39 137 |
1× |
Sonnet 5 |
9 из 10 |
450 с |
109 |
31 359 |
3,3× |
Opus 5 |
10 из 10 |
557 с |
108 |
39 455 |
6,9× |
Fable 5.1 |
10 из 10 |
341 с |
85 |
23 010 |
8,8× |
Цену считал сам клиент по списочному прайсу. Абсолютные цифры не пишу: устареют быстрее, чем вы это дочитаете. Соотношение проживёт дольше.
Теперь что меня удивило.
Самая дорогая модель оказалась самой быстрой. 341 секунда против 395 у самой дешёвой. Почему — видно в соседних колонках: ходов меньше, текста почти вдвое меньше. Младшая модель очень много рассуждает, 18 754 токена размышлений на десять прогонов, у старшей 2 674. Токены у неё летят быстрее, только их надо больше, и в сумме выходит дольше. Правда, Opus, вторая сверху, вообще самая медленная из четырёх, так что «дороже значит быстрее» тоже неправда. Я для себя решил смотреть на время задачи целиком. Токены в секунду его не предсказывают.
Дальше. Четыре задачи из пяти решили все модели, оба раза. Пагинация, переименование с подвохом, телефон, рефакторинг: 32 прогона из 32. Если у вас рутина примерно такая, девятикратная разница в цене вам ничего не даёт.
И вся разница вылезла на пятой задаче. Причём споткнулись там на чтении требований, с кодом у всех порядок.
Пятая задача
Первое, что приходит в голову:
base, remainder = divmod(total_cents, n) result = [base] * n for i in range(remainder): result[i] += 1
1000 на троих даёт [334, 333, 333], красота. А вот возврат, −1000: деление в Python округляет вниз, и получается [-333, -333, -334]. Лишняя копейка уехала в конец списка. То есть человек заплатил на копейку больше остальных, а при возврате получит на копейку меньше. В требованиях было «лишние копейки достаются первым», так что мимо.
Haiku написала именно так оба раза. Sonnet один раз из двух. Opus и Fable все четыре раза делили модуль суммы, а знак возвращали потом. И в отчёте сами объяснили зачем: если делить отрицательное число в лоб, лишняя копейка упадёт в конец, а в требованиях наоборот. Fable в одном прогоне ещё и скрипт написала, перебрала все суммы от −300 до 299 при n от 1 до 11. Я её об этом не просил.
Но больше всего мне понравился отчёт младшей модели. Цитирую как есть:
✓ Остаток достаётся первым в списке ✓ Работает для возвратов: split_bill(-100, 3) = [-33, -33, -34]
Две галочки подряд, и вторая строка опровергает первую. Видимый тест зелёный, отчёт бодрый, а баг вылезет на первом же возврате.
Справедливости ради: требование про возвраты можно прочитать по‑разному, и кто‑нибудь в комментариях наверняка скажет, что [-333, -333, -334] тоже нормально. Может, и так. Но старшие модели эту развилку увидели и объяснили, что выбрали. Младшая просто поставила галочку.
Что я теперь делаю
Задачи, где всё расписано и есть тесты, отдаю младшей модели. 32 из 32, и дешевле почти на порядок.
Если в требованиях мелькает «и для отрицательных», «и для пустого», «как было раньше», беру старшую. Код дешёвая модель пишет нормально. Она пропускает сам вопрос.
И отчёту «всё работает» верю ровно настолько, насколько сам вижу проверку. Один скрытый тест на граничный случай дешевле любой модели.
А у вас как? Кто гоняет дешёвые модели на рутине, на чём они у вас сыпятся?
UPD. В комментариях @xbox справедливо заметил, что я не указал уровень reasoning. Все прогоны в таблице шли на дефолте клиента, это high. Перепроверил три старшие модели на low: Sonnet 5 — 8 из 10 за 244 с, Opus 5 — 10 из 10 за 210 с, Fable 5.1 — 10 из 10 за 232 с. Opus на low из самого медленного стал самым быстрым и ничего не потерял, Sonnet на low оба раза ошибся на пятой задаче. Цена при этом упала примерно на треть: на мелких задачах основной расход — входной префикс агента, размышления стоят меньше.
Короткие заметки и замеры между статьями пишу в канале: https://t.me/agent_field_notes
Комментарии (7)

xbox
20.09.2026 08:59В статье не указано (или я это не нашел), на каких настройках (Low / Medium / High / Extra High / Max) проверялись модели. Цена решения того же Опуса в режиме Low и Max может отличаться и в 5 и в 10 раз. А следовательно все выводы по сравнению цены между разными моделями трудно оценивать.
Старшие модели для таких простых задач, вероятно нужно сразу ставить в режим Low, а у младших моделей возможно уровень размышлений можно и поднять. И тогда в выводах может получиться уже другая раскладка - например, Сонет на высоких настройках долго думал и не решил, а Опус на низких отработал быстрее и решил. По цене одинаково, а значит используем Опус.

Corkyz0011 Автор
20.09.2026 08:59Справедливо, в статье этого нет, моя недоработка. Все сорок прогонов шли на дефолте клиента, а это high (посмотрел в теле запроса: output_config.effort = high у всех).
Вашу гипотезу проверил, прогнал три старшие модели на low, те же пять задач по два раза:
Sonnet 5: 9/10 за 450 с на high → 8/10 за 244 с на low (пятая задача оба раза мимо) Opus 5: 10/10 за 557 с → 10/10 за 210 с Fable 5.1: 10/10 за 341 с → 10/10 за 232 с
То есть вы правы: Opus на low из самого медленного стал самым быстрым и всё решил, а Sonnet на low ошибся там же, где младшая. Цена у Opus упала примерно на треть, а не в разы: на таких мелких задачах основные деньги уходят на входной префикс агента, а не на размышления.
Добавлю это апдейтом в статью, спасибо.
mist56
Задачи детские, извините. Проблемы с дешёвыми моделями начинаются на уровнях интеграций ежа с ужом, когда в контексте надо держать и "понимать" не только проект и соответствующие API, но и логику процесса и прочее.
Вот буквально свежий кейс - 3 дня с горем пополам двигал проект дешёвым Spark 1.3 , т.к. опуса и астру выжег ещё в начале недели. Спарк неплохой кстати, вот такие мелкие задачки как в статье на раз делает. А вот с задачей покрупнее убил полтора дня, собрать целостно не мог систему. Уже готов был расчехлять IDE и лезть смотреть, что же там всё таки происходит =) Но вот с утра свежий лимит Астры подъехал и она за час перестроила всё это рукоблудство Спарка и сходу проект взлетел. И нет, сам бы я всё это недели делал, реально нетривиально там.
Corkyz0011 Автор
Согласен, и по моим цифрам это тоже видно, если присмотреться. На четырёх задачах из пяти младшая модель решила всё, но потратила 100 ходов и 39 тысяч токенов вывода против 85 ходов и 23 тысяч у старшей. То есть даже там, где она справляется, она идёт к ответу длиннее. На мелкой задаче это лишние десять секунд. На вашей интеграции, видимо, это и есть те самые полтора дня.
А на чём именно Spark ломался: терял логику между файлами или чинил одно и ломал соседнее?
mist56
Как бы это сказать. Субъективно "не видел задачу в целом" и поэтому "чинил" проблемы местечково, не оглядываясь на последствия сверху. Да, это не то, что вообще ожидаемо требовать от ЛЛМки, но просто вот такое дело, что Астра с таким уровнем "мышления" уже справляется. Фейбл тоже, но у него свои тараканы.
Опять же, субъективно. Такие вещи замерять вообще непонятно как. Собирать разломанный сложный стенд и давать его "чинить" всем подряд?
antonk42
Какие тараканы у Fable?
mist56
По моим ощущением бывает совсем тугодумом, причём без видимых причин. Эксалирует там, где не надо и не эскалирует там, где надо. Модель то умная, не вопрос, но определённые особенности поведения есть.