textmachine/docs/research/34-memory-bank-quality-audit.md

26 KiB
Raw Blame History

34. Банк памяти и качество перевода — что он держит, чего не держит и что доработать

⚠ РЕВЮ-ШАПКА — прочти прежде содержимого

Статус: ФАКТУРА, НЕ РАТИФИЦИРОВАНА. При конфликте с журналом решений побеждает журнал.

Откуда взялось. Вопрос владельца 11.09: «что для качества перевода надо в банке памяти доработать». Разобрано веером из 21 агента (2.7 млн токенов, 958 обращений к инструментам) — пять читателей по осям, затем адверсариальная верификация КАЖДОЙ находки с мандатом «опровергни».

Дисциплина, с которой это читать. Верификация отвергла 14 находок из 15 — и почти все не за ложность, а за завышенный вес или нулевую новизну (предмет уже стоит строкой бэклога либо объявлен в том же доке, откуда взято число). Формально подтверждена ОДНА (K3, вопрос пост-проверки). Синтез ниже написан ПОСЛЕ верификации и несёт её поправки — в частности, снято утверждение «канон ни разу не подан в прогон» (неверно: ключ glossary_seed задан в 18 конфигах дерева).

Чего здесь нет: суждений о качестве перевода на целевом жанре. Всё ниже — про МЕХАНИЗМ и его наблюдаемость.

⚠ Числа сняты 11.09 на дереве f9216cd. Адреса file:line пере-снимать командой: движок двигали пять паков за неделю.

ЧТО В БАНКЕ ПАМЯТИ НАДО ДОРАБОТАТЬ ДЛЯ КАЧЕСТВА ПЕРЕВОДА

1. Что банк гарантирует сегодня

Одну вещь, и делает её сильно: там, где термин ЕСТЬ в банке и его поверхность выстрелила в куске, модель видит одну и ту же строку. Это подтверждено четырьмя независимыми A/B: переводческий провод 43 % → 95 % (docs/research/24-bank-arbitration.md §C, 21 клетка, 6 окон), редакторский 815/21 → 21/21 (docs/experiments/18-editor-wire-probe.md §A.1), 0.53 → 0.92 на 163 упоминаниях и 0.566 → 0.820 на 228 (docs/experiments/21-role-topology.md §14, §16.1). Заголовочные «99,3100 %» дала именно эта инъекция, а не проверка.

Чего он не держит — шесть границ, каждая названа кодом или замером:

  • Второй передачи рядом с канонной не видит. Вопрос пост-проверки — «есть ли dst где-нибудь в куске», а не «какой формой отрендерён термин» (backend/internal/membank/mempostcheck.go:139if present { continue }). «Фан Юань» и «Фанъюань» в одном абзаце дают 0 промахов (исполнено на копии). Сплошной дрейф — ловит.
  • Неверного dst, которому модель послушалась, не видит по построению — код сам называет это BLIND SPOT (mempostcheck.go:18-26).
  • Термина, которого в банке нет, не видит вовсе — молчание неотличимо от успеха. Порог добычи: реже 5 раз в книге термин не предлагается никогда (backend/internal/miner/miner_emit.go:26), потолок предложений — 200 на книгу (:31).
  • Книжного вопроса не задаёт ни разу. Все 4 не-тестовых вызова проверки — по чанку или правочной единице (waverun.go:618, :738, repair.go:630-631); книго-широкое — это суммы поколоночных счётчиков (quality.go:270-272). Никто не сравнивает главу 12 с главой 901.
  • Остановить отгрузку может ровно одно место — export.go:463 — и оно выключено везде: postcheck_gate — 0 вхождений в backend/configs/ при живом блоке gates: в 4 конфигах из 4 (пере-замерено мной); 0 из 281 сохранённого снапшота прогона нёс его включённым. 317 подтверждённых промахов глоссария отгружены.
  • Голоса до модели не доезжают вообще: InjectVoice — константа false без ручки (bankmaterialize.go:295), в промте переводчика 9 плейсхолдеров и 0 про персонажа, gates.voice — 0 в конфигах, а сам флаггер объявлен «PURE observability».

Одной фразой: банк — это замок на входе в запрос и счётчик на выходе. Замка на выходе нет, книжного вопроса нет, и половина того, что вы называете каноном («голоса»), до запроса не доезжает.

2. Что доработать в банке — пять предметов

