3,583 papers
arXiv:2602.07900 72 8 фев. 2026 г. FREE

Observation > Verification: почему LLM лучше показывают значения, чем проверяют правила

КЛЮЧЕВАЯ СУТЬ
Парадокс: GPT-5.2 почти не пишет тесты (0.6% задач), но решает 71.8% — как модели которые пишут тесты в 98% случаев. Анализ показал: тесты работают как инструмент наблюдения, не проверки. Модель в 3-5 раз чаще использует print() для вывода значений, чем assert() для проверки условий. Исследование даёт возможность экономить токены (в 1.5-2 раза) БЕЗ потери качества — просто перестань просить модель писать формальные проверки. Механика: модель предпочитает ВИДЕТЬ что происходит, а не формально проверять правильность — успешные и неуспешные попытки пишут тесты одинаково часто.
Адаптировать под запрос

TL;DR

Исследователи проанализировали как LLM-агенты используют тесты при решении задач по программированию. Неожиданная находка: GPT-5.2 почти не пишет тесты (только в 0.6% задач), но решает 71.8% задач — практически как топовые модели, которые пишут тесты в 80-98% случаев.

Главный инсайт: тесты работают как инструмент наблюдения, а не проверки. Когда модели пишут тесты, они в 3-5 раз чаще используют print() для вывода значений, чем assert для проверки условий. Модель предпочитает видеть что происходит, а не формально проверять правильность. При этом успешные и неуспешные попытки решения пишут тесты одинаково часто — внутри одной модели разницы почти нет.

Контролируемый эксперимент подтвердил: когда через промпт заставили модели писать больше или меньше тестов, результативность почти не изменилась. Написание тестов — это скорее стиль работы модели, чем фактор успеха. Зато изменился расход токенов: меньше тестов = в 1.5-2 раза дешевле.

📌

Схема исследования

Не метод, а НАХОДКА:

СРАВНИЛИ: 6 топовых моделей на 500 реальных GitHub issues
├─ GPT-5.2: 0.6% задач с тестами → 71.8% решено
├─ Claude Opus 4.5: 83% задач с тестами → 74.4% решено
├─ Minimax-M2: 98.6% задач с тестами → 61% решено
└─ Вывод: частота тестов НЕ коррелирует с успехом

ПРОАНАЛИЗИРОВАЛИ содержимое тестов:
├─ Print-выводы: 60-80% обратной связи
├─ Assert-проверки: 20-40% обратной связи
└─ Вывод: модели предпочитают НАБЛЮДАТЬ, не проверять

ЭКСПЕРИМЕНТ: изменили промпты
├─ "Пиши больше тестов" → результат почти не изменился, токены +40%
├─ "Не пиши тесты" → результат почти не изменился, токены -35%
└─ Вывод: тесты не влияют на решение, но влияют на расход
📌

Применимый принцип

Принцип "Observation over Verification":

Когда модель решает задачу, показать промежуточные значения эффективнее, чем проверять правильность. Формальные проверки (assert, правила, критерии) создают иллюзию контроля, но модель использует их редко. Вместо этого модель предпочитает видеть данные напрямую и корректировать логику на основе наблюдений.

Где применить:

1. Работа с кодом — попроси вывести, а не проверить:

Задача: ChatGPT написал функцию обработки данных, но она работает не так. Вместо проверки через assert, попроси показать промежуточные значения.

Промпт:

Функция parse_price() возвращает странные результаты. 

Не пиши assert-ы для проверки. 
Вместо этого: добавь print() после каждого шага обработки — 
покажи что получилось после .strip(), после .replace(), после int().

Запусти на примерах: "1 200 руб", "1200р.", "1200.00"

Результат: Модель добавит print-ы, покажет промежуточные значения на каждом шаге. Ты увидишь ГДЕ логика сломалась — после какого .replace() строка стала нечисловой. Это быстрее, чем писать assert-ы и ловить исключения.

2. Анализ данных — распечатай шаги, не проверяй формулы:

Промпт:

Посчитай конверсию воронки продаж по этапам:
- Лиды: 1000
- Звонки: 300
- Встречи: 120
- Сделки: 45

Покажи промежуточные расчёты на каждом шаге:
1. Какие числа берёшь
2. Какую формулу применяешь
3. Какой результат получился

НЕ проверяй корректность формулы — просто покажи ЧТО считаешь.

Результат: Модель распечатает: "300/1000 = 30% на этапе Звонки". Если формула неправильная — ты увидишь сразу. Если бы попросил "проверь правильность формулы" — модель написала бы общие правила, но не показала бы конкретные числа.

