Перейти к содержанию

Кодинг-агенты

GLM 5.3 подписал коммит именем Claude Fable 5

10 мин чтения

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Всё о теме: Агенты для программирования →
Изображение: future-seems-so-good.com

GLM 5.3 подписала коммит строкой Co-Authored-By: Claude Fable 5, хотя работала в обвязке, где про Claude ничего не сказано. Об этом случае автор блога Future-seems-so-good рассказал в посте от 25 сентября. В его системном промпте нет ни слова ни о Claude, ни о правилах оформления коммитов, а логи показали, что коммит делала именно GLM. Такую строку добавляет к каждому коммиту Claude Code: он просит модель вписать туда своё имя.

На этом случае и на семи месяцах чужих перепроверок автор строит тезис. Какой формат правки кода лучше подходит модели, в основном решает пост-обучение, а точнее обвязка (harness: код вокруг модели, который выдаёт ей инструменты, разбирает её вызовы и применяет правки), внутри которой лаборатория проводила RL. У лабораторий, считает автор, есть все причины так это и оставить. Он спорит с февральским постом Stencil от 12 февраля, где авторы заменили инструмент правки на hashline и подняли проходной балл у 16 моделей. Hashline устроен так: каждая строка, которую читает модель, возвращается с коротким хешем содержимого, и правка ссылается на этот хеш, а не повторяет старый текст. Пост Stencil заканчивался фразой «Модель - это ров. Обвязка - это мост». По мнению автора, она наполовину неверна, потому что мост сам входит в ров.

Вызов инструмента как текст

Модель получает переписку, системный промпт и список описаний инструментов, а сервер склеивает всё это в один длинный промпт со служебными маркерами. В какой-то момент модель выдаёт фрагмент, который API читает как вызов инструмента с аргументами. Выдаёт она его потому, что её обучали и награждали именно на таком формате. Сериализацию Anthropic не публикует, но утёкшие маркеры похожи на псевдо-XML: <function_calls> и <invoke>, строковые параметры верхнего уровня вписаны прямо в теги, а массивы объектов лежат внутри тегов в виде JSON.

Открытые модели OpenAI используют формат harmony, где вызов сам объявляет тип содержимого. Маркер <|constrain|>json подсказывает инференс-стеку, с какого места включить сэмплирование с ограничением по JSON. Модели GPT, работающие через API OpenAI, идут дальше и принимают для своих инструментов грамматику Lark. Благодаря ей свободный формат вроде apply_patch проверяется прямо во время генерации.

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

Сколько на самом деле дал hashline

Stencil сравнивала три формата: apply_patch в стиле OpenAI, str_replace в стиле Claude и hashline. Каждую модель прогоняли трижды на 180 задачах, каждый раз в новой сессии. Заголовочные +15 пунктов в среднем по 16 моделям получены в сравнении hashline с patch, а patch надёжно пишут только модели, которых на нём обучали. В прогоне Stencil Grok 4 провалил 50,7% своих патчей, GLM-4.7 провалила 46,2%. Отсюда и скачок Grok Code Fast 1 с 6,7% до 68,3%.

В той же таблице есть колонка, где hashline сравнивают с str_replace, и там прирост в среднем всего около +3,4 пункта, медиана около +3,5. Разброс от +11,3 у Claude Haiku 4.5 и Gemini 3 Flash до -8,3 у DeepSeek V3.2. GPT-5.2 Codex теряет 0,4 пункта и тратит на 26% больше выходных токенов.

Независимые перепроверки разошлись. Trueline сократил выходные токены Claude Code на 44%, просто перестав повторять old_string, а oh-my-opencode сделал hashline форматом по умолчанию. Июньский бенчмарк трёх инструментов на пяти моделях пришёл к выводу, что hashline «почти никогда не оказывается самым дешёвым инструментом правки». Его авторы советуют по умолчанию replace, а patch только для моделей, обученных на нём. Ещё один тестировщик назвал hashline «катастрофой для большинства моделей». Повторные прогоны не нашли явного выигрыша на топовых моделях, никакого на GPT-5.4 и больше ошибок на DeepSeek, GPT-5.5 и Kimi. Исследования тоже не находят универсального формата. В работе Output Format × Model Identity на 4 013 задачах Doubao 2.0 Pro набрала 94% с JSON Patch, DeepSeek V4 лучше всего справилась с unified diff (66%), а Qwen 3.7 Max предпочла выдавать файл целиком.