(1) Книжный свод расхождений — $0, день. Без него приоритет непроверяем в принципе. Мера «сколько РАЗНЫХ форм дал один термин» уже построена: Spread и Variants в backend/internal/pipeline/mining.go:383-384. Но считается она по ЧЕРНОВИКУ, на стопе майнинга, ДО редакторской волны, и читает её только человеческая таблица подписи. Перенести тот же счёт на отгружаемый текст и печатать отчётом сборки: «термин X отдан тремя формами в главах 12, 340, 901». Ни одного платного вызова, переиспользование готового. Предмет не пуст: полигонный прибор на стенде дал 1316 % терминов с более чем одной передачей и 68 % сменивших доминирующую форму (docs/archive/PROGRESS-2026-09-07-16-backend-packs.md:2908). Это единственная работа, которая делает качество ПРЕДЪЯВИМЫМ.

(2) Спросить проверку о правильном — день (дешёвая половина). Сегодня проверяется присутствие в куске; надо — форма на месте срабатывания и наличие конкурирующей рядом. Живой экземпляр измерен: 古月方源 заведён алиасом записи 方源 («Фан Юань»), выход «Гу Юэ Фан Юань» её содержит ⇒ промаха нет, а ваш подписанный канон 古月 → Гуюэ (books/gu-zhenren/guzhenren-seed-v2.yaml:38-39) нарушен внутри составного имени. Дешёвое лечение названо самим полигоном: проверять алиас-ключ на СОБСТВЕННУЮ канонную форму. Дорогая половина (детектор значения по исходнику) — за замером, не сейчас.

(3) Досеять ДАННЫЕ банка — день, и это прямо чинит точность. Не Go. Три дыры в данных, из-за которых прибор врёт: (а) глагольные и многословные термины засеяны с пустыми формами — один 炼化 дал 7 ложных промахов и в одиночку пробил метрику прогона; (б) односимвольный ханьский ключ структурно вне автомата без allow_short (порог 2 знака, membank/memory.go:71), а это самый частый класс канона в китайском ранобэ — 蛊, 道, 气; (в) сид-линт об этом молчит. Цена бездействия измерена: у глоссарного класса чекера точность 0,067 — 1 верное срабатывание на 14 ложных (n=258), и из 14 ложных 6 приходятся на один односимвольный , ещё 4 на 蛊虫 (books/gu-zhenren/labels/metrics.json). Именно из-за этой цифры гейт и не включают.

(4) Редактор — источник разнобоя, а не страховка поверх банка. День + один заказ. Замерено дважды: без закон-блока редактор ломает 512 из 20 уже ВЕРНЫХ клеток черновика (exp18 §A.1), а с подключённым банком боевой редактор держит ХУДШЕЕ покрытие канона в панели — 0.882 против 0.909 у черновика, который он правит (exp22 §6.2, чистый материал, 1124 упоминания). Два механических носителя: черновая волна выбирает по БАЗОВОМУ банку с исключением намайненного (bankmaterialize.go:329) — то есть на первом прогоне книги черновик идёт вообще без добытого банка; а редакторская волна, единственная с полным банком, теряет липкость между правочными единицами внутри главы (waverun.go:717, nil) при 86 % многоединичных глав (1962 из 2283). Закон-блок должен стать инвариантом конфига, а не следствием выбора модели редактора.

(5) Голоса — узел без провода. Это не «доработать», это сначала ваш ответ (см. §4). Мёртв в четырёх местах сразу: нет данных (0 непустых секций voices: из 47 сид-файлов дерева), нет производителя (майнер профили не эмитит — 0 упоминаний в 10 его файлах), нет инъекции (константа), нет запущенной проверки. И ни одного числа за всю историю проекта: носитель журнала обращений живёт в 6 Go-файлах и не встречается ни разу в 66 полигонных и ресёрч-доках (контроль: слово «канон» в тех же 66 файлах — 333 раза).

Чего в списке НЕТ намеренно: бюджет инъекции. Ходящее число «кап течёт на 4060 %» считает ЭМИССИОННЫЙ кап майнера, а не бюджет провода. Бюджет не выбросил ни одной строки ни в одном прогоне дерева: сумма вытеснений по 161 базе = 0 при живых соседних колонках (5885 точных попаданий, 2979 липких, 510 неоднозначных). Тратить на это не надо.

3. Что нельзя решить работой — ждёт замера на настоящей книге