3. Отладка промпта — выведи рассуждения, не оцени качество:

Промпт:

Ты написал текст для email-рассылки. Вместо проверки по критериям 
(понятность, УТП, призыв к действию) — покажи свою логику:

1. Какую мысль хотел передать в каждом абзаце
2. Какое ключевое слово выбрал для SEO и почему
3. Какую эмоцию решил вызвать в призыве

Не оценивай "соответствует ли критериям" — просто распиши ЧТО и ЗАЧЕМ сделал.

Результат: Модель покажет логику изнутри. Ты увидишь что вместо "срочность" она выбрала "безопасность" в призыве — и поймёшь почему текст не работает. Формальная проверка по критериям дала бы "соответствует 4 из 5" без объяснения WHY.

🧠

Почему это работает

Слабость LLM: Модель не может "проверить" свою работу так же, как компилятор проверяет код. Assert-ы и правила — это инструкции для новой генерации текста, не для проверки предыдущей. Когда пишешь "проверь правильность формулы", модель генерирует текст о проверке, но не пересчитывает результат заново.

Сильная сторона LLM: Модель отлично следует структурированным инструкциям и выводит промежуточные данные. Когда пишешь "покажи что получилось после каждого шага", модель симулирует выполнение —генерирует текст с конкретными значениями, который ты можешь проверить глазами.

Как принцип использует это: Вместо абстрактной проверки ("всё ли правильно?") ты просишь конкретный вывод ("что в переменной X после строки 5?"). Модель генерирует наблюдаемые данные — числа, промежуточные результаты, логику рассуждений. Ты видишь проблему напрямую, без прослойки "формальной проверки".

Рычаги управления:

  • Глубина наблюдения — попроси print после каждой строки vs после каждого блока → детальнее vs обзорнее
  • Формат вывода — "покажи в виде таблицы" vs "построчно" → структурировать данные для анализа
  • Что выводить — "только значения переменных" vs "значения + твои рассуждения почему так" → данные vs контекст
  • Убрать проверки — вырежи все "assert", "if correct", "validate" → модель не тратит токены на имитацию проверки
📌

Ключевой инсайт для работы

Value-revealing > Assert-based:

Когда просишь модель решить задачу: - ❌ "Проверь правильность решения по критериям A, B, C" → модель сгенерирует текст о проверке - ✅ "Покажи промежуточные значения на шагах 1, 2, 3" → модель выведет конкретные данные

Когда просишь модель отладить код: - ❌ "Добавь assert-ы чтобы проверить корректность" → модель напишет проверки, которые могут упустить баг - ✅ "Добавь print() чтобы видеть что в переменных" → модель покажет данные, ты увидишь баг

Практический вывод: Формальные проверки (правила, assert-ы, критерии оценки) работают хуже чем кажется. Модель использует их редко и неточно. Вместо этого проси показать данные — промежуточные результаты, рассуждения, значения переменных. Observation beats verification.

⚠️

Ограничения

⚠️ Применимость: Принцип извлечён из исследования про код-агентов. Прямая применимость — для работы с кодом в ChatGPT/Claude. Для задач без кода (написание текстов, анализ) — требуется адаптация, эффект может быть слабее.

⚠️ Не про качество тестов: Исследование НЕ про то, как писать хорошие тесты. Оно про то, что модели естественным образом предпочитают print-ы assert-ам. Если тебе нужны формальные тесты для production-кода — этот принцип не отменяет их необходимость.

⚠️ Контекст исследования: Выводы основаны на задачах программирования (SWE-bench). Для других доменов (креатив, стратегия, анализ текстов) эффективность "observation over verification" не проверялась систематически.

🔍

Как исследовали

Команда взяла 500 реальных GitHub issues из SWE-bench Verified — баги и задачи из популярных Python-проектов. Запустили 6 топовых моделей (Claude Opus 4.5, GPT-5.2, Gemini 3 Pro и др.) в одинаковых условиях: минималистичный scaffold без встроенных модулей тестирования. Модель могла создавать тесты через bash-команды если захочет, но это никто не требовал.

Неожиданность: GPT-5.2 почти не писал тесты (3 из 500 задач), но решил 359 из 500 — второй результат среди всех моделей. Minimax-M2 писал тесты в 493 из 500 задач, но решил только 305. Это противоречило ожиданиям: если тесты важны, GPT-5.2 должен был провалиться.

Дальше исследователи вручную проанализировали содержимое тестов в успешных и неуспешных попытках. Обнаружили: модели пишут в 3-5 раз больше print() чем assert. Даже когда пишут assert-ы — это простые проверки вида assert x == 5, а не сложные условия. Это говорит о том, что тесты — скорее инструмент отладки (посмотреть значения), чем проверки корректности.

