Bollywood HungamaAnushka Sen named Indian global ambassador for Newport Beach Film Festival 2026PunchChina pulls out of Sri Lanka port logistics ventureInquirer5 fishermen nabbed for alleged blast fishing in Occidental MindoroThe Jerusalem PostMassive overnight Russian attack leaves over half a million Ukrainians without power, Zelensky saysInquirer EntertainmentFilipino model Christina Nadin walks Victoria’s Secret Fashion Show 2026 runwayUN NewsProtecting Earth’s fragile biodiversity takes spotlight at Armenia talksCBS NewsCartel members linked to murders of 10 workers from Canadian companyVarietyBrit Coming-of-Age Comedy ‘The State of Us’ Lands U.K. Theatrical Deal With Vertigo (EXCLUSIVE)GIGAZINEMetaが「ニュースサイトからの情報収集を可能とする利用規約」を削除ZDF heuteEntdecken Sie das ZDF-NachrichtenstudioThe Sydney Morning HeraldPatterson hits 16th first-class tonObservador DesportoReitoria da Fernando Pessoa recusa regulamento sem pré-aviso
The Daily Newsstand · Free, Always
Monday, October 19, 2026

«Ты сеньор» и «думай пошагово»: проверил шесть приёмов на 30 задачах по Python

Translate