Автор обращает внимание на две детали этих перепроверок. В одной ветке с настройкой hashline результат поднялся после того, как метки 5:af заменили на 5#ZY: маленькие модели путаются, когда цифры стоят по обе стороны от разделителя. Другой разработчик обнаружил, что отдельный инструмент hashline_edit рядом с edit давал моделям уровня Haiku 0% успеха, а та же логика за единственным инструментом edit дала 95%. Идея не менялась, менялась только поверхность. Такая чувствительность, по словам автора, типична для формата вне обучающего распределения, когда модель разбирается с ним по ходу контекста. Сам он оговаривается, что большинство цифр по форматам дал один бенчмарк, прогнанный создателями hashline.

Где модель училась

Прямо о RL внутри Claude Code лаборатории не пишут, но подходят к этому близко. OpenAI представляла GPT-5-Codex как версию GPT-5, дополнительно оптимизированную для агентного программирования в Codex, и рекомендовала использовать её «только для задач агентного программирования в Codex или похожих на Codex средах». В статье Anthropic о взломе награды при RL модель обучают исключительно на реальных боевых средах программирования, которые использовались при обучении Claude Sonnet 3.7, а саботаж затем измеряют в немодифицированном Claude Code.

На лидерборде CORE-Bench Hard проекта HAL Claude Opus 4.5 набирает 33,33% в универсальном агенте HAL и 42,22% в CORE-Agent. Николас Карлини прислал обвязку, которая запускает модель через Claude Code, и получил 77,78%, а после ручного исправления нескольких ошибок проверки 95,5%. HAL объявил бенчмарк решённым. Строкой ниже старая Opus 4.1 в Claude Code набирает меньше (42,22%), чем в CORE-Agent (51,11%). Прибавка от обвязки достаётся поколению, которое обучали вместе с ней.

Cursor пришлось подражать обучающей обвязке Codex. Как объясняет компания, во время обучения модель Codex получает ограниченный набор инструментов и учится искать, читать файлы и править их через shell. Поэтому Cursor переименовал свои инструменты по образцу shell-аналогов вроде rg. Удаление цепочек рассуждений между вызовами инструментов уронило GPT-5-Codex на Cursor Bench на 30%, тогда как обычный GPT-5 на SWE-bench в тестах OpenAI потерял 3%.

Армин Ронахер в посте Better Models: Worse Tools от 4 июля описал обратную сторону. Opus 4.8 и Sonnet 5 вызывали инструмент правки в Pi с выдуманными ключами внутри вложенного массива edits[]: requireUnique, matchCase, oldText2, in_file. При этом сами oldText и newText были верны до байта, а мусор появлялся сразу после того, как модель закрывала длинную экранированную строку. В одной воспроизведённой сессии Opus 4.8 ошибалась примерно в 20% случаев. Удаление блоков рассуждений вдвое снижало долю ошибок, строгий режим вызова инструментов убирал их совсем. Старые модели так себя не вели, Opus 4.5 к чужим инструментам правки приспосабливалась хорошо. У моделей Codex в тестах Ронахера такой регрессии не нашлось.

Объяснение Ронахер видит в клиенте Claude Code, который многое прощает. Он повторяет запрос, если разметка <invoke просочилась в видимый текст, чинит битые экранирования \uXXXX, принимает old_str вместо old_string и path вместо file_path, молча отбрасывает неизвестные ключи и не включает строгий режим. Если RL идёт в этой обвязке или её копии, слегка кривой вызов всё равно доводит задачу до конца и получает награду, и обучению почти не за что штрафовать выдуманное поле. Зато у модели складывается сильная привычка к плоской форме file_path / old_string / new_string / replace_all, и чем лучше модель обучена, тем упорнее она сопротивляется чужой схеме.

Обратный опыт тоже есть. Qwen3-Coder дали настоящий отладчик: без RL базовая модель решила 67% из 27 отложенных задач с багами. После RL в этой обвязке доля решённых выросла до 89%, а медианное число ходов упало с 46 до 19. Автор приводит и возражение из обсуждения: публичных свидетельств того, что Anthropic оптимизирует модели именно под Claude Code, нет, а Claude активно используют через Copilot, Cursor, Amp и Factory. По мнению автора, одно не исключает другого: лаборатория может тестировать модель широко и всё равно проводить большую часть агентного RL в одной обвязке.

Подпись Claude Code в чужих весах