Контролируемый эксперимент: взяли 4 модели и изменили промпты. Одна группа: "Always write tests to validate". Вторая: "Avoid writing new test files". Запустили на тех же 500 задачах. Результаты почти не изменились (±2-3 процентных пункта), зато расход токенов изменился на 30-40%. Вывод: написание тестов влияет на стоимость, но не на результат.

Почему результаты получились такими: Модели обучены на кодовых корпусах, где распространён паттерн "написал код → написал тест". Они воспроизводят этот паттерн, даже если он не помогает решить конкретную задачу. GPT-5.2, видимо, не воспроизводит этот паттерн — и успешно решает задачи без тестов. Это показывает, что тестирование — усвоенный шаблон поведения, а не обязательный фактор успеха.

💡

Адаптации и экстраполяции

💡 Адаптация для работы с таблицами и формулами:

Принцип "observation > verification" работает для любых вычислений. Вместо проверки формулы — попроси вывести промежуточные расчёты.

Промпт:

Рассчитай юнит-экономику для онлайн-курса:
- Цена: 15000 руб
- Трафик: 10000 визитов/мес
- Конверсия в покупку: 2%
- CAC (стоимость привлечения): 3000 руб
- Churn (отток): 30%/мес
- Маржинальность: 70%

Выведи пошагово:
Шаг 1: Покупателей в месяц = [формула] = [число]
Шаг 2: Выручка в месяц = [формула] = [число] руб
Шаг 3: Маржинальная прибыль = [формула] = [число] руб
...

НЕ проверяй корректность — просто покажи ЧТО считаешь на каждом шаге.

Ты увидишь если модель перепутала формулу (например, взяла всю выручку вместо маржинальности). Value-revealing вместо verification.


🔧 Техника: Логи рассуждений для отладки текста

Когда модель пишет текст и результат не устраивает — вместо критики по критериям попроси показать логику изнутри.

Промпт:

Ты написал описание товара для маркетплейса. 
Не оценивай текст по критериям (УТП, эмоция, призыв).

Вместо этого — распечатай свои рассуждения:
1. Какую главную боль клиента решил закрыть в первом предложении?
2. Какое конкретное слово выбрал для триггера срочности? Почему именно его?
3. Какую альтернативу рассматривал для призыва к действию? Почему отклонил?

Формат: "Шаг N: [решение] → потому что [рассуждение]"

Модель покажет внутреннюю логику. Ты увидишь что вместо "боль — дорого" она выбрала "боль — долго" — и поймёшь откуда несоответствие. Это observation, не verification.


💡 Экстраполяция: Multi-shot debugging с выводом

Комбинируй принцип "observation" с итеративной отладкой. Вместо одного запроса "реши задачу" → цепочка "покажи → исправь → покажи снова".

Промпт (цикл 1):

Напиши email для возврата клиента после отмены пробного периода.

После написания — выведи:
- Ключевая эмоция, которую хотел вызвать: [X]
- Главное возражение, на которое отвечаю: [Y]
- Призыв к действию: [Z]

Промпт (цикл 2):

Ты выбрал эмоцию "любопытство", но я хочу "FOMO". 
Перепиши текст под эту эмоцию.

После переписывания — снова выведи три пункта: эмоция, возражение, призыв.

Каждый цикл — observation+correction. Ты видишь ЧТО изменилось, не полагаешься на абстрактную "проверку качества".


🔗

Ресурсы

Rethinking the Value of Agent-Generated Tests for LLM-Based Software Engineering Agents Zhi Chen, Zhensu Sun, Yuling Shi, Chao Peng, Xiaodong Gu, David Lo, Lingxiao Jiang Singapore Management University, Shanghai Jiao Tong University, ByteDance


📋 Дайджест исследования

Ключевая суть

Парадокс: GPT-5.2 почти не пишет тесты (0.6% задач), но решает 71.8% — как модели которые пишут тесты в 98% случаев. Анализ показал: тесты работают как инструмент наблюдения, не проверки. Модель в 3-5 раз чаще использует print() для вывода значений, чем assert() для проверки условий. Исследование даёт возможность экономить токены (в 1.5-2 раза) БЕЗ потери качества — просто перестань просить модель писать формальные проверки. Механика: модель предпочитает ВИДЕТЬ что происходит, а не формально проверять правильность — успешные и неуспешные попытки пишут тесты одинаково часто.

Принцип работы