В комментариях к прошлой статье (https://habr.com/ru/articles/1094642/) предложили добавить второй запрос: попросить модель перепроверить код и исправить ошибки. Я проверил один вариант такой просьбы вместе с пятью другими приёмами — ролью, «думай шаг за шагом», давлением, «сначала тесты» и «только код». Условия одинаковые: 30 задач по Python, скрытые тесты, три модели, по три прогона на каждую комбинацию; отдельно записаны токены и время. Про суеверия в промптинге на Хабре писали и раньше (https://habr.com/ru/articles/946816/), но без скрытых тестов, а мне хотелось именно их.

Что мерил

Тридцать задач, каждая — одна функция на Python 3.9 без сторонних библиотек, спецификация на английском. Двадцать задач из прошлой статьи и десять новых, заметно сложнее: например, разбор размеров вида «7 MiB», следующее срабатывание cron-выражения, проверка версии по диапазону semver. У каждой задачи скрытые тесты, всего 493 случая; решение запускается в изолированном подпроцессе с лимитом 30 секунд и засчитывается, только если прошли все.

Базовый промпт тот же, что в прошлый раз: спецификация, просьба ответить ровно одним блоком кода и в конце написать CONFIDENCE: SURE или CONFIDENCE: UNSURE. Шесть приёмов добавляют одну фразу перед задачей или один вопрос после ответа.

Тексты шести фраз дословно
  • Роль: You are a senior Python engineer with 15 years of experience, known for writing bug-free, production-grade code.

  • Шаг за шагом: Before writing any code, think step by step: list the requirements and the edge cases, then write the code.

  • Давление: This code goes straight to production today. If it has a bug, I will lose my job. Please be extremely careful.

  • Сначала тесты: Use test-driven development: first write unit tests that cover the requirements and the edge cases, then write the implementation that passes them. Put the tests in their own code block and the final implementation in a separate, final code block.

  • Только код: Reply with code only. Do not explain anything: no text before or after the code block, except the CONFIDENCE line required below.

  • Переспрос (второй ход диалога): Are you sure? Double-check your code against every requirement and edge case in the task. If you find any problem, reply with the corrected complete solution in one Python code block; if you find none, say so and do not repeat the code. Then write the CONFIDENCE line again.

Две оговорки. Переспрос — это одна формулировка, начинающаяся с «Are you sure?», а дальше просьба перепроверить по пунктам и прислать исправление; это один из возможных вариантов того, что предлагали в комментариях. «Сначала тесты» — тоже одна фраза: тесты и реализация генерируются в одном ответе, из него извлекается реализация и прогоняется через скрытые тесты; тесты модели не запускаются, итераций нет, полный цикл TDD не проверялся. В этой фразе к тому же есть противоречие с базовым промптом: она просит два блока кода, а базовый промпт — ровно один. Эксперимент шёл с этим текстом, задним числом я его не правил.

Модели: gpt-6.1-sol, claude-haiku-5-5, glm-5.3-flash. Все запросы шли через один сторонний OpenAI-совместимый API; названия — идентификаторы моделей из запросов, на официальных API вендоров я ничего не перепроверял.

План: 3 модели × 30 задач × 7 вариантов × 3 прогона = 1 890 экспериментальных единиц (у переспроса на единицу два запроса, повторы после обрывов считаются отдельно). Правило записал до запуска: p < 0,05 — «есть разница», иначе — «разницы не обнаружено». Статистическая единица — задача: три прогона одной задачи делят её сложность и её ловушки.

Полный ответ получен в 1 818 единицах из 1 890. Остальные 72, все у glm-5.3-flash, упёрлись в лимит вывода 32 000 токенов (finish_reason = length, без ошибок API); у 68 из них извлекаемый текст пуст. В знаменатель они не входят.

Как считалась значимость, как менялся бюджет и как выбирались записи при повторах

Сравнения делались на общем подмножестве: пары «задача × прогон», где все семь вариантов дали полный ответ. У gpt и Haiku это все 90 пар (30 задач), у GLM — 69 пар, которые покрывают 25 задач. Для каждой задачи считалась средняя по прогонам разница «вариант минус база» (прошёл или нет), затем среднее по задачам с равным весом; значимость — перестановочный тест со случайной сменой знака по задачам (20 000 перестановок, двусторонний), интервал — бутстрэп по задачам того же среднего (10 000 выборок). Отдельно для каждой пары считался точный тест Макнемара.

Первый прогон шёл с лимитом вывода 16 000 токенов и таймаутом 360 секунд; 172 ответа GLM в него не уложились. Обрезанные единицы перегонялись с лимитом 32 000, часть — ещё раз с таймаутом 900 секунд, потому что в промежуточном прогоне были таймауты и обрывы соединения. По ходу нашлась неоднозначность в спецификации задачи про INI (нужна ли пустая секция, если до первого заголовка нет ключей); я дописал одну фразу и перегнал эту задачу для всех моделей и вариантов, 63 единицы. Если у единицы несколько записей, берётся первая полная запись в порядке журнала, а если полной нет — последняя; правило не смотрит на результат тестов. Оно повлияло ровно на одну единицу.

Результат

Для gpt и Haiku все 90 единиц каждого варианта полные. Для GLM две колонки: доля на общем подмножестве из 69 пар и число полных и прошедших ответов от всех 90 единиц, где обрыв считается провалом.

Вариант

gpt-6.1-sol

claude-haiku-5-5

glm-5.3-flash, общее подмножество (69)

glm-5.3-flash, прошло из 90

База

90/90

86/90

67/69

79/90

Роль

87/90

89/90

68/69

78/90

Шаг за шагом

90/90

85/90

68/69

78/90

Давление

86/90

88/90

67/69

74/90

Сначала тесты

89/90

87/90

68/69

68/90

Только код

87/90

88/90

66/69

85/90

«Ты уверен?»

90/90

88/90

69/69

84/90

Ни одно из 18 сравнений «вариант против базы» не дотянуло до p < 0,05 на тесте по задачам: у gpt минимальное p ≈ 0,25 (давление, роль, «только код»), у Haiku ≈ 0,5, у GLM на общем подмножестве все p = 1. Бутстрэп-интервалы разницы долей везде включают ноль, некоторые в него упираются. У gpt база 90 из 90, поэтому любое отличие могло быть только в минус: давление дало 86, интервал от −10 до 0 пунктов. Это «не обнаружено», и до «доказано, что безвредно» отсюда далеко. У Haiku от 85 до 89 успешных попыток из 90 при 86 в базе — эффект формулировки от случайного разброса не отделить. У GLM на общем подмножестве от 66 до 69 из 69; если же считать обрывы провалами, разница между вариантами определяется тем, сколько ответов модель успела дописать.

Ошибки, которые повторялись

Доли мало что говорят, зато журнал провалов — много. Некоторые ошибки повторялись при разных формулировках промпта:

  • Haiku и parse_duration("1h30m"). Спецификация разрешает писать единицы слитно, но модель регулярно пишет парсер, который требует разделитель, и бросает ValueError: invalid duration part: '1h30m'. По одному разу в пяти вариантах из семи — база, только код, давление, шаг за шагом, сначала тесты — с одинаковым до буквы текстом исключения.

  • parse_size("0"). В спецификации написано: нет единицы — считать байтами. Haiku пять раз, GLM один раз и gpt один раз отвергли такой ввод как «не указана единица»; четыре варианта, три модели.

  • GLM и normalize_path("../../a"): ведущие .. выбрасываются, возвращается 'a'. Шесть раз в четырёх вариантах; у Haiku под давлением та же ошибка один раз.

  • У gpt под давлением дважды потерялось пустое поле в конце CSV-строки: a,"b""c", должно давать три поля, вернулось два; на базе все три прогона верные. Два случая — иллюстрация, вывод о вреде давления из них не следует.

Ещё дважды код Haiku не загрузился, оба раза SyntaxError: обычная синтаксическая ошибка и незавершённая последовательность \x в строковом литерале; самооценка в обоих случаях SURE. Один провал gpt случился по времени: в варианте «только код» решение задачи про cron перебирает минуты на пять лет вперёд и в 30 секунд не укладывается; с лимитами 120 и 180 секунд тоже нет. Засчитано как провал, правильность самого перебора я не проверял.

Переспрос: пять провалов, три исправления

Из 264 полных единиц с переспросом в первом ходе не прошли тесты только пять решений: три у Haiku, два у GLM, ноль у gpt. После переспроса три из пяти прошли (одно у Haiku, два у GLM); случаев, когда верное решение становилось неверным, не было. В этой выборке исправились 3 из 5, но пяти случаев недостаточно, чтобы считать это надёжной оценкой для других задач.

В остальных 259 единицах: в 26 модель прислала изменённый код с тем же результатом тестов, в 233 написала, что проверила по пунктам и проблем нет. У gpt три ответа, верные и помеченные SURE в первом ходе, после переспроса получили UNSURE. Цена второго хода на общем подмножестве: токенов в 1,5–2,1 раза больше (два хода против одного), времени — в 1,9–2,7 раза.

Токены и время

Медиана выходных токенов по данным API на общем подмножестве (у переспроса — сумма двух ходов). Это число токенов по данным API; длину видимого текста и скрытые рассуждения я не разделял.

Вариант

gpt-6.1-sol (90)

claude-haiku-5-5 (90)

glm-5.3-flash (69)

База

294

2 105

2 734

Роль

286

2 873

4 676

Шаг за шагом

465

3 373

5 036

Давление

364

3 122

5 519

Сначала тесты

755

6 738

12 044

Только код

265

1 554

1 488

«Ты уверен?»

437

4 384

5 438

«Сначала тесты» — в 2,6 раза больше токенов у gpt, в 3,2 у Haiku, в 4,4 у GLM; время ответа у Haiku 147 секунд против 41, у GLM 175 против 42; по тестам значимой разницы не обнаружено. «Только код» сократило медиану на 10 % у gpt, 26 % у Haiku и 46 % у GLM; по тестам gpt 87 против 90, Haiku 88 против 86, GLM 66 против 67 — разницы не обнаружено, но по этим данным нельзя утверждать, что такая просьба не влияет на прохождение тестов. Роль, «шаг за шагом» и давление у GLM на том же подмножестве дали медиану в 1,7–2 раза выше базы. Время здесь — только для той попытки, что вошла в статистику, без повторов.

Недописанные ответы GLM

72 обрезанных ответа распределены неравномерно. По задачам 58 из них приходятся на четыре сложные: glob 18, semver 17, cron 12, INI 11; на все десять новых задач — 68. По вариантам: «сначала тесты» 21 из 90, давление 14, роль 11, «шаг за шагом» 11, база 7, переспрос 6, «только код» 2. Фразы вроде «ты сеньор» и «меня уволят» у этой модели сопровождались более длинными ответами и большим числом обрывов, «только код» — наоборот. Это наблюдение по одному прогону каждой единицы; восьмикратный запас по токенам относительно базовой медианы и 15 минут на запрос эти 72 ответа не спасли.

Про самооценку коротко, потому что это тема прошлой статьи: среди ответов с пометкой SURE тесты провалили 1,8 % у gpt (11 из 622), 2,2 % у GLM (12 из 558), 3,0 % у Haiku (19 из 627). UNSURE встретился всего 11 раз (gpt 8, Haiku 3), все 11 прошли тесты; на этом объёме о самооценке как сигнале судить нельзя.

Что из этого следует для меня

Проверено: на этих 30 задачах ни одна из шести фраз не дала обнаружимой разницы в доле прошедших тестов; «сначала тесты» и переспрос увеличили число токенов в разы, «только код» уменьшило; одни и те же ошибки всплывали под разными фразами. Поэтому дальше я буду вкладываться в граничные случаи в спецификации и в скрытые тесты; на формулировки надеяться не буду. «Только код» буду использовать там, где нужен только код, помня, что отсутствие обнаруженной разницы — не гарантия. Переспрос с приложенным конкретным примером провала — отдельная идея, которую я не проверял; это план на будущее, не вывод из данных.

Ограничения
  • Каждый приём проверен в одной формулировке; другая формулировка может дать другой результат.

  • Тридцать задач на одну функцию, один язык, по три повтора; статистическая единица — задача. Небольшие эффекты такой эксперимент от шума не отличит, порог я назвать не берусь.

  • У gpt база 100 %: эффект потолка, можно было заметить только ухудшение.

  • Задачи и скрытые тесты я готовил с помощью ИИ; задача и тест могут содержать одну и ту же ошибку. Одну неоднозначность (INI) нашёл и исправил по ходу, другие могли остаться.

  • Сторонний OpenAI-совместимый API; на официальных API не перепроверял.

  • У GLM 72 единицы без полного ответа; общее подмножество из 69 пар покрывает 25 задач из 30 и исключает часть самых трудных.

  • Числа токенов и времени — для попыток, вошедших в статистику, без повторов и ожидания.

Код, задачи, скрытые тесты, тексты промптов, сырые записи и правила отбора лежат в репозитории без ключей и личных данных: https://github.com/Zerbo-bit/prompt-tricks-hidden-tests — анализ перегоняется одной командой, python3 analyze.py results/main.

А вы какие фразы добавляете к промпту для кода — и проверяли ли хоть раз, меняют ли они результат или только длину ответа?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.