Перейти к содержимому

Замеры — доказать подъём слабой модели

Тезис Chimera состоит в том, что структура позволяет слабой и дешёвой модели бить выше своего веса. Честный способ это показать — контролируемый A/B на стандартном замере: закрепить подмножество задач и модель, сделать единственной переменной обвязку и сообщить разницу с доверительным интервалом, а не голое «стало лучше». (Независимые исследования показывают, что одна только обвязка качает ту же модель примерно на 7 пунктов, поэтому оценка без оговорок не говорит ничего о вашем вкладе.)

Эксперимент

Замер: Terminal-Bench 2.0 — задача в Docker, инструкция и проверочные тесты, оценка «прошло / не прошло» этими тестами, всё под управлением обвязки Harbor, не зависящей от конкретного агента.

  • Плечо A (база): одна бесплатная модель в нейтральном каркасе Harbor — «слабая модель в одиночку».
  • Плечо B (воздействие): та же модель, те же идентификаторы задач, под управлением Chimera.
  • Метрика: pass@1. Заголовочное число: Δ = доля(B) − доля(A) с 95% ДИ.
  • Защита от самообмана: закрепить подмножество идентификаторов задач (и опубликовать его), прогнать не меньше 3 зёрен, опубликовать все стенограммы и добавлять строку с передовой моделью только как ориентир потолка, но никогда как предмет сравнения.

Результат — и он оказался против нас

Эта страница завершала раздел, называя число, которое доказало бы тезис: «бесплатная модель одна = X%, бесплатная модель с Chimera = Y%, Y ≫ X». Эксперимент с тех пор проведён, и Y оказался ниже X. На предварительно зарегистрированной выборке N=40 с одной и той же моделью в обоих плечах (deepseek-chat-v3.1): 7,5% → 2,5%, парная Δ −5,0 п.п., 95% ДИ [−5,0%, +1,6%] — незначимо. Обвязка не подняла и без того компетентную модель; оба плеча лежат на полу, где правит дисперсия. Полный отчёт, включая предрегистрацию, написанную до прогона: bench/terminal_bench/RESULTS.md.

Фраза, обещавшая Y ≫ X, пережила прогон, который её опроверг, — на этой странице и в девяти переводах. Она фиксируется здесь, а не удаляется молча, потому что проект, единственный настоящий актив которого — честное измерение, не может позволить себе страницу, предсказывающую противоположность собственному результату.

Как это запустить

uv sync --extra bench            # installs terminal-bench (Harbor); also needs Docker
playwright install chromium      # only if a task needs the browser tool

Chimera подключается как агент воздействия через chimera/eval/terminal_bench.py (make_chimera_tb_agent(model) собирает BaseAgent для Harbor, который запускает chimera solve с флагами обвязки). Направьте Harbor на закреплённое подмножество и бесплатную модель для каждого плеча; точный вызов harbor run и --agent-import-path смотрите в документации Harbor.

SWE-bench Verified (второе табло) — проведено четыре раза

Terminal-Bench доказывает тезис на задачах командной строки; SWE-bench доказывает его на настоящих исправлениях ошибок с GitHub: получив репозиторий на базовом коммите и описание проблемы, агент должен выдать патч, при котором тесты FAIL_TO_PASS этого случая проходят, а PASS_TO_PASS остаются зелёными. «Verified» — это подмножество, проверенное людьми.

Результаты

Четыре заранее объявленных запуска на срезах django/django, deepseek-chat-v3.1, pass@1, оценка только официальным стендом swebench 4.1.0 в Docker. Полное описание: bench/swe_bench/RESULTS.md.

запуск срез база + Chimera парная Δ 95% ДИ
1 (max_steps=8) 19 36,8% (7/19) 36,8% (7/19) +0,0% [−8,5%, +8,5%] не значимо
2 (max_steps=30) те же 19 42,1% (8/19) 57,9% (11/19) +15,8% [−1,9%, +15,8%] не значимо
3 (репликация) 41 невиданный 34,1% (14/41) 43,9% (18/41) +9,8% [−3,5%, +16,7%] не значимо
объединённо (вторично) 60 36,7% (22/60) 48,3% (29/60) +11,7% [+0,8%, +16,4%] значимо
4 (атрибуция) 41 из запуска 3 34,1% только обвязка 39,0% +4,9% [−7,6%, +14,2%] не значимо