Не проси модель "проверить правильность" — проси "показать промежуточные значения". Формальные проверки (assert, критерии оценки, правила) создают иллюзию контроля, но модель использует их редко и неточно. Вместо этого модель предпочитает видеть данные напрямую (print-выводы, промежуточные результаты) и корректировать логику на основе наблюдений, не формальной проверки.

Почему работает

Модель не может "проверить" свою работу как компилятор — assert-ы и правила это инструкции для новой генерации текста, не для проверки предыдущей. Когда пишешь "проверь правильность формулы", модель генерирует текст о проверке, но не пересчитывает результат заново. Зато модель отлично следует инструкциям "покажи что в переменной X после строки 5" — выводит конкретные значения которые ты проверяешь глазами. Контролируемый эксперимент подтвердил: когда через промпт заставили писать больше/меньше тестов, результативность почти не изменилась (разница 1-2%), зато расход токенов изменился в 1.5-2 раза.

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

Работа с кодом → для отладки функций и проверки логики, особенно когда ChatGPT написал код который работает не так. Анализ данных → для проверки расчётов и формул (покажи промежуточные шаги вместо "проверь корректность"). Отладка промптов → для понимания логики модели ("распиши ЧТО и ЗАЧЕМ сделал" вместо "оцени по критериям"). НЕ подходит для production-тестов — там нужны формальные assert-ы для автоматизации CI/CD.

Мини-рецепт

1. Замени "проверь правильность" на "покажи значения": Вместо assert-ов попроси print() после каждого шага обработки
2. Конкретизируй ЧТО показать: "покажи что получилось после .strip(), после .replace(), после int()" — не общее "покажи промежуточные результаты"
3. Дай тестовые примеры: "Запусти на: '1 200 руб', '1200р.', '1200.00'" — модель выведет значения на каждом шаге для каждого примера

Примеры

[ПЛОХО] : Функция parse_price() работает неправильно. Добавь assert-ы чтобы проверить корректность обработки
[ХОРОШО] : Функция parse_price() возвращает странные результаты. Не пиши assert-ы. Вместо этого: добавь print() после каждого шага — покажи что получилось после .strip(), после .replace(), после int(). Запусти на примерах: "1 200 руб", "1200р.", "1200.00"
Источник: Rethinking the Value of Agent-Generated Tests for LLM-Based Software Engineering Agents
ArXiv ID: 2602.07900 | Сгенерировано: 2026-02-10 08:28

Концепты не выделены.

📖 Простыми словами

Rethinking the Value of Agent-Generated Tests forLLM-Based SoftwareEngineeringAgents

arXiv: 2602.07900

LLM-агенты в программировании работают не как инженеры, а как очень уверенные в себе писатели. Корень проблемы в том, что для нейронки написание кода и написание теста к нему — это просто два последовательных куска текста. У модели нет встроенного «компилятора» в голове, поэтому она не может проверить логику так, как это делает человек. Когда агент пишет assert, он не запускает проверку реальности, он просто генерирует следующий токен, который похож на правильный ответ. В итоге мы получаем иллюзию контроля: модель пишет тесты, которые подтверждают её же ошибки, потому что они растут из одного и того же неверного представления о задаче.

Это как если бы ты попросил студента проверить свою контрольную, а он просто переписал бы её ещё раз тем же почерком. Формально проверка была, но если в первый раз он решил, что дважды два — пять, то и в тесте он напишет, что пять — это правильный результат. Исследование показало, что генерация тестов — это карго-культ: агенты тратят кучу ресурсов на написание проверочного кода, который на самом деле ничего не проверяет, а просто поддакивает основному решению.

Цифры вскрывают этот абсурд: модель GPT-5.2 пишет тесты всего в 0.6% случаев, но при этом закрывает 71.8% задач. В то же время другие «топовые» агенты упахиваются, создавая тесты в 98% случаев, но выдают практически такой же результат. Получается, что 99% агентских тестов — это мусор, который никак не влияет на итоговое качество кода. Мы привыкли думать, что тесты — это страховка, но для LLM это просто лишняя трата токенов, которая создает видимость работы там, где её нет.

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

Короче: хватит молиться на то, что агент сам себя поправит, если просто добавить в промпт фразу "напиши тесты". Это не работает и только жрет бюджет. Если хочешь надежный софт от AI, заставляй его использовать внешние среды исполнения, а не полагайся на его внутреннюю логику. GPT-5.2 доказала: лучше не писать тесты вообще, чем плодить бесполезный код, который только маскирует косяки. Кто поймет это раньше, перестанет сливать деньги на бесконечные циклы «самоисправления», которые никуда не ведут.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с