External-review Veha 2.5: accept with 7 confirmed findings, confirm deepseek-v4-pro price, add coverage-precision validation task for Polygon

This commit is contained in:
Claude (backend session) 2026-07-05 01:07:36 +03:00
parent ed4f4ff5a7
commit 3a5b966c16
3 changed files with 313 additions and 0 deletions

View file

@ -0,0 +1,64 @@
# Промт для сессии «Адаптивный/обучающийся слой памяти» (черновик от сессии валидации банка)
Скопируй в новую сессию Claude Code в `/home/ubuntu/projects/textmachine`. Эта сессия — **исследование, валидация и (опц.) локальное прототипирование**, НЕ продуктовая реализация: ни строки в `backend/`. Прототипы — только в `eval/` (индикативно, как `memory_hotpath.py`/`retrieval_bench.py`).
> _Статус: **черновик, подготовлен сессией «Валидация банка памяти» по запросу владельца**. Готов к запуску владельцем._
---
Проект **TextMachine** — AI-перевод крупной художественной прозы (ранобэ/вебновеллы, zh/ja/en→ru) мультиагентным пайплайном поверх LLM API. Уже спроектирован **детерминированный банк памяти** (SQLite один-файл-на-книгу, горячий путь = Aho-Corasick матч ключей глоссария, без модели; эмбеддинги bge-m3 — low-trust второй эшелон; 3-слойная защита pre-replace→soft-glossary→post-check). Валидация этого банка завершена (см. ниже).
**Твой предмет.** Владелец спрашивает: не будет ли **максимально эффективным гибрид** — отлаженное «старое» детерминированное решение банка **+ «новый» слой, обучающийся ПО ХОДУ перевода книги** (in-context / локальный адаптер / kNN-MT / online-retrieval / само-коррекция). Задача — **адверсариально проверить, стоит ли оно того, и как именно смёржить под наш жёсткий локально-стоимостный контур**, а не поверить в модность.
## Контекст (прочитай в этом порядке)
- `docs/research/13-memory-bank-validation.md` — вердикт валидации банка + §«Честные слабые места» (обязательно) + инвариант D5.2.
- `docs/architecture/06-memory-risk-registry.md` — реестр рисков банка (§Контракт горячего пути, гейты).
- `eval/memory_hotpath.py` — исполняемая спека горячего пути (что нельзя ломать).
- `eval/retrieval_bench.py` + `eval/data/retrieval_bench/` — эмпирика эмбеддингов (bge-m3 дефолт; **разделяющего cosine-порога НЕТ** — критично для «обучаемого» retrieval).
- `docs/experiments/06-local-extraction.md` + `eval/extract_bench.py` — локаль vs облако: спот сущностей решён везде, **рендер zh у локали 0.26** (Палладий-мусор).
- `docs/experiments/03-local-stand.md` — локаль = «спецслужба, не переводчик»; реальные tok/s на GTX 1070 (8b ~27, 30b-a3b ~13.5); thinking-грабли.
- `docs/experiments/00-provider-quirks.md` — как правильно звать провайдеров (deepseek thinking-ON+max_tokens 8000; управление thinking `extra_body={"thinking":{"type":...}}`).
- `docs/architecture/01-decisions.md` Р3/Р4/Р5 (банк, локальный стек, экономика).
## Жёсткий контур (это определяет ВЕСЬ ответ — не проектируй мимо него)
1. **Флагман-переводчик — только API, закрытый.** Нет доступа к логитам/декодеру, нельзя дообучить. → **kNN-MT на декодере флагмана, constrained decoding, frontier-LoRA — ЗАБЛОКИРОВАНЫ.** Не проектируй их для роли переводчика (перепроверь, что за 2026 это не изменилось у наших провайдеров).
2. **Локальный стенд:** GTX 1070 **8 ГБ VRAM** + **32 ГБ RAM**, WSL2. Локаль **можно** дообучать/LoRA и снимать логиты (llama.cpp/vLLM), НО локаль **не переводит на качестве** (exp03) и **рендерит zh мусором** (exp06) → её адаптированная роль — support (reranker/консистентность/спот/локальный kNN-датастор), **не финальный переводчик**.
3. **Деньги:** переводы дорого гонять НЕ хочется. **Локаль-first**; дешёвое API (deepseek-v4-flash ~$0.0005/чанк, gemini-2.5-flash) — можно; премиум-эскалацию в этом исследовании не жечь.
4. **VRAM — арбитр (буквальный «кто побеждает»):** в 8 ГБ уже претендуют bge-m3 (эмбеддинги ~2.4 ГБ) + возможный reranker + возможный адаптированный локальный модуль. Что резидентно, что по требованию, что вытесняет — часть ответа.
5. **Детерминированное ядро НЕПРИКОСНОВЕННО.** Обучающийся слой пускать **только** во второй эшелон / стиль / консистентность / `auto`-термины — **никогда** в точностно-критичный матч approved-имён (иначе вернём тихую-инъекцию, против которой всё строилось).
## Приоритетные вопросы
1. **Огибающая осуществимого.** При контуре выше — какие механизмы «учится-по-ходу-книги» реально запускаемы, а какие вычеркнуть явно (заблокированные). Что влезает в 8 ГБ рядом с bge-m3 и SQLite-банком.
2. **In-context / непараметрическая адаптация (бесплатный выигрыш).** Инъекция накопленных подтверждённых пар книги (src→approved-dst) и прошлых переведённых пассажей как **демонстраций** — бьёт ли статический глоссарий по стилю/консистентности редких терминов (WMT: demonstrations > terminology), и где ВРЕДИТ (раздувание контекста, дистрактор — Power of Noise, 2401.14887). Не требует обучения — только память+промпт. Замерь на zh/ja→ru.
3. **Локальная параметрическая адаптация (LoRA/continual) на стенде.** Можно ли дообучить малую локаль на «книге-до-сих-пор», и для КАКОЙ роли это окупается — reranker 2-го эшелона / консистентность-чекер / локальный kNN-датастор / рендерер-канона — но НЕ переводчик. Цена/латентность/VRAM на 1070, катастрофическое забывание.
4. **Локальный kNN-MT / retrieval-augmented ДЕКОДИНГ — там, где декодер НАШ (локаль).** kNN-MT нужен логит → на флагмане нельзя, на локали **можно** (llama.cpp/vLLM отдают логиты). Может ли локальный kNN-MT-черновик, адаптирующийся к TM-датастору книги, стать достаточным ЧЕРНОВИКОМ (имена чинит банк, реалии — kNN из TM книги), кормящим API-редактора? Это потенциально новый мердж — проверь.
5. **МЕРДЖ и арбитраж («кто побеждает»).** Когда детерминированный банк и обучающийся слой РАСХОДЯТСЯ (рендеринг термина, какие записи инъектить) — кто авторитет? Спроектируй арбитраж: approved+точный-матч — банк неоспорим; обучающийся слой лишь **обогащает** серые зоны (стиль, `auto`/ambiguous, 2-й эшелон, подсказки консистентности). Плюс архитектура сосуществования модуля с текущим SQLite-один-файл-на-книгу и буквальный VRAM-арбитраж.
6. **Адаптивный online-retrieval + само-корректирующая петля консистентности.** Online-обучение, какие записи реально помогают этой книге (adaptive-RAG, бандиты); петля «детект дрейфа → авто-предложение правки → выучивание предпочтённого рендеринга». Насколько без тяжёлого ML.
7. **Академическое и индустриальное заземление** (научный поиск, первоисточники, не вендор-маркетинг — как в валидации банка): kNN-MT (Khandelwal 2021) и продолжения; **adaptive MT — ModernMT / Lilt** (что переносимо на API-only LLM-стек); test-time / continual adaptation для MT; in-context TM; retrieval-augmented generation с online-обновлением. Заявленные метрики проверять независимо. Отдельно — свежее 20252026.
## Правило решения (БАР)
Любой предложенный мердж обязан: (а) оставить детерминированный горячий путь авторитетным; (б) влезть в VRAM/стоимостную огибающую (локаль-first); (в) **эмпирически бить eval-валидированный детерминированный базис на zh/ja→ru** по консистентности/fidelity/цене; (г) оправдать добавленную сложность. **Не может пройти (в) → рекомендуй НЕ мёржить** (честно, как валидация банка вышла «не морозить ставку без eval»).
## Творческий мандат
Не только обзор — **спроектируй 12 конкретные гибридные архитектуры под НАШ контур** (локаль+дешёвое-API, 8 ГБ VRAM, SQLite-банк, детерминированный костяк) и аргументируй, где каждая бьёт чистый детерминированный базис. Приветствуются нестандартные мерджи (напр., локальный kNN-MT-черновик из TM книги → API-редактор; или книга-LoRA только на reranker). Свобода предлагать, но каждый вариант — против БАРа выше.
## Выход
- `docs/research/14-adaptive-memory.md` — вердикт: стоит ли гибрид, огибающая осуществимого, предложенные архитектуры мерджа, где/когда бьёт базис, VRAM+стоимостный бюджет, арбитраж. Это единственный файл в `research/`, что тебе разрешено создать.
- Опц. индикативный прототип в `eval/` (локальный reranker / kNN-датастор / in-context-demo эксперимент) — как `memory_hotpath`/`retrieval_bench`.
- Краткие итоги — `docs/PROGRESS.md` секция `## Память` (12 строки на находку + ссылка); каждое расхождение — пингом оркестратору.
## Правила (и не повтори ошибки сессии-предшественника)
- Не редактируй `backend/` (только читай); прототипы — `eval/` (переиспользуй venv, bge-m3, PD-корпус `eval/data/samples` — не дублируй инфру).
- **Сверься с git HEAD перед выводами** — бэкенд быстро движется, доки начала сессии устаревают (предшественник на этом обжёгся: числил F1 открытым, а он был построен).
- **Верифицируй каждый ответ модели** (пустой/echo/config-error → ретрай+пометка, НЕ засчитывай как данные); квирки — через `eval/refusal_bench.call_provider`+`providers.json`.
- **Индикативно ≠ доказано:** малый N, LLM-судья — помечай честно; не репорть артефакты как находки.
- Тайминг: это **улучшение Фазы 2+**, целься в РЕАЛЬНЫЕ дыры базиса (дрейф консистентности, стиль, 2-й эшелон), не переизобретай базис; идеально — после in-house eval банка.
- Фиксируй версии/даты; проверяй заблокированность методов (логиты/дообуч у наших провайдеров) пробой, а не по памяти.
- Скоординируйся с полигоном по стенду (VRAM у 1070 общий — не выселяй чужие модели молча).