Это определяет, что закладывать в прогон.

  • Точность и полнота проверки на подписанном каноне. Сегодня 0,067 (выше), и ложные срабатывания сконцентрированы в одном классе: односимвольные и общеупотребительные ключи. ⚠ Здесь ратифицированная формулировка неточна и это надо поправить прежде, чем строить по ней порядок работ: «канон ни разу не подан в прогон, весь дрейф — дрейф с отключённым каноном» верно ТОЛЬКО про исследовательский стенд (там 0 из 30 конфигов несут ключ сида). В дереве 18 конфигов задают подписанный сид, пять прогонов держат 3657 подписанных строк, а весь размеченный корпус — 91 единица — снят с прогонов С каноном. Дрейф ПРИ каноне тоже наблюдён (тот самый 古月方源). Значит переизмерение — это не «сперва подключить канон», а «разметить класс, которого в корпусе не было», и стоит оно $0 на уже оплаченных артефактах плюс новый прогон.
  • Впервые встретить настоящий объём. Максимальный банк за всю историю дерева — 102 строки на 25 главах; потолок предложений 200, бюджет провода 800 токенов (≈141180 строк). На 2283 главах оба потолка встретятся с реальностью впервые. Снять с прогона, а не выводить.
  • Дрейф от потери банка между правочными единицами. Экспозиция замерена (86 % глав; на срезе 25 глав теряется 49 банковых строк на 12 единицах), самих инцидентов — ноль наблюдений. Правка без замера была бы стрельбой вслепую.
  • Кривая деградации по главам. Её нет ни у кого, включая внешние харнессы. Нужен ряд «глава → число терминов с более чем одной передачей». Снимается $0 ПОСЛЕ прогона — но только если свод из §2.1 построен ДО.
  • Порог частоты. «Реже 5 раз — не предлагаем» ставился на 15 главах пилота. Какая доля канонических терминов настоящей книги живёт на частоте 34 — не спрошено ни разу.
  • Активный ноль. Ни один замер банка не нёс контроля «та же книга без банка». Направление подтверждено четырежды, ВЕЛИЧИНА «99,3100 %» — ни разу.

Что заложить в прогон конкретно: подписанный сид с досеянными формами и явным allow_short у односимвольных; флаг остановки на подпись (иначе банк едет неподписанным по умолчанию); сохранять расхождение форм по ФИНАЛЬНОМУ тексту, а не по черновику; хотя бы один непустой профиль голоса, иначе голосовая половина снова вернётся с нулём, неотличимым от чистоты; книга целиком, а не срез.

4. Что требует вашего слова

  1. Стоп или флаг. Сегодня разъехавшийся термин отгружается: механизм остановки построен и работоспособен, но выключен, и включается ОДНОЙ строкой данных без правки Go. Вы сами отложили это до замера ложных срабатываний («если он ложно положительно будет стрелять — это плохо, очень плохо»). Рекомендация: не включать до §3.1, но решить сейчас, что стоп делает — держит кусок целиком (сегодня это пустая отгрузка) или зовёт точечную перегенерацию; актуатора у промаха нет вовсе.
  2. Входит ли голос в приоритет №1. Ратифицированный список от 05.09 ставит в №1 ТОЛЬКО термины, голос — №3; канон проекта говорит «термины/голоса». Пока это не одно требование, сессия, собранная по такой формулировке, будет строить от неверной цели. И следом: подпись профилей вы сняли, а реестр физически заполняла только она — если не подпись, то кто?
  3. Один перевод у неподписанного термина. Ваше слово записано, но исполнено только для подписанных. Неподписанных — 92 % строк по всему корпусу баз, 15 % после дедупа по книге (оба числа верны, считают разное: первое — файлы, второе — книги). Три детектора противоречия только пишут в лог. Оба выхода стоят денег: уронить оплаченный прогон либо двинуть версию памяти и пере-купить редакторскую волну.
  4. Накапливать ли банк между прогонами. Авто-банк переписывается целиком из топ-200 текущего прогона; выпавшие поимённо названы в логе, подписанные защищены тремя стражами, но неподписанная строка едет на провод как закон и может смениться между главами. Слияние двигает версию памяти ⇒ пере-покупка. Код прямо адресует это вам.
  5. Остановка на подпись — опция или свойство продукта. Сегодня по умолчанию «никогда не останавливаться» (backend/cmd/tmctl/invocation.go:141), на API это галочка пользователя. Без неё движок пишет свои строки в банк и отдаёт редактору неподписанный канон — то есть «человек утверждает термины» сегодня не является свойством продукта.

