From 3dfb8b5c9aceb35bde57e9b041fa471b8efbc47e Mon Sep 17 00:00:00 2001 From: heaven Date: Tue, 1 Sep 2026 22:47:57 +0300 Subject: [PATCH] Retract my own claim that the engine never sends the knob: ReasoningNone emits low, medium and high, and only off and empty send nothing --- docs/experiments/00-provider-quirks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/experiments/00-provider-quirks.md b/docs/experiments/00-provider-quirks.md index cbcd31f8..14369816 100644 --- a/docs/experiments/00-provider-quirks.md +++ b/docs/experiments/00-provider-quirks.md @@ -80,7 +80,7 @@ ⛔⛔ **ВАХТА D39.92 ПЕРЕ-СНЯТА 2026-08-30 (полигон; `curl`, HTTP 200, страница 108 336 байт, sha256 `f28c4324…`) — ТАБЛИЦА У ВЕНДОРА ИЗМЕНИЛАСЬ, И ЗАПИСЬ НИЖЕ БОЛЬШЕ НЕ ВЕРНА.** Вендор исполнил обещанное сноской обновление маппинга. Живая редакция, дословно: *«(2) The mapping between the effort set by the user and the model's actual reasoning effort is as follows (**identical for `deepseek-v4-flash` and `deepseek-v4-pro`**)»* — и таблица теперь ОДНА на обе модели: `low→low · medium→high · high→high · xhigh→high · max→max`. Плюс *«(1) Thinking mode is enabled by default, with the default effort being `high`»*, а тумблер `{"thinking":{"type":"enabled/disabled"}}` подан как общий для модели DeepSeek, без оговорки «только flash». ⇒ **(i) на `deepseek-v4-pro` ручка `low` ТЕПЕРЬ РАБОТАЕТ и даёт `low`; (ii) рычаг бюджета размышления существует У ОБЕИХ моделей; (iii) размышление у `pro` в принципе ВЫКЛЮЧАЕМО тумблером.** ⚠ Это ДОКА, а не поведенческая проба: по норме проекта («слаг ≠ модель, при аномалии — поведенческая проба, не листинг») клейм действителен как ВЕНДОРСКОЕ ЗАЯВЛЕНИЕ и требует живой пробы перед денежным решением (смета — единицы центов). ⚠ И цена рычага уже замерена с другой стороны: `effort:"low"` **пере-вооружает эхо-мину** (п.4 ниже), а «reasoning-off + плотный CJK-вход = зона эха». ⚠ ЕЩЁ ОДИН ЖИВОЙ ФАКТ С ТОЙ ЖЕ СТРАНИЦЫ, которого у нас не записано нигде: *«Thinking mode does not support the `temperature`, `top_p`, `presence_penalty`, or `frequency_penalty` parameters… setting these parameters will not trigger an error but will also have no effect»* ⇒ **наш `temperature: 0.3`, который ростер шлёт на `deepseek-v4-pro`, МОЛЧА ИГНОРИРУЕТСЯ** — параметр в проводе есть, эффекта нет. ~~⇒ (i) **не слать `reasoning_effort` = ехать на `high`** — вот почему боевая форма упирается в стену (п.10); (ii) на `deepseek-v4-pro` ручка `low` НЕ РАБОТАЕТ (маппится в `high`); рычаг бюджета размышления существует ТОЛЬКО у flash~~ — **редакция до 30.08, оставлена под зачёркиванием: на ней стоят все денежные выводы фазы Д и вся её арифметика размышления. Дефолт `high` при не-присланной ручке — В СИЛЕ и в новой редакции** — **строка В СИЛЕ**: её отзыв от 05.08 сам ОТОЗВАН адверсариальным ревью того же дня (см. 3б), замер §3б признан недиагностичным; (iii) `none` в OpenAI-формате у DeepSeek не существует вовсе (колонка `reasoning.effort:"none"` — Anthropic-формат), запись 04.07 «`none` → 400» в силе. - **3г. ⭐ ПОВЕДЕНЧЕСКАЯ ПРОБА 2026-08-30 (полигон, фаза Д, $0.038276): ПАРАМЕТР `low` НА `pro` ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ.** Дока 3а требовала живой пробы перед денежным решением — вот она. **Несущая улика — не размер размышления, а `prompt_tokens`:** при **побайтно одинаковых** `messages` (sha256 `51e7f427940cae15`, проверено исполнением) вызов без параметра дал **3270** входных токенов, вызов с `reasoning_effort:"low"` — **3191**, то есть **−79**. Тело вызова различалось РОВНО одним полем (`eval/dovodka/rol.py:668`=`def call_kwargs`), исходник главы приколот манифестом с гейтом остановки (`eval/role_topology/pair_en.py:132`=`def units`), шаблон промта не менялся с 20.08, кэш смещения не даёт (две клетки с `cached_tokens=0` дали остатки −31.8 и +10.4 при разбросе ±20–44). **ДВА контроля детерминизма.** (1) Замер 05.08 ниже: при побайтно одинаковых `messages` дефолт и `low` вернули ОДИНАКОВЫЕ 2124 — провайдер повторяет `prompt_tokens` в точности, когда параметр не действует; ⚠ но он снят ДО смены сервинга и на другом промте. (2) **Межэпохальный контроль — пред-полётные пробы того же рига:** один и тот же тривиальный запрос БЕЗ ручки дал `prompt_tokens` = **84 · 84 · 84 · 84**, причём четвёртая куплена 30.08 за две минуты до испытуемого вызова ⇒ **дефолтный счёт входа не сдвинулся ни на токен через смену вендорского сервинга**, и −79 принадлежит параметру, а не эпохе. ⚠ **Регулярность без объяснения:** 2203 − 2124 = **79** (05.08, `xhigh` над дефолтом) и 3270 − 3191 = **79** (30.08, дефолт над `low`) на совершенно разных промтах — похоже на серверную вставку фиксированного размера, но это догадка. ⇒ **Статус `low` на `pro` закрыт В ЧАСТИ «доходит ли»: ДОХОДИТ.** ⛔⛔ **НО ЭТО ПРО ПРОВОД ПОЛИГОННОГО РИГА, А НЕ ПРО ДВИЖОК, И РАЗНИЦА СТОИТ ЗАМЕРА.** Проверено исполнением 31.08: у `deepseek-v4-pro` в `backend/configs/models.yaml` блок `capabilities` несёт РОВНО `min_max_tokens` — **`reasoning`-capability отсутствует**, модель резолвится в `ReasoningNone`, и `reasoning: "off"` боевого `backend/configs/pipeline-c1.yaml` есть NO-OP (это и написано в самом конфиге, `pipeline-c1.yaml:69`=`ReasoningNone`). У `glm-5` capability есть (`control: extra_body_disable`), у `gemini-3.1-pro` — `mandatory`. ⇒ **ДВИЖОК РУЧКУ НЕ ШЛЁТ ВООБЩЕ**, какой бы ни была вендорская таблица: полигонный риг шлёт её своим проводом (`rol.py`), движок — нет. Практические следствия: (1) любая движковая проба оси «эффорт off против low» сегодня вернёт «разницы нет» — и это будет артефакт РЕЕСТРА МОДЕЛЕЙ, а не факт о модели; ⛔ (2) **ПОПРАВКА ТОГО ЖЕ ДНЯ, оркестратор №22, проверена мной исполнением — первая редакция этой строки предлагала ОПАСНОЕ лекарство.** Было: «нужна правка ДАННЫХ — описать capability по живой таблице». **Так делать нельзя: отсутствие capability у обеих `deepseek` — не дыра в данных, а НАМЕРЕННЫЙ ГЕЙТ, и он под тестом.** `backend/internal/config/echo_mine_test.go:218`=`never armed`; `TestDeepSeekEchoMineRejected` отвергает вооружение по ЧЕТЫРЁМ маршрутам сразу (`capabilities.reasoning.extra_body_disable` · ключ `thinking` в `extra_body` · вложенный `chat_template_kwargs.thinking` · `capabilities.reasoning.effort`). Гоняно мной 31.08: `go test ./internal/config/ -run 'Echo|Mine|Capab'` → **ok 0.008s**. ⇒ описать capability = СНЯТЬ ПОСТРОЕННУЮ ЗАЩИТУ и уронить батарею; сессия, взявшая ось «off против low» как она была заказана, упёрлась бы в красный тест ровно там, где канон запрещает подгонку под зелень. **Почему защита стоит:** `low` ПЕРЕ-ВООРУЖАЕТ эхо-мину (п.4 ниже: на `flash` один чистый китайский выход из 16), а **для `pro` эхо на `low` НЕ МЕРЕНО НИ РАЗУ**. ⇒ **Правильный порядок обратный:** сперва дешёвый ЭХО-КОНТРОЛЬ на `pro` (зона полигона), и только при приемлемом курсе — ратификация снятия гейта и правка данных ОДНИМ заказом; (3) вся денежная арифметика размышления фазы Д снята на риговом проводе и к движковым тратам переносится только после этой правки. ⚠ Класс ошибки, которого здесь чуть не случилось: **вендорский факт принят за свойство нашей системы** — между вендором и нами стоит реестр моделей, и он молчит. ⛔ **ВЕЛИЧИНА среза размышления ПО-ПРЕЖНЕМУ НЕ УСТАНОВЛЕНА:** наблюдённые ×2.52 (19 559 → 7 748 токенов) сняты БЛОКАМИ, разнесёнными на 9 дней. ⛔ **Несущий конфаунд здесь — НЕ дрейф, а сама смена сервинга, зафиксированная выше в 3а:** вендор переписал маппинг между двумя блоками, и сравнение «арм 21.08 против арма 30.08» приписывает ручке всё, что он поменял. Дрейф (строка в 3б) — второй и более слабый: у него есть ЗНАК (все шесть розыгрышей монотонно РАСТУТ), и при его продолжении ×2.52 было бы нижней границей среза. Чтобы величина стала известной, нужен интерливинг обоих армов в ОДНОМ блоке; пре-регистрация и цены — `docs/experiments/23-editor-tier.md` §Д46.3 и §Д47 (дорогая восьмёрка $0.565–0.620, дешёвая — $0.078–0.133). ⚠ **Эхо на `low` у `pro`: одна английская клетка дала кириллицу 1.000 и ноль латиницы — это НЕ снимает предупреждение «Не бесплатно» ниже**, эхо-мина живёт на плотном CJK, а проба была на английской паре. + **3г. ⭐ ПОВЕДЕНЧЕСКАЯ ПРОБА 2026-08-30 (полигон, фаза Д, $0.038276): ПАРАМЕТР `low` НА `pro` ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ.** Дока 3а требовала живой пробы перед денежным решением — вот она. **Несущая улика — не размер размышления, а `prompt_tokens`:** при **побайтно одинаковых** `messages` (sha256 `51e7f427940cae15`, проверено исполнением) вызов без параметра дал **3270** входных токенов, вызов с `reasoning_effort:"low"` — **3191**, то есть **−79**. Тело вызова различалось РОВНО одним полем (`eval/dovodka/rol.py:668`=`def call_kwargs`), исходник главы приколот манифестом с гейтом остановки (`eval/role_topology/pair_en.py:132`=`def units`), шаблон промта не менялся с 20.08, кэш смещения не даёт (две клетки с `cached_tokens=0` дали остатки −31.8 и +10.4 при разбросе ±20–44). **ДВА контроля детерминизма.** (1) Замер 05.08 ниже: при побайтно одинаковых `messages` дефолт и `low` вернули ОДИНАКОВЫЕ 2124 — провайдер повторяет `prompt_tokens` в точности, когда параметр не действует; ⚠ но он снят ДО смены сервинга и на другом промте. (2) **Межэпохальный контроль — пред-полётные пробы того же рига:** один и тот же тривиальный запрос БЕЗ ручки дал `prompt_tokens` = **84 · 84 · 84 · 84**, причём четвёртая куплена 30.08 за две минуты до испытуемого вызова ⇒ **дефолтный счёт входа не сдвинулся ни на токен через смену вендорского сервинга**, и −79 принадлежит параметру, а не эпохе. ⚠ **Регулярность без объяснения:** 2203 − 2124 = **79** (05.08, `xhigh` над дефолтом) и 3270 − 3191 = **79** (30.08, дефолт над `low`) на совершенно разных промтах — похоже на серверную вставку фиксированного размера, но это догадка. ⇒ **Статус `low` на `pro` закрыт В ЧАСТИ «доходит ли»: ДОХОДИТ.** ⛔⛔ **НО ЭТО ПРО ПРОВОД ПОЛИГОННОГО РИГА, А НЕ ПРО ДВИЖОК, И РАЗНИЦА СТОИТ ЗАМЕРА.** Проверено исполнением 31.08: у `deepseek-v4-pro` в `backend/configs/models.yaml` блок `capabilities` несёт РОВНО `min_max_tokens` — **`reasoning`-capability отсутствует**, модель резолвится в `ReasoningNone`, и `reasoning: "off"` боевого `backend/configs/pipeline-c1.yaml` есть NO-OP (это и написано в самом конфиге, `pipeline-c1.yaml:69`=`ReasoningNone`). У `glm-5` capability есть (`control: extra_body_disable`), у `gemini-3.1-pro` — `mandatory`. ⛔⛔ **ПОПРАВКА 01.09, ТРЕТЬЯ РЕДАКЦИЯ ЭТОЙ СТРОКИ — ПРЕДЫДУЩАЯ («ДВИЖОК РУЧКУ НЕ ШЛЁТ ВООБЩЕ») БЫЛА НЕВЕРНА, И Я ЕЁ СНИМАЮ.** Я прочитал ОТСУТСТВИЕ `capabilities.reasoning` как «ручка не шлётся», не прочитав, ЧТО делает `ReasoningNone`. Дословно, `backend/internal/llm/capability.go:51`=`low|medium|high go out as reasoning_effort`: **«ReasoningNone is the OpenAI-compat baseline: low|medium|high go out as reasoning_effort; off and "" emit nothing, leaving the provider's OWN default»**. И там же ниже: **«⚠ "Never turned off" is NOT "never configured" (D39.87): low|medium|high are a ratified way to size the thinking BUDGET on such a model»**. ⇒ **ДВИЖОК ШЛЁТ `low`/`medium`/`high` И ЭТО РАТИФИЦИРОВАННЫЙ СПОСОБ ЗАДАТЬ БЮДЖЕТ РАЗМЫШЛЕНИЯ.** Не шлёт он ровно два значения — `off` и пустое, и тогда едет вендор-дефолт `high`. **Именно `off` и стоит в боевом `pipeline-c1.yaml` у редактора** — поэтому редактор едет дефолтным `high`, но это ВЫБОР конфига, а не невозможность. ⇒ Ось «эффорт `off` против `low`» на движке ИЗМЕРИМА и требует правки ОДНОЙ строки конфига книги, без правки Go и без снятия защиты. Гейт `TestDeepSeekEchoMineRejected` запрещает ВЫКЛЮЧЕНИЕ размышления (`extra_body_disable`, `thinking` в `extra_body`, вложенный `chat_template_kwargs`, `effort`-capability) — `low` под запрет НЕ подпадает, потому что едет с размышлением ВКЛЮЧЁННЫМ. **Класс моей ошибки: отсутствие поля прочитано как отсутствие механизма, без чтения того, что делает дефолтная ветка.** Полигонный риг шлёт ручку своим проводом — это верно и остаётся, но движок ему в этом не уступает. Практические следствия: (1) любая движковая проба оси «эффорт off против low» сегодня вернёт «разницы нет» — и это будет артефакт РЕЕСТРА МОДЕЛЕЙ, а не факт о модели; ⛔ (2) **ПОПРАВКА ТОГО ЖЕ ДНЯ, оркестратор №22, проверена мной исполнением — первая редакция этой строки предлагала ОПАСНОЕ лекарство.** Было: «нужна правка ДАННЫХ — описать capability по живой таблице». **Так делать нельзя: отсутствие capability у обеих `deepseek` — не дыра в данных, а НАМЕРЕННЫЙ ГЕЙТ, и он под тестом.** `backend/internal/config/echo_mine_test.go:218`=`never armed`; `TestDeepSeekEchoMineRejected` отвергает вооружение по ЧЕТЫРЁМ маршрутам сразу (`capabilities.reasoning.extra_body_disable` · ключ `thinking` в `extra_body` · вложенный `chat_template_kwargs.thinking` · `capabilities.reasoning.effort`). Гоняно мной 31.08: `go test ./internal/config/ -run 'Echo|Mine|Capab'` → **ok 0.008s**. ⇒ описать capability = СНЯТЬ ПОСТРОЕННУЮ ЗАЩИТУ и уронить батарею; сессия, взявшая ось «off против low» как она была заказана, упёрлась бы в красный тест ровно там, где канон запрещает подгонку под зелень. **Почему защита стоит:** `low` ПЕРЕ-ВООРУЖАЕТ эхо-мину (п.4 ниже: на `flash` один чистый китайский выход из 16), а **для `pro` эхо на `low` НЕ МЕРЕНО НИ РАЗУ**. ⇒ **Правильный порядок обратный:** сперва дешёвый ЭХО-КОНТРОЛЬ на `pro` (зона полигона), и только при приемлемом курсе — ратификация снятия гейта и правка данных ОДНИМ заказом; (3) вся денежная арифметика размышления фазы Д снята на риговом проводе и к движковым тратам переносится только после этой правки. ⚠ Класс ошибки, которого здесь чуть не случилось: **вендорский факт принят за свойство нашей системы** — между вендором и нами стоит реестр моделей, и он молчит. ⛔ **ВЕЛИЧИНА среза размышления ПО-ПРЕЖНЕМУ НЕ УСТАНОВЛЕНА:** наблюдённые ×2.52 (19 559 → 7 748 токенов) сняты БЛОКАМИ, разнесёнными на 9 дней. ⛔ **Несущий конфаунд здесь — НЕ дрейф, а сама смена сервинга, зафиксированная выше в 3а:** вендор переписал маппинг между двумя блоками, и сравнение «арм 21.08 против арма 30.08» приписывает ручке всё, что он поменял. Дрейф (строка в 3б) — второй и более слабый: у него есть ЗНАК (все шесть розыгрышей монотонно РАСТУТ), и при его продолжении ×2.52 было бы нижней границей среза. Чтобы величина стала известной, нужен интерливинг обоих армов в ОДНОМ блоке; пре-регистрация и цены — `docs/experiments/23-editor-tier.md` §Д46.3 и §Д47 (дорогая восьмёрка $0.565–0.620, дешёвая — $0.078–0.133). ⚠ **Эхо на `low` у `pro`: одна английская клетка дала кириллицу 1.000 и ноль латиницы — это НЕ снимает предупреждение «Не бесплатно» ниже**, эхо-мина живёт на плотном CJK, а проба была на английской паре. **3д. ⚠ 30.08 ($0.134804, интерливинг Д47): ДВА ОДИНОЧНЫХ РОЗЫГРЫША ДЕФОЛТНОГО ПУТИ `deepseek-v4-pro` РАЗОШЛИСЬ В 38 РАЗ. ⛔ ПРИЧИНА НЕ УСТАНОВЛЕНА — «модель сдвинулась» и «выпал хвост» ОБЕ ЖИВЫ.** (Первая редакция этой записи подавала ×38 как замеренный сдвиг во времени; поправлено в тот же день — по лучшей имеющейся оценке разброса это ≈3.1 sd, редкое событие, но не невозможное. Оценка разброса: sd логарифма 0.82, то есть одно sd = ×2.3, снята по шести группам «тот же тег, разные розыгрыши», 18 вызовов, СУДЕЙСКАЯ роль — на переводе чистых повторов в корпусе нет. Разбор — `docs/experiments/23-editor-tier.md` §Д47.7.) Побайтно один промт (sha256 сверен), одна и та же глава, `reasoning_effort` НЕ слался ни разу: 21.08 модель думала **466** токенов, 30.08 — **17 757**. Цена той же клетки $0.005034 → $0.076893. **Для практики обе гипотезы дают одно и то же предупреждение: любая смета DeepSeek, снятая с ОДИНОЧНОГО прошлого вызова, может ошибиться на порядок, и денежные планы на неё ставить нельзя.** ⭐ **Следствие, которое дороже самой записи: сметы и сравнения моделей по размышлению нужно строить на ПОВТОРАХ.** Считано: при sd логарифма 0.82 парный дизайн ловит эффект ×2.5 за 13 пар, ×2.0 за 22, ×1.4 за 93 (80% мощности, α=0.05). Проверено на себе: пре-регистрация оценила восемь пар в $0.078–0.133, одна пара стоила $0.1348. ⭐ **Зато счёт ВХОДА через тот же разрыв стабилен до токена:** `prompt_tokens` = 3 256 и 21.08, и 30.08 при не-присланной ручке, а `low` сдвигает его ровно на −79 (3 177) — то есть провенанс параметра читается по входу даже там, где выход уехал ×38. ⚠ Наблюдённый ВНУТРИ ОДНОГО БЛОКА эффект ручки — ×1.40 (17 757 → 12 676), заметно меньше ×2.52, полученных сравнением через девять дней: конфаунд эффект РАЗДУВАЛ. n=1, знаковый тест p=1.0 ⇒ величина по-прежнему **НЕ УСТАНОВЛЕНА**; разбор — `docs/experiments/23-editor-tier.md` §Д47.6.