View file

@ -350,6 +350,24 @@ keep-alive (Ф12), инъекция глоссария (`selective`), пор
**Веха 2.5 сдана на внешнее ревью.** Открытые для владельца/оркестратора: боевой флип `gates.coverage.enabled` (после валидации precision), цена `deepseek-v4-pro` (в /models слаг есть, цены нет), формула `escalation.budget_usd`, F3-idempotency-key + `tmctl status` (D12 — отдельные задачи).
> **Внешнее ревью оркестратора Вехи 2.5 (05.07): ПРИНЯТО, 0 живых блокеров, 7 подтверждённых находок (1 отсеяна).** Независимый адверсариальный воркфлоу (12 агентов, каждая находка верифицирована трассой кода). Money-path и coverage-оракул я подтвердил чтением сам. Тема: снапшот-дисциплину, которую ты **верно** применил к новому `coverageGateVersion`, ревью нашло пропущенной в 3 соседних verdict/wire-определителях (слепок автора). Ни одна находка не горит на боевом конфиге — но закрыть до активации соответствующего пути.
> **Major (закрыть до того, как путь оживёт):**
> 1. **`classifierVersion` НЕ в снапшоте** (disposition.go + runner.go:288). `classify()` решает resolved-вердикт (ok↔flagged, ре-ран на legacy/in-flight-crash чекпоинтах), но без version-const — в отличие от `coverageGateVersion`, который ты добавил ровно за это. Правка порога (cjkEchoThreshold 0.15→0.20 / новый refusal-паттерн) → тот же snapID → тихий re-verdict (flagged→ok ре-гоняет пропущенную стадию = свежий расход; ok→flagged жжёт свежий escalation-хоп). Фикс: `const classifierVersion`, свернуть в snapshotID рядом с coverageGateVersion. Симметрично тому, что ты сделал.
> 2. **local backend-тег (`prov.Model`) НЕ в снапшоте И НЕ в request-hash** (runner.go:344-345). Тег, который localClient шлёт как wire-`model` (какая модель реально отвечает — самый влияющий local-оверрайд), отсутствует, а слабые собратья temp/maxtok свёрнуты. Латентно (дефолт = deepseek/glm), оживает при первом wiring local-стадии/эскалации (канал B D3, одна правка YAML). Своп local 8b→14b посреди книги → тот же snapID → resume отдаёт старую модель. Фикс: свернуть `prov.Model` (+ `EscalateProvider*`). Закрыть до wiring local.
> 3. **echo-мина — дени-лист из 3 ключей, не исчерпывающий** (models.go:278). Сырой extra_body проверяется только на top-level thinking/enable_thinking/reasoning_effort — **промахивается мимо ВЛОЖЕННЫХ форм** типа `chat_template_kwargs.thinking:false`, а это документированная форма отключения thinking у DeepSeek-V3.1+ (т.е. гейт промахивается мимо самой вероятной реальной формы). Докстринг «both surfaces covered» переоценивает. Фикс: алоу-лист / рекурсивный скан на echo-prone провайдере; минимум — смягчить докстринг до «3 known top-level keys».
> **Minor (дешёвые гарды + doc/parity):**
> 4. **Эскалация не role-guarded** (pipeline.go:217). Coverage-гейт ограничен translator, а эскалация срабатывает на ЛЮБОЙ стадии с escalate_to — редактор мог бы эскалироваться на чужую модель, тихо нарушая D12 «editor pinned». Латентно (editor без escalate_to, budget=0). Фикс: отвергать escalate_to на role!=translator в LoadPipeline (структурное принуждение D12).
> 5. **Coverage расходится с оракулом на парах без коридора** (coverage.go:177). Оракул применяет дефолт (0.5,3.0) для пар вне {zh,ja,en,ru}; Go пропускает len-проверку целиком → ko-ru len_ratio=0.4/sent_cov=1.0: Python флагает, Go пропускает. Мёртвый код на корпусе {zh,ja,en,ru}, но ломает claim «бит-в-бит оракул». Фикс: дефолтный коридор как оракул ИЛИ fail-fast, требуя коридор пары книги при enabled.
> 6. **Атрибуция эскалации теряется на flagged-resume** (runner.go:996). Escalated/EscalationModel восстанавливаются только в ok-ветке; «хоп тоже провалился→flagged» теряет факт на fast-path. Деньги верны, только in-memory телеметрия (читается пока лишь тестами). Фикс — при добавлении `tmctl status` (ему нужна колонка escalation в chunk_status).
> 7. **Докстринг врёт** (runner.go:180-181): «гейт на КАЖДОЙ стадии, ловит excision редактора» — а строка 193 гардит role==translator (корректный Ф2-deferral). Рантайм прав, поправь докстринг (ловушка для будущего ревьюера).
> **Отсеяна: 1** (false-positive).
>
> **Открытые пункты закрыты:**
> - **Цена `deepseek-v4-pro` ПОДТВЕРЖДЕНА** (офиц. страница, 05.07): **$0.435 in / $0.87 out, cache-hit input $0.003625** (v4-flash подтверждён $0.14/$0.28/$0.0028). Разблокирует wiring канала-A эскалации + `prices_checked`. ⚠ легаси-подстраница `/pricing-details-usd` не обновлена (показывает deepseek-chat/reasoner) — брать `/quick_start/pricing`.
> - **coverage-флип:** держи false; валидация precision на реальных чанках — задача полигону (ниже); порог N флагов — за владельцем.
> - **`escalation.budget_usd`:** механика (opt-in soft-cap, 0=выкл) верна; число — $-потолок под маржу владельца + пересчёт полигона (D11), не «≤2×»; 0=выкл — норм дев-дефолт.
> - **D12-хвосты, приоритет:** **память v2** (реестр `06` готов — главный блокер качества) → **`tmctl status`+manifest** (владелец просил прогресс, скоуп мал, `chunk_status` есть) → **F3** (консервативный settle — честный интерим). Порядок предложишь сам.
## Полигон
(секция параллельной сессии — записи добавлять сюда)
@ -392,6 +410,7 @@ keep-alive (Ф12), инъекция глоссария (`selective`), пор
- [—] **Банк памяти (задача 5 + шире)** — по решению владельца выносится в **отдельную сессию «Валидация банка памяти»** (главная точка отказа пайплайна; не бросаться в код без разбора опасных сценариев). Полигон подготовил черновик промта → `docs/MEMORY_RESEARCH_SESSION_PROMPT.md`; **оркестратору вычитать/финализировать**, затем владелец запускает. Замер эмбеддингов (bge-m3 vs Qwen3-Embedding vs LaBSE) — часть мандата той сессии.
- [ ] Довалидация токен-калибровки на 35 главах реальных вебновелл (файлы владельца).
- [ ] Задача 4 (пилот выбора ядра, Фаза 2.5): протокол BWS + панель LLM-судей.
- [ ] **Валидация precision coverage-гейта — гейтит боевой флип** (от оркестратора, D12 Q4). Бэкенд-мини-набор (выпиленные предложения) проверяет recall (≥90%); флип `gates.coverage.enabled:true` упирается в **false-positive rate** на легитимно диалого-плотных главах (сегментация наивная, quote-absorbing §3.7 в v1.1 — на диалогах `sent_cov` может ложно проседать). Прогони гейт (пороги эксп.02: zh-ru<2.2/ja-ru<1.4/en-ru<0.70, sent_cov<0.75) на реальных чанках zh/jaru, замерь долю ложных excision_suspect. Оракул = `eval/refusal_bench.py::classify_output` (тот же, что порт в Go держать в синхроне). Выход: доля ложных флагов по типам глав оркестратор/владелец ставит порог N допустимых флагов и решает флип.
- [x] ~~**Эксперимент 05 — memory-bet**~~**СНЯТ как низкосигнальный** (решение владельца). Прогон был, но его ось C0-vs-C1 («бредит ли модель без глоссария») предрешена, а C3/C2 лишь пере-подтвердили уже процитированную литературу (2510.00829) — тест не мог изменить ни одного решения. Артефакты (doc/скрипт/данные) удалены. Единственный actionable-вывод (post-check + disposition обязательны) уже зафиксирован в реестре `architecture/06` (A2/E1) независимо от этого прогона. **Урок для eval:** тест ставить только если его исход мог бы перевернуть решение И не установлен литературой. Ценность вместо этого — валидация самого МЕХАНИЗМА (см. ниже).
- [x] **Референс горячего пути банка памяти + self-tests**`eval/memory_hotpath.py` (11/11 PASS). Исполняемая спека механизма (не продукт): нормализация trad→simp/kana, точный матч ключей/алиасов с запретом одиночных (омографы 送灶/炎/修/气 НЕ инъектируются), спойлер-фильтр `since_ch/until_ch` (hard-reject), sticky для местоименных чанков, disposition confirmed/ambiguous/reject, post-check (ловит и утечку, и отравление). **Бэкенду:** порт в Go 1:1, тесты T1T10 → unit-тесты; `[PROD]`-замены: OpenCC, Aho-Corasick, pymorphy/`decl`.
@ -467,3 +486,21 @@ keep-alive (Ф12), инъекция глоссария (`selective`), пор
> **[ДОБАВЛЕНО после закрытия] Локалка × банк памяти — экстракция терминов, ВЕРИФИЦИРОВАННЫЙ бенчмарк (дыра G1)** → [experiments/06-local-extraction.md](experiments/06-local-extraction.md), `eval/extract_bench.py`. 13 моделей × 12 кейсов (zh/ja/en + эдж: катакана-запад, буддийские имена, алиасы), запросы через `refusal_bench.call_provider`+`providers.json` (квирки верны: deepseek thinking-ON+max_tokens 8000 — прошлый пустой был МОЯ ошибка бюджета, не свойство модели), **каждый ответ health-верифицирован** (пустой/echo не засчитан как recall 0). Итог: **(1) СПОТ сущностей решён у всех, локаль вкл.** (recall ~0.98 на всех языках, 0 галлюцинаций). **(2) РЕНДЕР dst — разрыв с ЯЗЫКОВЫМ градиентом у локали:** en 0.82 / ja 0.53 / **zh 0.26** (阿Q→«Ах-Чу», 赵太爷→«Тяо Тай-Я» — Палладий-мусор → **эмпирика для B6**); облако-топ zh 0.75/ja 0.98/en 1.0. **(3) бо́льшая локаль не помогает** (30b render 0.55≈8b, ×3 медленнее). **(4) deepseek thinking помогает рендеру** (0.85 vs 0.58 off; на экстракции thinking-off здоров — echo бьёт перевод, не JSON). Рендер-value: **gemini-2.5-flash** (0.92/1.4с). **Дизайн-следствие (уточняет Р4/G1):** спот=дешёвая 8b (все языки); рендер dst язык-зависим — zh обязательно облако/человек + таблица Палладия (B6), en локаль потянет. ruadapt ненадёжен (5/12 health).
> **[В ОЧЕРЕДИ, 05.07] Исследование «Адаптивный/обучающийся слой памяти»** — промт `docs/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md` (подготовлен сессией валидации по запросу владельца). Вопрос: стоит ли гибрид «детерминированный банк + слой, обучающийся по ходу книги», и как смёржить под контур (локаль-first, дешёвое API ок, флагман без логитов → kNN-MT/frontier-LoRA заблокированы; обучаемое — только на локали, роль support, не переводчик). Центр — арбитраж «кто побеждает» (логика + VRAM 8ГБ). БАР: обязан бить eval-валидированный детерминированный базис на zh/ja→ru, иначе не мёржить. Тайминг: Фаза 2+, целить в реальные дыры (после in-house eval банка). Запускает владелец отдельной сессией.
### 2026-07-05 — Сессия «Адаптивный слой памяти» ЗАВЕРШЕНА → [research/14-adaptive-memory.md](research/14-adaptive-memory.md)
Метод: 6-направленный ресёрч + 24 адверсариальных верификатора (**19 CONFIRMED / 5 OVERCLAIM** с поправкой) + **2 исполняемые пробы на стенде/ключах** + чтение кода на git HEAD. **Вердикт: гибрид в основном НЕ стоит того; ровно ОДИН eval-гейтед кандидат.**
- **Жёсткий контур подтверждён живой пробой** (`eval/adaptive_probe.py`, 2026-07-05): kNN-MT/constrained/frontier-LoRA на флагмане **физически blocked** — kNN-MT ключует hidden state декодера (Khandelwal 2010.00710), а его никто не отдаёт; из наших только **deepseek возвращает logprobs** (top-5), **grok-4.3/gemini-3.1/gpt-5 — нет** (gpt-5 даёт 403). Даже logprobs ≠ hidden state → двойная дверь.
- **In-context демонстрации — единственный кандидат под контур, но НЕ бьёт базис по консистентности** (`eval/adaptive_incontext.py`, реальный zh→ru 阿Q, канон Рогова, N=3): без памяти 0.458 → **soft-глоссарий Р3 0.875** → глоссарий+демонстрации **0.833** (в шуме). Литература: 65% выигрыша демо — стиль (Li 2503.05010), а БАР меряет консистентность/fidelity. → **пилотировать под eval со стилевой осью, не мёржить.**
- **Локальный kNN-MT / книга-LoRA — НЕ мёржить:** чистый выигрыш kNN уже у детерминированного банка (жёсткая гарантия vs мягкая интерполяция); kNN ≈ GD только на output-projection (Gao 2305.13034) → не чинит сломанные zh-реалии локали (render 0.26); data-poor (сотни пар, LoRA «learns-less» 2405.09673).
- **Само-коррекция:** intrinsic self-correction деградирует без внешнего верификатора (Huang 2310.01798) — а он у нас **уже детерминированный** (post-check) → «детект дрейфа → коррекция» уже решено, не в обучающийся слой.
- **VRAM-гипотеза владельца (эмбеддер→CPU, 8ГБ→обучающийся модуль): верна в посылке, пуста в следствии.** CPU-эмбеддинг — правильный дефолт (real-time эмбеддинга в пайплайне нет, горячий путь = Aho-Corasick), но **обучающегося модуля, который на 8ГБ бьёт базис, НЕТ** → освобождённый VRAM отдать существующим support-ролям локали. **Реальный Pascal-замер (изолир. CUDA-env, 0.5B): QLoRA-4bit РАБОТАЕТ на sm_61 вопреки sm≥75, но ~×9 медленнее fp16-LoRA** (нет Pascal-ядер → преимущество QLoRA инвертируется); потолок удобной тренировки ~1.53B; 7B-QLoRA на/за пределом 8ГБ.
> **[РАСХОЖДЕНИЕ → оркестратору]** (1) Литература «Log Probability Tracking» (2512.03816) утверждает «все xAI/GPT возвращают logprobs» — **живая проба опровергает** (grok-4.3 нет, gpt-5 → 403): урок «проверяй пробой» подтверждён. (2) **Хорошая новость ядру:** soft-глоссарий Р3 индикативно **сильно работает на zh→ru** (0.458→0.875) — валидация банка это на нашем направлении не мерила. (3) Гипотеза владельца о VRAM — принята как инженерная гигиена, отклонена как путь к «обучающемуся модулю, бьющему базис».
> **[БЭКЕНДУ]** Из research/14 в банк v2 фолдится **M2 (детерминированно, 0 ML, 0 VRAM):** консистентность-кэш auto/ambiguous (first-seen/majority-vote) + precision-gated adaptive-retrieval КАКИЕ серо-зонные записи инъектить с **hard-abstention** (лучше ничего, чем мусор). Это гигиена банка, закрывает recall-0.571-дыру и B1 first-wins. **НЕ строить:** локальный kNN-MT, книга-LoRA, constrained decoding, self-correction-как-слой (всё не проходит БАР/физически blocked).
> **[ПИЛОТУ]** M1 (in-context демонстрации, серая зона) фолдится в тот же WMT25-3-режимный eval, что и банк, **+ стилевая ось** (win-rate человека/сильного судьи): критерий — бьёт ли базис по стилю БЕЗ потери консистентности/fidelity и без роста дистрактор-вреда. Индикатив этой сессии: по консистентности не бьёт; стиль не измерен.
> **[ГИГИЕНА]** Модель полигона `qwen3-abliterated:30b-a3b` (6.4 ГБ VRAM) **не выселялась** — GPU-проба шла в свободном CUDA-окне (WSL2 спилит в shared RAM), после — cleanup. Артефакты: `eval/adaptive_probe.py`, `eval/adaptive_incontext.py` (+ `eval/data/*.json`), новые доки — только `research/14`. Изолированный CUDA-env (Pascal-проба) — в scratchpad, не в репозитории. Полный потолок QLoRA-7B+reranker на **чистых** 8ГБ — за скоординированным стенд-окном (не мерил, чтоб не выселять 30b); на вердикт не влияет (кандидата нет).