Первый запуск — ровный ноль, и он опубликован без изменений. Второй исправил две неисправности, которые были нашими (каркас работал без своего сильнейшего механизма, а восьми шагов с вызовами инструментов не хватает, чтобы сориентироваться в репозитории на 250 МБ), и дал 3 случая выиграно, 0 проиграно.

Те 3–0 на трёх информативных парах — ровно та форма, которую даёт удачная выборка, и предрегистрация давала этому один шанс из трёх оказаться лишь этим. Поэтому запуск 3 повторил всё на 41 случае, исходов которых мы никогда не видели, не меняя больше ничего: те же плечи, та же модель, тот же бюджет шагов, тот же тайм-аут. Эффект появился снова: +9,8%, внутри зарегистрированной полосы от +5 до +20, на срезе, оказавшемся труднее среза запуска 2 (база 34,1% против 42,1%). Затем запуск 4 разделил обвязку и diff-gate на тех же 41: по +4,9%, и механизм — это точность, которая растёт 50% → 59% → 67%, тогда как доля патчей не меняется.

⚠️ Ни одно из этих чисел не является оценкой по SWE-bench Verified. Срезы намеренно лёгкие и из одного репозитория, выбраны так, чтобы парному A/B было где что-то измерить; настоящая оценка Verified требует всех 500. Ни один отдельный запуск не значим. Объединённый n=60 значим — и он был предрегистрирован как вторичный именно потому, что смешивает виденное с невиденным, так что он подкрепляет эффект, а не измеряет его величину.

Два наших собственных предсказания были по ходу дела отозваны — так же заметно, как и высказаны: механизм, которым мы объяснили пустые патчи первого запуска (лекарством был бюджет шагов, а не diff-gate, на который мы грешили), и прочтение запуска 2, которому запуск 4 противоречил.

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

Переходник

Переходник (chimera.eval.swe_bench) честен относительно своей границы: чистые части — вызов chimera solve для каждого случая (плечо воздействия) и разбор официального отчёта об оценке — живут здесь и покрыты модульными тестами; набор данных и стенд оценки в Docker подключаются по желанию и не поставляются в комплекте, а вердикт «прошло / не прошло» приходит от собственных тестов SWE-bench, а не сообщается нами самими.

# 1. Curate a JSONL slice (one instance object per line): instance_id, repo, base_commit,
#    problem_statement, and (optionally) test_cmd. build_solve_command turns each into a
#    `chimera solve <issue> --verify <test_cmd> --repo-map --progress-ledger --replan --checklist`.
# 2. Run both arms through the official SWE-bench harness (model-only vs model+Chimera) on the
#    SAME instance ids, producing two evaluation reports.
# 3. Score the honest A/B:
chimera swe-bench-compare model_only_report.json chimera_report.json --instances mini.jsonl

Оба отчёта проецируются на общий список случаев (отсутствующий идентификатор считается нерешённым), поэтому два плеча всегда сравниваются на одинаковых случаях — а дальше применяется тот же вердикт по доверительному интервалу Ньюкомба.

Как посчитать A/B (замер не нужен)

Когда каждое плечо выдало «прошло / не прошло» по задачам, статистика считается одной командой — и для этого не нужно никаких дополнений, так что машинка честной отчётности доступна всегда:

chimera bench-compare baseline.json chimera.json --treatment-name chimera

Каждый файл — это список булевых значений в JSON (или {task_id: bool}) по одним и тем же идентификаторам задач. На выходе: доля прохождения каждого плеча с границами Уилсона, разница, её 95% ДИ по Ньюкомбу и вывод, значима ли разница (интервал не включает ноль). Если не значима, об этом говорится прямо — нужно либо большее подмножество и больше зёрен, либо возможность признать, что нововведение действительно не двигает число.

Тот же bench-compare служит мерилом для каждой последующей возможности: любое добавление в M14 обязано показать, что двигает Δ на том же подмножестве, иначе его вырезают.

Честная ловушка (чего избегать)

  • Загрязнение — у публичного SWE-bench задокументированы утечки решений; предпочитайте наборы, устойчивые к загрязнению, и сообщайте эту оговорку.
  • Смешение с обвязкой — никогда не сообщайте голое «мы набрали X%»; вклад Chimera выделяет только разница в A/B.
  • Неверная база и отбор удобного — сравнивайте «слабая модель + Chimera» с той же слабой моделью в одиночку на одинаковых идентификаторах задач, с зёрнами и полными журналами. Передовая модель — это потолок, а не соперник.

Изменить эту страницу на GitHub