ЗАМЕРЕНО · ВЫВЕДЕНО · НЕ СПРОШЕНО

ЗАМЕРЕНО (приборы названы; звёздочкой — пере-проверено мной лично в этой сессии, остальное — пятью читателями):

  • postcheck_gate и voice в backend/configs/ — по 0 вхождений при контроле: 5 yaml на верхнем уровне, 8 рекурсивно, блок gates: найден в 4 из 4 боевых конфигов.
  • injection.txt несёт РОВНО один целевой ключ ru при контроле — 5 ключей (en ja ko ru zh) в соседнем lang-script.txt. На любой другой цели оба банк-блока рендерятся в 0 байт (исполнено на копии: ru 366+542 байта, en 0+0, de 0+0).
  • Не-тестовых вызовов пост-проверки — 4, все по чанку/юниту (waverun.go:618,738, repair.go:630,631) плюс определение.
  • ★ По 162 базам дерева: 161 с таблицей состояния выборки, 4865 строк, сумма вытеснений 0 при контроле 5885 точных попаданий / 2979 липких / 510 неоднозначных; подтверждённых промахов глоссария 317.
  • ★ Точность глоссарного чекера: n=258, верных 1, ложных 14, пропусков 0 — и все 14 ложных разложены: ×6, 蛊虫 ×4, 元石 ×2, 凡人, 甲等; все пять прогонов-источников — С подключённым каноном.
  • Снапшотов прогонов с включённым гейтом — 0 из 281 (18 «без поля» вскрыты: ручные пробы, не конвейер).
  • «99,3100 %» воспроизведены байт-в-байт на копии (375/98.9/100.0 · 390/98.5/99.5 · 531/97.4/99.6 · 548/96.9/99.3) и разобраны: предикат — присутствие принятой формы в чанке, единица — пара «термин × чанк».
  • Пробы на копиях: смесь двух форм в одном куске → 0 промахов; сплошной дрейф → 1 промах; термин вне банка → 0/0; односимвольный ключ без allow_short не выстреливает.
  • Данные: 47 сид-файлов с терминами, 22 с секцией голосов, 21 из них пустая, непустых живых — 0. Субстрат майнера: zh 48 кандидатов из 120 рун против en 0/504, ko 0/200, катакана 0/160.

ВЫВЕДЕНО (не замер, помечаю честно):

  • Что кап 200 и бюджет 800 встретятся с настоящим объёмом: экстраполяция со 102 строк на 25 главах на 2283 главы.
  • Что потеря липкости между правочными единицами даёт дрейф в тексте: замерена только экспозиция (86 %), инцидентов ноль.
  • Что вторая передача распространена в отгруженном тексте: 1316 % сняты на стенде БЕЗ канона; тем же прибором по подписанному прогону не ходили.
  • Что голоса входят в приоритет №1: канон и ратификация расходятся — поэтому это ваш вопрос, а не вывод.

ЧЕГО ПЯТЬ ЧИТАТЕЛЕЙ НЕ СПРОСИЛИ:

  1. Полисемия по книге. Банк — один исходный термин, один перевод, замороженный на прогон. Сцена, где 气 не «ци», в модели банка не существует, и ни один прибор её не ищет. Для 2283 глав это не теоретический класс.
  2. Ёмкость человека. Весь механизм консистентности упирается в вашу подпись, а сколько предложений на главу выдаст майнер на полной книге и сколько это минут — не смоделировано никем; в реестре рисков эта позиция стоит с пометкой «дыра» и не имеет носителя ни в одном трекере.
  3. Цена самого свода. Работу из §2.1 все оценивают «день», но время прохода по 5071 чанку полной книги никто не прикинул.
  4. Вторая книга той же пары. Классификатор типа термина — тот, что решает «транслитерировать или переводить» — обучен на каноне 蛊真人 прямо в общем промте пары (backend/prompts/zh-ru/classifier.md, шесть книжных поверхностей плюс два few-shot-ответа). Смещение на другой zh→ru книге не мерил никто.
  5. Ретроактивность подписи. Два прогона ОДНОЙ книги разошлись в самом каноне — 元石 «первокамень» против «первобытный камень», 真元 «истинная энергия» против «истинная ци», обе записи подписаны. Прибор удостоверяет верность тому канону, который загрузили, а не стабильность канона. Что делать с главами, отгруженными до того, как вы поменяли подпись на 300-й главе, — не спросил никто.