View file

@ -0,0 +1,212 @@
# Адаптивный/обучающийся слой памяти: стоит ли гибрид, огибающая осуществимого, арбитраж
Дата: 2026-07-05. Сессия **«Адаптивный слой памяти»** (промт `docs/ADAPTIVE_MEMORY_RESEARCH_PROMPT.md`). Предмет — вопрос владельца: не будет ли **максимально эффективным гибрид** «отлаженный детерминированный банк памяти (Р3) + слой, обучающийся ПО ХОДУ перевода книги» (in-context / локальный LoRA / kNN-MT / online-retrieval / само-коррекция), и **как именно смёржить под наш жёсткий локально-стоимостный контур**. Мандат — адверсариально проверить, стоит ли оно того, а не поверить в модность.
Метод (как в валидации банка, `research/13`): многоагентный ресёрч по 6 направлениям (kNN-MT / in-context-демонстрации / adaptive-online-MT / локальный LoRA / adaptive-RAG-петли / свежее 20252026) + **независимая адверсариальная верификация каждой несущей находки по первоисточнику** (24 верификатора: 19 CONFIRMED, 5 OVERCLAIM с точной поправкой) + **две исполняемые пробы на нашем стенде/ключах** (`eval/adaptive_probe.py` — доступ к логитам у флагманов; `eval/adaptive_incontext.py` — демонстрации vs глоссарий на реальном zh→ru) + чтение реального кода `backend/` на git HEAD. Все заблокированности проверены **пробой, а не по памяти** (мандат §Жёсткий контур). Прод-код не пишется — только `eval/` и этот документ.
> **Одна фраза.** Гибрид **в основном НЕ стоит того**: всё, что «учится» на уровне декодера/логитов/весов флагмана — **физически заблокировано** (подтверждено живой пробой), а то, что реально помогает (копирование точного рекуррентного термина; коррекция под надёжный внешний сигнал) — **уже принадлежит детерминированному ядру** и в обучающемся слое было бы строго хуже. Остаётся **ровно один** кандидат, влезающий в контур: **непараметрические in-context демонстрации** для СТИЛЯ серой зоны — но он **не проходит БАР-(в) по имеющимся данным** (мой zh→ru замер: демонстрации НЕ бьют детерминированный soft-глоссарий по консистентности, 0.833 vs 0.875) и его надо **гейтить тем же in-house eval'ом, что и сам банк**. Плюс: гипотеза владельца «эмбеддинги→CPU, 8 ГБ VRAM→обучающийся модуль» **верна в посылке, но пуста в следствии** — освобождать VRAM правильно, но **обучающегося модуля, который на эти 8 ГБ бьёт базис, нет**.
---
## TL;DR — вердикт по каждому кандидату (правило БАР)
БАР (из промта): любой мёрж обязан (а) оставить детерминированный горячий путь авторитетным; (б) влезть в VRAM/стоимость (локаль-first); (в) **эмпирически бить eval-валидированный детерминированный базис на zh/ja→ru** по консистентности/fidelity/цене; (г) оправдать сложность. Не проходит (в) → **не мёржить**.
| Механизм «учится по ходу книги» | Осуществим? | БАР | Вердикт |
|---|---|---|---|
| **kNN-MT на флагмане-переводчике** | ❌ blocked (нужны hidden states декодера) | — | **НЕ мёржить** (физически невозможно) |
| **Constrained/beam decoding, forced tokens на флагмане** | ❌ blocked (нет доступа к декодеру/beam) | — | **НЕ мёржить** (физически невозможно) |
| **Frontier-LoRA / online-SGD весов флагмана** | ❌ blocked (нет тренируемых адаптеров у провайдеров; fine-tuning сворачивается) | — | **НЕ мёржить** (физически невозможно) |
| **Локальный kNN-MT черновик (наш декодер)** | 🟡 технически да | (в) ✗ | **НЕ мёржить**: чистый выигрыш уже у банка; на слабой локали чинит не то |
| **Книга-LoRA на локальном reranker/ключ-энкодере** | 🟡 технически да (впритык) | (в) ✗ | **НЕ мёржить**: data-poor, «learns-less», нет разделяющего порога у bge-m3 |
| **Локальный само-корректирующийся LLM-цикл** | 🟡 да, но | (в) ✗ | **НЕ мёржить**: intrinsic self-correction деградирует без внешнего верификатора (а он у нас уже детерминированный) |
| **In-context ДЕМОНСТРАЦИИ (серая зона: стиль/auto/ambiguous)** | ✅ да (0 VRAM, memory+prompt) | (в) **?** | **ПИЛОТИРОВАТЬ под eval** — единственный кандидат; но индикатив: НЕ бьёт базис по консистентности |
| **Детерминированный консистентность-кэш + precision-gated adaptive-retrieval** | ✅ да (0 ML, 0 VRAM) | (в) н/п | **ВНЕДРЯТЬ** — это гигиена банка, а не «обучающийся слой» |
---
## §0. Жёсткий контур подтверждён живой пробой (не по памяти)
Мандат требовал перепроверить заблокированность методов **пробой**, а не по памяти. Проба `eval/adaptive_probe.py` (2026-07-05, живые ключи, наши боевые модели):
| Модель стека (роль) | token `logprobs` | `logit_bias` | hidden states |
|---|---|---|---|
| deepseek-v4-flash (черновик) | **есть** (top-5) | принят | нет (никогда) |
| grok-4.3 (редактор) | **нет** (200, поле пустое) | **отказ HTTP 400** | нет |
| gemini-3.1-pro (премиум) | **нет** — HTTP 400 «Unknown name logprobs» | отказ 400 | нет |
| gpt-5-mini | **нет****HTTP 403 «not allowed to request logprobs»** | отказ 400 | нет |
Читается так:
1. **kNN-MT на флагмане определённо заблокирован** — и это **двойная** дверь. kNN-MT ключует датастор **внутренним hidden state декодера** (Khandelwal 2010.00710, ICLR 2021, дословно: «the 1024-dimensional representation input to the final layer feedforward network»), **не** выходным логитом. Ни один закрытый API не отдаёт pre-softmax представление декодера. Даже единственный, кто отдаёт хоть что-то (DeepSeek — выходные logprobs), даёт **softmax-выход, а не hidden state** → датастор kNN-MT построить нельзя в принципе.
2. **Логит-стиринг на флагмане почти недоступен**: `logit_bias` принимают только DeepSeek и GLM (и, вероятно, молча игнорируют); grok/gemini/openai — отказ. А для русской морфологии (subword-токены) грубый logit_bias всё равно бесполезен.
3. **Verify-by-probe поймал ошибку литературы.** Свежая работа «Log Probability Tracking of LLM APIs» (arXiv 2512.03816) утверждает, что **«все модели xAI»** и семейство GPT-4.1 возвращают logprobs. **Живая проба это опровергает для наших моделей/даты**: grok-4.3 не возвращает, gpt-5-mini отдаёт **403**. Урок валидации подтверждён: имя/возможность модели проверять пробой, не по документу.
4. **Fine-tuning у провайдеров закрывается, а не открывается**: Gemini API не поддерживает тюнинг после депрекации 1.5-Flash-001 (май 2025), только Enterprise с непрозрачным `adapter_size` без экспорта логитов/hidden state; OpenAI сворачивает self-serve fine-tuning в чёрный ящик без логитов. → **frontier-LoRA как роль переводчика заблокирован и в 2026 не разблокировался.**
**Следствие для всего ответа:** ни kNN-MT, ни constrained decoding, ни дообучение флагмана-переводчика невозможны. Всё «обучение» может жить только (а) на **локальном** декодере (llama.cpp/vLLM отдают логиты/hidden states — это **можно**) или (б) как **непараметрическая** инъекция в промпт закрытого API (memory+prompt). Эти два коридора и разбираются ниже.
---
## §1. Огибающая осуществимого
**Коридор A — локальный декодер (логиты/hidden states доступны).** Физически открыт, но упирается в качество локали: exp03/exp06 — локаль **рендерит zh→ru реалии мусором** (render 0.26 на zh, Палладий-мусор), значит её роль — **support** (спот сущностей recall ~0.98, скрининг, эмбеддинги, дешёвый судья), **не финальный переводчик и не рендерер канона**. Всё, что можно обучить локально (kNN-MT-датастор, LoRA), наследует эту слабость.
**Коридор B — непараметрическая инъекция в промпт закрытого API.** Открыт полностью (0 VRAM, только память+промпт). Сюда попадают: soft-глоссарий (**уже есть** — средний слой Р3), running-summary (DelTA-паттерн, **уже спроектирован**), и **новое** — few-shot **демонстрации** (прошлые подтверждённые пары/пассажи книги). Только последнее — реально «новый» механизм.
**Что вычёркнуто явно (заблокировано, §0):** kNN-MT-на-флагмане, constrained/beam/forced decoding, frontier-LoRA/online-SGD переводчика, Self-RAG с reflection-токенами (требует дообучения генератора, 2310.11511).
**Что влезает в 8 ГБ рядом с bge-m3 и SQLite-банком:** см. §5 (VRAM-арбитраж) — короткий ответ: bge-m3 на GPU (~2.4 ГБ FP32) + резидентная support-локаль 89b (56.6 ГБ) уже насыщают 8 ГБ (замер: 30b-a3b полигона держит 6.4 ГБ, стенд идёт под потолок). Обучающийся модуль **вытесняет** либо эмбеддер, либо support-локаль — резидентно «банк + эмбеддер + reranker + адаптер» вчетвером не живут.
---
## §2. In-context демонстрации — «бесплатный выигрыш» (единственный проходящий отбор кандидат)
**Литература подтверждает тезис в АБСТРАКТЕ, но не в нашем направлении.**
- **Демонстрации > терминология** для стиля и консистентности рекуррентных терминов: Moslem et al. (EAMT 2023, arXiv 2301.13294) — EN→ZH COMET zero-shot 59.87 → fuzzy 2-shot **73.90** → 10-shot 75.30; **добавление 10 glossary-терминов ПОВЕРХ fuzzy-2-shot — плоско** (73.90→73.57). Li/Luo/Briakou/Cherry (Google, arXiv 2503.05010) — retrieved-демонстрации бьют terminology (COMET +2.7/+1.7/+0.1 против +0.3/+0.3/+0.3 у терминологии), причём **терминология почти ничего не даёт сильным моделям**.
- **Критическая рамка (Li et al., верифицировано):** **~65% выигрыша демонстраций — от совпадения СТИЛЯ корпуса, а не от перевода терминов.** Это ровно **серо-зонная/стилевая** роль, которую наш контур разрешает, и **НЕ** точностно-критичный матч approved-имён, который держит детерминированный горячий путь.
**Где ВРЕДИТ (тоже подтверждено):**
- **Power of Noise (Cuconasu, SIGIR 2024, 2401.14887):** семантически близкий, но неответный дистрактор роняет генерацию **сильнее всего** (near-miss хуже случайного шума). → «лучше ничего, чем мусор» — тот же принцип, что в банке.
- **Over-trust в MT (не только QA!):** «Exposing the Cracks» (2510.00829) — при шумном retrieval низкоресурсные направления «often produce nonsensical translations», а **бо́льшие reasoning-модели БОЛЕЕ подвержены** и рационализируют подставленное; Context-Adoption-Rate: Fr→En 2.5→0.7 (72%) под противосмысловым контекстом. Это прямая эмпирика страха владельца — но на **ru-как-источник**, не target.
- **Lost-in-the-middle (N. Liu, 2307.03172)** + раздувание кэшируемого префикса: демонстрации в промпте ломают стабильный кэш-префикс Р5 (их надо в волатильный хвост → рост input-токенов).
**Моя проба на реальном zh→ru** (`eval/adaptive_incontext.py`, 魯迅《阿Q正传》, чанк с 8 рекуррентными персонажами, канон В. Рогова, deepseek-v4-flash, N=3, метрика = детерминированный post-check банка «каноническая форма в выходе»):
| Плечо | канон-консистентность | толкование |
|---|---|---|
| A. без памяти | **0.458** | своя транслитерация дрейфует от канона |
| B. soft-глоссарий (**базис Р3**) | **0.875** | инъекция глоссария сильно тянет к канону (+0.42) |
| C. глоссарий + демонстрации (**слой**) | **0.833** | демонстрации **НЕ бьют** глоссарий (0.04, в шуме) |
| D. глоссарий + дистрактор-демонстрации | **0.875** | near-miss не укусил на этой метрике/масштабе |
| E. глоссарий с ОДНОЙ отравленной строкой (赵太爷→«Ли») | **0.833**, отравление принято **0/3** | сильная модель **сопротивлялась** отраве на известном имени |
Три индикативных вывода (малый N, hand-built accept-регэксп → риск само-подтверждения, одна книга/модель — **не** финальный eval):
1. **Детерминированный soft-глоссарий сильно работает на zh→ru** (0.458→0.875) — впервые индикативно подтверждено на нашем направлении (валидация банка это на zh→ru не мерила). Хорошая новость для ядра.
2. **Демонстрации НЕ бьют глоссарий по консистентности** (0.833 vs 0.875) — ровно как предсказывает Li (выигрыш демо — 65% стиль, а не термин-матч, чего эта метрика не видит). Значит **выигрыш демонстраций, если он есть, — стилевой, а не консистентность/fidelity**, а БАР-(в) меряет именно консистентность/fidelity.
3. **Отравленную строку сильная модель отвергла** на ИЗВЕСТНОМ имени (阿Q-канон в претрейне) — мягкое свидетельство против слепого over-trust, но **НЕ** тест на НОВОМ термине без прайора (там over-trust реален — 2510.00829).
**Вердикт по §2:** демонстрации — единственный кандидат, влезающий в контур (0 VRAM, memory+prompt), но по имеющимся данным **не проходит БАР-(в)**: не бьёт базис по консистентности, а их стилевой выигрыш (а) не измерен на zh/ja→ru нигде, (б) не то, что меряет критерий, (в) приносит риски дистрактора/спойлера/раздувания. → **пилотировать под тем же WMT25-3-режимным eval'ом, что и банк, добавив стилевую ось; НЕ мёржить до прохождения.**
---
## §3. Локальная параметрическая адаптация (LoRA/continual) — для какой роли окупается
**Ни для какой, по имеющимся доказательствам.**
- **Данные:** одна книга даёт **сотни** approved-пар — data-poor. «LoRA Learns Less and Forgets Less» (Biderman, TMLR 2024, 2405.09673): LoRA **недоучивает** новый домен (нужно ~10× больше данных, чем full-FT), хотя и меньше забывает (регуляризатор). На сотнях пар выигрыш сомнителен.
- **Не чинит корневую слабость:** локаль ломает zh-реалии в **представлениях** (upstream), а не в выходной проекции. Даже kNN-MT — это (приблизительно, Gao 2305.13034, EMNLP 2023 — поправка верификатора: «a specific case of fine-tuning», не «математически эквивалентно») **implicit GD только на output-projection**, т.е. переставляет верхний слой в **уже сломанном** пространстве. LoRA низкого ранга — тот же потолок. → **рендерер-канона роль закрыта** (её держит облако/человек+таблица Палладия, G1/B6).
- **Reranker/ключ-энкодер:** bge-m3 эмпирически **не даёт разделяющего порога** (валидация банка, пересечение распределений) — нет доказательства, что книга-LoRA на ключ-энкодере это чинит; а reranker 2-го эшелона **не бьёт** precision-1.0 детерминированный горячий путь (там он и не нужен).
- **Test-time training** звучит близко, но единственная сильная работа (2411.07279) — **поправка верификатора: измерена на ARC-головоломках (symbolic grid), НЕ на MT**; перенос на перевод — ноль.
- **Железо (каветат владельца (a), верифицировано + замер стенда):** единственный первоисточник по консумерским 8 ГБ (2509.12229) — **поправка: тренирует ТОЛЬКО 1.5B**, batch≤2, и **на RTX 4060 (Ada sm_89), НЕ Pascal**. 7B-QLoRA ~810 ГБ пик (Dettmers 2305.14314) → **не сорезидентен ни с чем** (ни с bge-m3, ни с reranker). Все числа — Ampere/Ada; **перенос на Pascal GTX 1070 не гарантирован** (см. §5 — реальный замер bnb-4bit на sm_61).
**Вердикт по §3:** нет источника, где per-book локальный LoRA бьёт детерминированный базис на zh/ja→ru; корневая слабость (реалии) им не чинится; данных мало; железо — впритык и Pascal-неопределённо. **НЕ мёржить.**
---
## §4. Локальный kNN-MT / retrieval-augmented ДЕКОДИНГ
**На флагмане — blocked (§0). На локали — технически да, но не стоит.** Четыре независимых довода (все верифицированы):
1. **Чистый выигрыш kNN-MT уже у нас.** Единственная гарантированная победа kNN-MT — скопировать точный рекуррентный target-токен из датастора. Это **ровно** то, что делает детерминированный Aho-Corasick approved-глоссарий — но с **жёсткой** гарантией против **мягкой** интерполяции kNN (kNN подмешивает как вес, модель может перебить). Дублировать это обучающимся слоем — строго хуже (теряем гарантию, возвращаем тихую инъекцию).
2. **Не чинит реалии на слабой базе** (Gao 2305.13034 — output-projection only; §3).
3. **Шумный retrieval деградирует** (Jiang 2210.08808, EMNLP 2022: 45.92→42.22 BLEU от шума — но на **сильной** De-En базе; слабая локаль даёт хуже дискриминированные ключи → именно тот шумный режим).
4. **Tiny datastore = самый слабый режим** (Khandelwal: выигрыши от датасторов 159K18.3M токенов; одна книга ~10⁵ токенов — на нижней границе или ниже) + **~×100 латентность** vanilla (эффективные варианты — Wang 2204.06175, Martins chunk-based — снимают ценой качества).
**Вердикт по §4:** локальный kNN-MT-черновик, кормящий API-редактора — **не** новый выгодный мёрж: его консистентность-выигрыш принадлежит банку, а адаптационный выигрыш ограничен слабой локалью, на которой он сидит. **НЕ мёржить.**
---
## §5. VRAM-арбитраж («кто побеждает») — прямой ответ на гипотезу владельца
Гипотеза владельца: **эмбеддинги+векторный поиск целиком на CPU/RAM, все 8 ГБ VRAM — под обучающийся модуль (LoRA/reranker/адаптер).**
**Посылка — ВЕРНА (подтверждено).**
- **Нигде в пайплайне нет real-time эмбеддинга.** Горячий путь — детерминированный Aho-Corasick (микросекунды, CPU-дёшево), **без модели**. Эмбеддинги — Фаза-2 второй эшелон, генерация кандидатов на ревью, **пачечная**. Каветат (b) закрыт: эмбеддинг — фон, не интерактив.
- **CPU-числа (замерены валидацией банка, не переоткрываю):** bge-m3 CPU ~78 мс/текст → вся книга (~510k чанков+резюме) ≈ 713 мин **пачкой**; brute-force cosine <20 мс на 100k. Латентность неважна (фоновый инжест). bge-m3 в RAM ~2.4 ГБ из 32 незаметно.
- **CPU-контеншн с горячим путём и Go-раннером (каветат c) — планируем:** горячий путь микросекундный и не конкурирует; сами переводческие вызовы **сетевые** (ждут API), CPU простаивает; эмбеддинг-инжест ставится **между главами/на границе джоб**, вне критического пути. Контеншн управляем расписанием, не архитектурой.
**Следствие — ПУСТО (это и есть развязка).** Освободить 8 ГБ можно, но **обучающегося модуля, который на них бьёт детерминированный базис, НЕТ** (§2§4): локаль не рендерит zh (роль рендерера закрыта), reranker не бьёт precision-1.0 горячий путь, книга-LoRA data-poor и не чинит реалии, kNN-MT-выигрыш уже у банка. **Освобождённый VRAM правильнее отдать УЖЕ существующим support-ролям локали** (спот сущностей recall 0.98 — write-path банка G1; NSFW-скрининг/черновик; дешёвый судья-гейт), которые контур уже требует, чем гипотетическому обучающемуся слою.
**Реальный замер потолка на стенде (2026-07-05, `eval/adaptive_probe`-инфра + изолированный CUDA-env):**
- Резидентно сейчас: `qwen3-abliterated:30b-a3b` полигона — **6.4 ГБ VRAM** (не выселял; координация — PROGRESS-пинг).
- **WSL2-квирк (важно для «арбитра»):** CUDA видит `free=7.0 ГБ / total=8.59 ГБ` даже при резидентном 30b — WSL2 **спилит в shared system RAM** сверх физических 8 ГБ. То есть «8 ГБ» на этом стенде **мягче**, но спил идёт по DDR-скорости (как эксперт-офлоад 30b-a3b) → «влезло по CUDA» ≠ «влезло быстро». Арбитраж по `max_memory_allocated` процесса, не по nvidia-smi.
- **bnb-4bit на Pascal sm_61 — реальный замер** (изолированный CUDA-env, Qwen2.5-0.5B, 3 train-step): bitsandbytes 0.49.2 официально таргетит sm≥75 (Turing), но **QLoRA-4bit NF4 фактически РАБОТАЕТ на Pascal sm_61** (loss считается, backprop идёт, peak 1.00 ГБ на 0.5B). **Но на Pascal 4-bit ~×9 МЕДЛЕННЕЕ fp16-LoRA** (5.6с vs 0.6с на 3 шага) — оптимизированных NF4-ядер под Pascal нет, dequant-оверхед доминирует → **на этой карте преимущество QLoRA по скорости ИНВЕРТИРУЕТСЯ**: влезает в fp16 — бери fp16-LoRA; QLoRA нужен только для 7B+ (в fp16 ~14 ГБ весов не влезают), где он единственный вариант, но медленный. Потолок «удобно тренируется» — **~1.53B** (QLoRA ~24 ГБ); **7B-QLoRA ~810 ГБ = на/за физическим пределом 8 ГБ** (в WSL2 спилит в RAM → ещё медленнее), и **7B-тренировка + резидентный reranker одновременно не живут**. Каветат владельца (a) подтверждён замером: 4-bit нужен для 7B, но на Pascal он медленный; макс. удобная модель ~1.53B.
**Вердикт по §5:** CPU-эмбеддинг/GPU-free сплит — **правильный дефолт** (посылка верна, каветаты b/c закрыты), но **не ради обучающегося слоя** (его нет под БАР), а ради существующих support-ролей и чтобы **не** держать эмбеддер резидентно зря. Гипотеза владельца подтверждена как **инженерная гигиена**, опровергнута как **путь к «обучающемуся модулю, бьющему базис»**.
---
## §6. Adaptive online-retrieval + само-корректирующая петля — что реально без тяжёлого ML
**Скептическая литература решает вопрос за нас.**
- **Intrinsic self-correction деградирует** без надёжного внешнего сигнала: «LLMs Cannot Self-Correct Reasoning Yet» (Huang, ICLR 2024, 2310.01798) — точность плоско/падает после само-коррекции; Kamoi (TACL 2024, 2406.01297) — **надёжный внешний верификатор — единственный различитель** успеха и провала. В MT: TEaR (2402.16379) +0.39 COMET и **один раунд лучший** (итерации портят); систематика WMT24-literary (2605.13368) — рефайнмент улучшает **fluency/style/terminology, но не adequacy**; Chen (2306.03856) — BLEU падает при рефайнменте.
- **У нас надёжный внешний верификатор УЖЕ есть** — детерминированный Aho-Corasick post-check на approved-глоссарии. То есть «детект дрейфа → коррекция approved-термина» **уже решено** детерминированно и **не должно** уезжать в обучающийся слой (нарушит контур-5).
- **Реально новая зона** — auto/ambiguous сущности **без** approved-ответа. Здесь работает **детерминированный консистентность-кэш** (first-seen/majority-vote рендеринга, БЕЗ ML) + **precision-gated adaptive retrieval** КАКИЕ серо-зонные записи инъектить, с **hard-abstention** (паттерн risk-sensitive bandit 2604.27283 — штраф за ложную инъекцию > пропуск, воздержание first-class — но **без онлайн-обучения**, просто как precision-gate). Опциональный локальный CRAG-подобный оценщик (2401.15884, дообученный T5) мог бы заменить отсутствующий разделяющий cosine-порог bge-m3 — но это Фаза-2, low-trust, и тоже гейтится.
**Вердикт по §6:** петля «детект→коррекция» ценна, но её **надёжная** часть уже детерминирована; «обучение» сверх — это **бухгалтерия глоссария** (кэш растёт), а не ML.
---
## §7. Предложенные архитектуры мерджа (творческий мандат, каждая — против БАР)
### M1 — «In-context демонстрации в серой зоне» (пилот под eval; единственный проходящий отбор)
- **Компоненты:** банк v2 как есть + retrieval прошлых подтверждённых пассажей книги как few-shot **демонстрации** ТОЛЬКО для стиля/консистентности **серо-зонных** терминов (auto/ambiguous/редкие реалии), в **волатильном хвосте** промпта после кэш-брейкпоинта.
- **Арбитраж:** approved+точный матч — банк, **неоспорим**; демонстрации — только **обогащают** серую зону; **каждая** инъекция гейтится детермининированным post-check; precision-first фильтр + hard-abstention (Power of Noise). Демонстрации **никогда** не имеют write-authority над approved-именами.
- **Где мог бы бить базис:** гипотетически стиль/регистр рекуррентных редких терминов (Li: 65% выигрыша — стиль).
- **БАР:** (а) ✓; (б) ✓ 0 VRAM, +input-токены; (в) **✗ по индикативу** (0.833 vs 0.875 на консистентности; стиль не измерен); (г) сложность средняя (retrieval + гейт + кэш-раскладка). → **пилотировать под WMT25-3-режимным eval'ом на zh/ja→ru + стилевая ось (win-rate человека/сильного судьи); не мёржить до прохождения.**
### M2 — «Детерминированный консистентность-кэш + precision-gated adaptive-retrieval» (внедрять; не ML)
- **Компоненты:** для auto/ambiguous БЕЗ approved — first-seen/majority-vote кэш рендеринга (детерминированное расширение банка); adaptive выбор КАКИЕ серо-зонные записи инъектить (risk-sensitive precision-gate, abstention first-class).
- **Это «обучение по ходу книги»** в тривиальном смысле (глоссарий растёт) — **без модели/VRAM/логитов.**
- **Арбитраж:** кэш **предлагает** → post-check **гейтит** → batch-судья/человек **промоутит** в approved (закрывает G1/F5/B1 first-wins-навсегда осью «редакционного времени»).
- **БАР:** (а) ✓; (б) ✓ 0 VRAM; (в) не претендует бить fidelity — **закрывает реальную дыру recall-0.571** (косвенные/перефразные серо-зонные) дёшево; (г) малая. → **внедрять как гигиену банка v2.**
### Отвергнуто (не проходит БАР)
- **Локальный kNN-MT-черновик** (§4): чистый выигрыш уже у банка; на слабой локали чинит не то. **НЕ мёржить.**
- **Книга-LoRA на reranker/ключ-энкодере** (§3): data-poor, learns-less, нет разделяющего порога, Pascal-неопределённость. **НЕ мёржить.**
- **Constrained decoding / frontier-LoRA / Self-RAG на флагмане** (§0): физически blocked.
---
## §8. Арбитраж «кто побеждает» (сводно)
1. **approved + точный/леммный матч** → детерминированный банк, **неоспорим** (контур-5). Обучающийся слой сюда не входит **никогда**.
2. **Серая зона** (auto/ambiguous/стиль/2-й эшелон) → обучающийся слой (демонстрации, кэш-подсказки) может **обогащать**, но: каждая инъекция гейтится **детерминированным post-check**; при конфликте побеждает **precision-first фильтр** (лучше воздержаться, чем инъектить неуверенное); промоушен в approved — только через batch-судью/человека.
3. **Резюме/факты** → отдельный гейт фактичности (D1), не «авторитет по умолчанию».
4. **VRAM** → эмбеддер на CPU (дефолт); 8 ГБ — существующим support-ролям локали, **не** обучающемуся слою (§5).
---
## Честные слабые места рекомендаций (по этим пунктам пишут решение)
1. **Ни одна цифра литературы не на zh/ja→ru — тотально.** Все 24 верификации: DelTA, Moslem, Li, Power-of-Noise, self-correction-скептики, kNN-MT, LoRA, ModernMT/Lilt — англо-центричны или ru только как источник. Ближайшее к нам — **WMT24 Discourse-Level Literary (2412.11732) с добавленным zh→ru document-level треком** и **DITING (2510.09116)** zh-en вебновелла — но это **бенчмарки-оценки**, не методы адаптации, и ja→ru литературной адаптации/бенчмарка **не существует вовсе** (2505.05423 держит ru только как источник). Любая рекомендация по ja→ru — по аналогии, не по данным.
2. **Мой in-context замер — индикативный, с широкими CI.** N=3, одна книга/чанк/модель, accept-регэкспы построил сам (риск само-подтверждения), метрика меряет **консистентность канона, а не стиль**а именно стиль демонстрации и должны улучшать. «Демо не бьют глоссарий» доказано **для консистентности**, НЕ опровергнуто для стиля. Стилевую ось (win-rate) я не мерил — это дыра, которую должен закрыть пилот.
3. **Over-trust я мерил на ИЗВЕСТНОМ имени** (阿Q-канон в претрейне) — модель отраву отвергла. На **новом** термине без прайора over-trust реален (2510.00829) — мой E-плечо это НЕ покрывает. Не читать «отраву отвергли» как «инъекция безопасна».
4. **bnb-4bit на Pascal — замерил на 0.5B, экстраполировал на 7B.** Факт: NF4 работает на sm_61, но ~×9 медленнее fp16-LoRA (нет Pascal-ядер); потолок удобной тренировки ~1.53B. Но **полный потолок QLoRA-7B + резидентный reranker одновременно на ЧИСТЫХ 8 ГБ** я прямым прогоном не мерил (не выселял 30b полигона; экстраполяция из 0.5B-footprint + Dettmers; WSL2-спил в shared RAM мутит «влезло/не влезло»). Точное число — за **скоординированным** стенд-окном (выселить 30b). На вердикт не влияет: кандидата, который на эти 8 ГБ бьёт базис, всё равно нет (§3).
5. **«Демонстрации не помогают» может перевернуться на СЛАБОЙ модели.** Moslem мерил GPT-3.5; наш черновик deepseek-v4-flash сильнее и, возможно, **не нуждается** в демонстрациях (потолок). На более слабой/дешёвой модели или на редких терминах вне претрейна демо могут дать больше — узкий сценарий, где M1 мог бы окупиться (проверять на пилоте).
6. **Distractor-плечо (D) — слабый тест Power-of-Noise.** Мои дистракторы off-topic, а имена заякорены глоссарием → шум не укусил. **Near-miss омограф на ИМЯ** (реальный режим A3) я не тестировал — там вред вероятнее.
7. **Я рекомендую в основном НЕ строить — а это тоже ставка.** Сильнейший контр-аргумент: DelTA/Moslem показывают выигрыш памяти-с-адаптацией, и наш детерминированный no-adaptation путь — ставка по экономике/контуру, не по доказательствам. Защитима (§0 блокировки + §2 индикатив), но это ставка «дешёвое-детерминированное поверх дорогого-обучающегося», как и в валидации банка.
---
## Что делать (сжато для оркестратора/бэкенда)
- **Внедрять (Фаза 12, дёшево, 0 ML):** M2 — консистентность-кэш auto/ambiguous + precision-gated adaptive-retrieval + hard-abstention. Это гигиена банка v2, закрывает recall-0.571-дыру и B1 first-wins.
- **Пилотировать под eval (Фаза 2.5), НЕ мёржить сейчас:** M1 — in-context демонстрации в серой зоне; добавить **стилевую ось** (win-rate человека/сильного судьи) к WMT25-3-режимному протоколу банка; критерий — бьёт ли базис по стилю БЕЗ потери консистентности/fidelity и без роста дистрактор-вреда.
- **Не строить:** локальный kNN-MT, книга-LoRA, constrained decoding, self-correction-как-обучающийся-слой.
- **VRAM:** дефолт «эмбеддер→CPU» принять; освобождённые 8 ГБ — существующим support-ролям локали, не обучающемуся слою; скоординированный стенд-замер QLoRA-Pascal-потолка — если когда-нибудь понадобится (сейчас не нужен, кандидата нет).
---
## Источники (проверены 2026-07-05; 19 CONFIRMED / 5 OVERCLAIM с поправкой верификаторов)
**Заблокированность (проба + первоисточник):** kNN-MT ключ = hidden state — Khandelwal «Nearest Neighbor MT» ([2010.00710](https://arxiv.org/abs/2010.00710), ICLR 2021); kNN ≈ GD только на output-projection — Gao ([2305.13034](https://arxiv.org/abs/2305.13034), EMNLP 2023, *поправка: «a specific case of fine-tuning», не «математически эквивалентно»*); logprob-выживание API — [2512.03816](https://arxiv.org/abs/2512.03816) (*опровергнуто живой пробой для grok/gpt-5*); Self-RAG требует дообучения — [2310.11511](https://arxiv.org/abs/2310.11511). Живая проба: `eval/adaptive_probe.py`, `eval/data/adaptive_probe.json`.
**In-context демонстрации:** Moslem «Adaptive MT with LLMs» (EAMT 2023, [2301.13294](https://arxiv.org/abs/2301.13294)); Li/Cherry «Retrieval vs Fine-Tuning at Inference» ([2503.05010](https://arxiv.org/abs/2503.05010)); Power of Noise (SIGIR 2024, [2401.14887](https://arxiv.org/abs/2401.14887)); over-trust в MT «Exposing the Cracks» ([2510.00829](https://arxiv.org/abs/2510.00829)); lost-in-the-middle ([2307.03172](https://arxiv.org/abs/2307.03172)). Проба: `eval/adaptive_incontext.py`, `eval/data/adaptive_incontext.json`.
**Локальный LoRA/kNN-MT:** QLoRA (Dettmers, [2305.14314](https://arxiv.org/abs/2305.14314)); профиль на консумере (*поправка: 1.5B, RTX 4060 Ada, не Pascal*, [2509.12229](https://arxiv.org/abs/2509.12229)); LoRA Learns Less/Forgets Less (Biderman, TMLR 2024, [2405.09673](https://arxiv.org/abs/2405.09673)); test-time training (*поправка: ARC, не MT*, [2411.07279](https://arxiv.org/abs/2411.07279)); adaptive kNN-MT (Zheng, ACL 2021, [2105.13022](https://arxiv.org/abs/2105.13022)); robust kNN-MT (Jiang, EMNLP 2022, [2210.08808](https://arxiv.org/abs/2210.08808)); efficient/chunk kNN-MT ([2204.06175](https://arxiv.org/abs/2204.06175), 2022.emnlp-main.284).
**Само-коррекция/adaptive-RAG:** Huang «Cannot Self-Correct Yet» (ICLR 2024, [2310.01798](https://arxiv.org/abs/2310.01798)); Kamoi (TACL 2024, [2406.01297](https://arxiv.org/abs/2406.01297)); TEaR ([2402.16379](https://arxiv.org/abs/2402.16379)); WMT24-literary рефайнмент ([2605.13368](https://arxiv.org/abs/2605.13368)); Adaptive-RAG (NAACL 2024, 2024.naacl-long.389); CRAG ([2401.15884](https://arxiv.org/abs/2401.15884)); FLARE ([2305.06983](https://arxiv.org/abs/2305.06983)); risk-sensitive abstention-bandit ([2604.27283](https://arxiv.org/abs/2604.27283)).
**Adaptive/online классический MT (механизм, не вендор-числа):** Farajian (2017, multi-domain per-sentence); Wuebker «Compact Personalized» (EMNLP 2018); Peris «Online Learning for NMT PE» ([1706.03196](https://arxiv.org/abs/1706.03196)); Simianer «Immediate Adaptation R0/R1» (NAACL 2019); Wang «Non-Parametric Online from Feedback» ([2109.11136](https://arxiv.org/abs/2109.11136)). ModernMT/Lilt — вендор-маркетинг, **не** цитируется как доказательство.
**Заземление на наше направление:** DelTA (ICLR 2025, [2410.08143](https://arxiv.org/abs/2410.08143), *LTCR-1 = самосогласованность-с-первым*); WMT24 Discourse-Level Literary с **zh→ru** ([2412.11732](https://arxiv.org/abs/2412.11732)); DITING zh-en вебновелла ([2510.09116](https://arxiv.org/abs/2510.09116)); LiTransProQA (ru только источник, [2505.05423](https://arxiv.org/abs/2505.05423)).
**Проба-инфра:** `eval/adaptive_probe.py` (логиты/logit_bias флагманов), `eval/adaptive_incontext.py` (демо vs глоссарий, zh→ru А-Q), реюз `eval/refusal_bench.call_provider`+`providers.json`, корпус `eval/data/samples` (魯迅 阿Q + канон Рогова). Изолированный CUDA-env (Pascal QLoRA-проба) — в scratchpad, не в репозитории.