GLM назвала в подписи не абстрактного Claude, а Fable 5, текущую флагманскую модель Anthropic, так что привычка пришла из свежих данных. Автор видит два возможных источника: дистилляцию траекторий Claude Code или предобучение на GitHub, где теперь много коммитов с такой подписью. По одному коммиту их не различить. Но в обоих случаях соглашение из обвязки Anthropic оказалось в весах другой лаборатории и срабатывает там, где его никто не просил. Похожих случаев хватает. GLM 4.5 Air через несколько недель после релиза называла себя Claude, K3 в 7 из 48 сэмплов называла себя Claude и при префилле воспроизводила claude-opus-4-5-20251101, а это идентификатор из логов API, а не из чатов. Локальной сборке Qwen понадобился плагин, потому что модель писала old_str вместо oldText, а old_str - это имя параметра из текстового редактора Anthropic. Путаница идёт и в обратную сторону: если правильно спросить Sonnet 4.6 по-китайски, он называет себя ChatGPT или DeepSeek-V3.

Разница, по словам автора, в масштабе и намерении. 23 февраля Anthropic сообщила, что DeepSeek, Moonshot и MiniMax провели больше 16 миллионов обменов с Claude примерно через 24 000 мошеннических аккаунтов. MiniMax сделала больше 13 миллионов из них, нацелившись на агентное программирование и оркестрацию инструментов, Moonshot 3,4 миллиона по агентным рассуждениям, использованию инструментов и компьютера. Сентябрьский отчёт Anthropic в изложении TechCrunch насчитал уже почти 200 миллионов обменов в пяти кампаниях. Крупнейшую из них, на 151 миллион обменов с мая по июль, приписали Alibaba. Если обвязка сидит в весах, то миллионы траекторий Claude, по формулировке автора, дают покупателю подержанную копию обучающей обвязки Claude Code. Защита, судя по всему, переехала туда же: в утёкшем в марте коде клиента Claude Code нашли, что он иногда отправляет anti_distillation: ['fake_tools'], а что делает с этим сервер, снаружи не видно.

Что давать каждой модели

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

  • Claude: плоский Edit с file_path, old_string, new_string, replace_all, псевдонимы old_str, new_str, path и молчаливое отбрасывание неизвестных ключей. Вложенных edits[] лучше избегать, а если без пакетной правки не обойтись, включить "strict": true с additionalProperties: false. Строгий режим ограничивает сложность описаний инструментов, так что инструментов придётся сделать меньше и попроще. Opus лучше давать одну правку за вызов. Якоря по строкам стоят того, когда дороги выходные токены: hashline добавил 3,3 пункта Sonnet 4.5 и 11,3 пункта Haiku 4.5 против replace.
  • GPT-5-Codex и GPT-5.x: apply_patch в формате V4A как свободный инструмент с грамматикой Lark, короткий список инструментов с shell-подобными именами, элементы рассуждений через Responses API пересылать без изменений. Hashline на больших моделях Codex не нужен, исключение GPT-5.1 Codex Mini: с ним 60,0% выросли до 77,5%.
  • gpt-oss: грамматику строить по тому, что модель реально выдаёт (сначала канал, потом адресат), а не по шаблону рендеринга. PR в vLLM, подгонявший строгую грамматику под отрендеренную форму, уронил бы точность в многоходовых сценариях BFCL примерно с 55% до 0%.
  • Gemini: маленькие файлы пусть переписывает целиком. На бенчмарке Aider gemini-exp-1206 набрала 80,5% при 100% соблюдении формата против 69,2% и 84,2% с диффами. Имена и ключи аргументов стоит проверять: после Gemini 3.1 модель возвращала не те JSON-ключи, которых ждут обвязки под Claude и Codex.
  • DeepSeek: диффы или search/replace, без hashline. DeepSeek V4-Pro иногда пишет вызов обычным текстом с finish_reason: "stop", в одном отчёте в 2 из 19 ответов, так что нужен запасной разбор вызовов из текста.
  • Qwen: str_replace с old_str/new_str и псевдонимами, маленькие файлы целиком, без hashline.
  • GLM, Kimi, MiniMax: никакого patch, якоря дают +8,3 пункта GLM-4.7, +10 MiniMax M2.1 и +5 Kimi K2.5 при сокращении выходных токенов на 26-42%. По предположению автора, которое он прямо помечает как не измеренное, им подойдут инструменты в форме Claude Code.
  • Grok: тоже никакого patch, только replace или якоря.

Аргументы автор советует нормализовать до проверки: сопоставлять псевдонимы, отбрасывать неизвестные ключи, приводить очевидные типы и чинить битые \uXXXX. Claude Code делает все четыре вещи. На неудачную правку обвязка должна возвращать точную причину и текущий текст вокруг цели, например old_string matched 3 times (lines 12, 48, 90); include more context, чтобы модели не пришлось заново перечитывать файл.

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.