textmachine/docs/research/12-architecture-as-antipattern.md

1077 lines
45 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 12-architecture-as-antipattern. Как пайплайн усиливает ошибки модели (внешний материал)
> ⚠ **ПРОВЕНАНС НЕ ЗАФИКСИРОВАН (шапка добавлена оркестратором 09.07.2026).** Текст ниже — вставленный ответ внешней LLM, полученный владельцем (модель/промпт/дан ли контекст проекта — не записано; **владельцу: уточнить** — если модель видела контекст проекта, «конвергенция» с нашими решениями частично циркулярна и не считается независимым подтверждением). Верификационный статус (`../architecture/07-strategic-review.md` §4.1): большинство тезисов конвергентно уже принятым решениям (hard gates ≈ детерминированные гейты, versioned store ≈ glossary_revisions, uncertainty ≈ disposition, спойлер-окна ≈ since/until, ре-валидация ≈ post-check финала); центральный тезис §12 (monolingual polish теряет accuracy) **независимо подтверждён по первоисточнику arXiv:2605.13368** → пилот-арм D13.1; непроцитированные числа («85,7→7678» и пр.) — НЕ факты до верификации. Реальные точки напряжения: моно-редактор D1 (→D17), rewrite-vs-patch (решает пилот C0C3), self-preference Gemini-апекс/судья (→second-opinion судья, план Ф2).
Да. Тут есть отдельный класс проблем: **backend не просто наследует ошибки модели, а усиливает их архитектурой pipelineа**.
Коммерческие сервисы редко раскрывают внутреннюю реализацию, поэтому ниже не аудит конкретного продукта, а разбор типичных архитектур:
```text
parser
→ chunker
→ translator LLM
→ book summary / glossary / character bible
→ critic agents
→ editor LLM
→ global consistency pass
→ formatter
```
Главная ошибка таких систем:
> LLM используется не как генератор кандидатов и детектор гипотез, а как надёжный редактор, валидатор, база знаний и арбитр одновременно.
В результате одна вероятностная модель генерирует текст, сама оценивает его, сама исправляет и сама сообщает, что всё стало лучше.
# 1. «Редактор» на самом деле не исправляет ошибки
Типичный prompt:
```text
Improve this translation.
Make it more natural, accurate and literary.
Preserve the author's style.
```
Backend ожидает, что модель:
1. найдёт ошибку;
2. поймёт её причину;
3. изменит только неправильный фрагмент;
4. сохранит всё остальное.
На деле модель часто выполняет другую операцию:
> генерирует новую версию текста, которая сильнее похожа на предпочитаемый ею тип прозы.
Систематическое исследование литературного document-level refinement показало, что улучшения идут преимущественно по fluency, style и terminology, а улучшения смысловой точности заметно слабее и нестабильнее. Авторы описывают поведение модели как **projection toward the refiners distribution**, а не как локальный locate-and-fix.
То есть редактор думает не так:
```text
В предложении 14 потеряно отрицание.
Заменить span [41:58].
```
А скорее так:
```text
Как бы я написал весь этот абзац более естественно?
```
## Конкретные последствия
* Исправляется предложение, которое уже было правильным.
* Меняется синтаксис соседних предложений.
* Удаляются намеренные повторы.
* Реплика персонажа становится «красивее».
* Добавляются связки и пояснения.
* Снижается буквальная точность.
* Меняется эмоциональная интенсивность.
* Изменения невозможно однозначно привязать к найденной ошибке.
Особенно опасен **monolingual polish**, когда редактору показывают только перевод без оригинала. В опубликованных результатах такие проходы регулярно улучшали fluency, одновременно снижая accuracy; в некоторых конфигурациях падение точности после нескольких проходов достигало нескольких и даже более десяти пунктов по использованной метрике.
## Как должен выглядеть нормальный редактор
Не:
```json
{
"revised_translation": "полностью переписанный абзац"
}
```
А:
```json
{
"issues": [
{
"source_span_id": "chapter_04.p_117.s_3",
"target_span": "Он, кажется, удивился",
"type": "lost_negation",
"severity": "critical",
"evidence": "Source contains 'did not seem surprised'",
"proposed_replacement": "Он, похоже, не удивился",
"confidence": 0.97
}
]
}
```
И только после этого отдельный patcher применяет минимальное изменение.
# 2. Повторная редактура создаёт drift
Backend часто делает несколько проходов:
```text
translation
→ accuracy editor
→ literary editor
→ dialogue editor
→ style editor
→ final polish
```
Каждый проход выглядит разумно отдельно. Но каждый агент получает право полностью перегенерировать текст.
Получается **итеративный drift**:
```text
оригинал
перевод
↓ немного ближе к стилю редактора №1
↓ ещё ближе к стилю редактора №2
↓ нормализовано редактором диалогов
↓ отполировано финальным редактором
```
В итоге пятый вариант может быть очень гладким, но уже заметно дальше от оригинала, чем первый.
Исследование refinement также обнаружило два ограничения:
* **ceiling effect** — итоговое качество ограничено способностями редактора;
* **anchor effect** — редактор остаётся привязан к исходному переводу и не всегда способен обнаружить его скрытую смысловую ошибку.
Там же сильный перевод, переданный слабому редактору, заметно деградировал: оценка снижалась примерно с 85,7 до диапазона около 7678. Обратная комбинация — слабый перевод и сильный редактор — давала большой рост. Это означает, что добавление ещё одного агента само по себе ничего не гарантирует: **слабый refiner способен испортить сильного translatorа**.
## Архитектурный анти-паттерн
```text
for editor in editors:
text = editor.rewrite(text)
```
## Более безопасная схема
```text
candidate = translation
issues = detect(candidate, source)
verified_issues = independently_verify(issues, source)
for issue in verified_issues:
candidate = apply_minimal_patch(candidate, issue)
rerun_invariants(candidate)
```
Редактор должен иметь:
* edit budget;
* список разрешённых типов изменений;
* обязательное доказательство;
* привязку к source span;
* запрет на изменение соседнего текста;
* режим `NO_CHANGE`;
* повторную проверку после patch.
# 3. Иллюзия, что длинный context означает понимание всей книги
Backend может отправлять модели:
```text
Вот вся книга.
Вот текущая глава.
Переведи её с учётом всей книги.
```
Формально книга помещается в context window. Но это не значит, что модель действительно использует нужный фрагмент.
Исследование document-level translation проверяло модели, подменяя правильный контекст случайным или испорченным. Многие LLM оказались подозрительно устойчивы к такой подмене: качество почти не менялось, что указывает на слабое фактическое использование контекста. Особенно это проявлялось при разрешении местоимений.
Иными словами:
> Контекст присутствует в prompt, но это не означает, что он участвует в решении.
## Что происходит внутри backendа
В книге на 150 000 слов полезный факт может находиться за 80 000 слов до текущей сцены:
* настоящее имя персонажа;
* его пол;
* принятый вариант прозвища;
* скрытая родственная связь;
* манера обращения к конкретному собеседнику;
* значение термина, объяснённое один раз;
* факт, что герой намеренно притворяется неграмотным.
На фоне всей книги этот факт — редкий слабый сигнал.
Исследователи document-level MT описывают дилемму:
* положить максимально длинный context и потерять нужную зависимость в шуме;
* дать короткий локальный context и вообще не показать нужный факт.
Поэтому специальные retrieval-механизмы для дальнего контекста улучшают согласованность относительно простого добавления большого блока текста. ([ACL Anthology][1])
## Конкретный симптом
Book bible содержит:
```text
Мира — женщина, 32 года, говорит формально.
```
Но в конкретной сцене важно другое:
```text
С Томасом Мира с главы 19 перешла на «ты»,
а формальный стиль сохраняет только при свидетелях.
```
Глобальная карточка персонажа не содержит relationship state. Модель получает правильный, но недостаточный контекст и переводит сцену неверно.
# 4. Путаница голосов персонажей
Это одна из самых недооценённых backend-проблем.
Обычно система хранит персонажа примерно так:
```json
{
"name": "Mira",
"age": 32,
"personality": ["reserved", "sarcastic", "intelligent"],
"speech_style": "formal and concise"
}
```
Для сохранения голоса этого почти недостаточно.
## Голос — не набор прилагательных
Речь персонажа определяется как минимум:
* средней длиной реплики;
* длиной синтаксических конструкций;
* частотой обрывов;
* формой отрицаний;
* употреблением вводных слов;
* характерными междометиями;
* уровнем лексики;
* частотой метафор;
* склонностью отвечать вопросом;
* использованием эвфемизмов;
* отношением к мату;
* обращением к каждому конкретному персонажу;
* изменением речи под стрессом;
* изменением речи при лжи;
* публичной и приватной манерой речи.
`formal and concise` не кодирует ничего из этого.
Исследования персонализированного перевода показывают, что LLM всё ещё трудно воспроизводить стиль, когда он задан не явными правилами, а примерами текста конкретного автора или переводчика. Даже при наличии нескольких примеров style imitation остаётся отдельной нерешённой задачей.
## Как backend смешивает голоса
### Шаг 1. Translator нормализует
У персонажей разные исходные голоса:
```text
A: You don't know that.
B: Ah, but therein lies the problem, my dear fellow.
C: Dunno. Wasn't there.
```
Переводчик выдаёт:
```text
A: Ты этого не знаешь.
B: Но именно в этом и заключается проблема, мой дорогой друг.
C: Не знаю. Меня там не было.
```
У C уже исчезла просторечность.
### Шаг 2. Dialogue editor «делает естественнее»
```text
A: Откуда тебе знать?
B: Но, мой дорогой друг, именно в этом и заключается проблема.
C: Откуда мне знать? Меня там не было.
```
Теперь A и C используют одинаковую конструкцию.
### Шаг 3. Consistency editor видит вариативность
Он решает, что повторяющиеся идеи должны быть оформлены одинаково, и ещё сильнее унифицирует реплики.
### Шаг 4. Final polish убирает шероховатости
Именно шероховатости часто и были голосом персонажа.
## Что ещё ломает голоса
* Все главы обрабатываются одним и тем же style prompt.
* Один editor переписывает реплики всех персонажей.
* Характер задаётся описанием, а не реальными speech exemplars.
* Dialogue agent видит только одну сцену.
* Нет данных, кому адресована реплика.
* Нет временного состояния отношений.
* Нет информации, говорит герой искренне или играет роль.
* Прямая речь извлекается без авторских ремарок.
* При chunking реплика отделяется от имени говорящего.
* Не различаются narrator voice и character voice.
* Проверяется «одинаковость» речи персонажа, но не её уместная изменчивость.
Для языков с развитой системой вежливости проблема становится ещё сложнее: выбор окончания, обращения или honorific зависит от статуса, близости, ситуации и конкретного собеседника. Это выделяется как отдельный критерий литературного перевода, поскольку неправильный register напрямую искажает отношения персонажей. ([arXiv][2])
# 5. Global style guide уничтожает локальные стили
Backend часто генерирует один документ:
```text
Translation style:
- elegant literary Russian
- natural dialogue
- avoid repetitions
- prefer concise sentences
- maintain emotional intensity
```
После этого guide применяется ко всей книге.
Проблема в том, что книга может намеренно содержать:
* сухие главы одного рассказчика;
* витиеватые главы другого;
* письма;
* детскую речь;
* дневниковые записи;
* протоколы;
* сны;
* ненадёжное повествование;
* главы, написанные под разных авторов.
Один global style prompt превращает всё это в один регистр.
Особенно опасные инструкции:
```text
avoid repetition
improve readability
make dialogue natural
maintain consistent style
remove awkward phrasing
```
В художественном тексте:
* повтор может быть мотивом;
* неудобочитаемость может передавать психическое состояние;
* неестественная реплика может быть характеристикой героя;
* inconsistency может быть намеренным переключением регистра;
* awkward phrasing может быть авторским приёмом.
Сравнение человеческих и LLM-переводов показывает, что машинные варианты склонны быть более буквальными и менее разнообразными. Автоматические метрики при этом плохо отличают профессиональный перевод от гладкого машинного текста.
Отдельный препринт 2026 года также обнаружил model-specific emotional fingerprints: разные LLM систематически сдвигали эмоциональный профиль перевода, что ограничивало сохранение авторского голоса. Это пока не окончательное доказательство для всех моделей и языков, но хорошо иллюстрирует проблему: модель приносит в текст собственный устойчивый эмоциональный стиль. ([arXiv][3])
# 6. Book bible может отравить всю книгу
Современный backend часто сначала просит LLM извлечь:
```text
characters
relationships
timeline
terms
locations
style rules
```
Это кажется хорошей архитектурой. Но результат анализа обычно принимается как истина.
## Poisoned memory
Допустим, аналитик ошибочно записал:
```json
{
"entity": "Ash",
"type": "male character"
}
```
Хотя Ash:
* женщина;
* организация;
* бесполое существо;
* фамилия;
* намеренно неопределённый персонаж.
Теперь эта ошибка попадает:
* в translator prompt;
* в pronoun resolver;
* в glossary;
* в consistency checker;
* в редактора;
* в финальный validator.
Каждый следующий агент видит не исходную неопределённость, а уверенную структурированную запись.
Это создаёт **error amplification through shared state**.
## Почему несколько агентов не спасают
Все агенты получают одну и ту же ложную память:
```text
Translator: Ash is male.
Editor: Ash is male.
Validator: Ash is male.
```
Три агента «согласны», но их согласие не независимо.
Правильная память должна хранить не только значение, но и происхождение:
```json
{
"entity": "Ash",
"gender": {
"value": "unknown",
"evidence": [
"chapter_01.p_14",
"chapter_07.p_91"
],
"first_explicit_resolution": null,
"confidence": 0.42
}
}
```
Для любого inferred fact нужны:
* evidence spans;
* уровень уверенности;
* область действия;
* момент книги, с которого факт известен читателю;
* distinction между авторским фактом и догадкой модели.
Последний пункт особенно важен. Backend не должен давать переводчику спойлер из главы 40, если в главе 3 автор намеренно сохраняет неопределённость.
# 7. Summary memory теряет самое важное
Чтобы не класть всю книгу в prompt, backend создаёт summary:
```text
Chapter 12:
Mira confronts Tomas and learns he lied.
Their relationship deteriorates.
```
Но для перевода могут быть важны детали:
* она узнала не точно, а лишь заподозрила;
* она притворилась, что поверила;
* он не соврал напрямую, а уклонился;
* внешне отношения не изменились;
* она после этого продолжает обращаться к нему формально;
* читатель пока не знает, что она всё поняла.
Summary оптимизируется под передачу событий, а не под переводческие зависимости.
## Потерянные классы информации
* epistemic state: кто что знает;
* reader state: что известно читателю;
* deception state: кто кому врёт;
* relationship state;
* register state;
* narrative distance;
* unresolved ambiguity;
* recurring imagery;
* синтаксические паттерны;
* speech habits;
* скрытые параллели между сценами.
Поэтому «summary всей книги» не является полноценной памятью для литературного перевода.
# 8. RAG достаёт похожий, но неправильный контекст
Наивный retrieval делает embedding search:
```text
current scene → top-k semantically similar passages
```
Для технического текста это часто приемлемо. Для романа — не всегда.
## Пример
Текущая реплика:
```text
You came back.
```
Retrieval может найти:
* другую сцену возвращения;
* реплику другого персонажа;
* флешбэк;
* сон;
* символическое употребление;
* позднейшую сцену после изменения отношений.
Семантически фрагменты похожи, но переводческое решение зависит от:
* говорящего;
* адресата;
* времени;
* отношения персонажей;
* реальности сцены;
* narrative layer.
Поэтому retrieval должен фильтроваться не только по embedding similarity, но и по:
```text
speaker
addressee
timeline
scene type
POV
entity IDs
relationship state
term family
narrative layer
```
Работы по self-retrieval для document-level MT исходят именно из того, что дальние зависимости редки и распределены по документу, а простой большой context не умеет надёжно выделять релевантные участки. ([ACL Anthology][1])
# 9. Параллельная обработка глав создаёт race conditions
Для скорости backend может переводить 30 глав одновременно.
```text
chapter 1 ─┐
chapter 2 ─┼─ parallel
chapter 3 ─┤
...
chapter 30 ┘
```
В этот момент у системы ещё нет устойчивых решений по:
* именам;
* прозвищам;
* обращениям;
* терминам;
* названиям организаций;
* речи героев.
Глава 2 выбирает:
```text
Order of Ash → Орден Пепла
```
Глава 17:
```text
Order of Ash → Пепельный орден
```
Глава 25:
```text
Order of Ash → Орден Эша
```
Потом global consistency editor выбирает один вариант. Но он может выбрать:
* наиболее частый;
* наиболее естественный;
* вариант из первой главы;
* вариант, предпочитаемый самой моделью.
Ни один из этих критериев не гарантирует правильность с учётом будущего раскрытия термина.
## Правильнее
Некоторые решения должны быть синхронными:
```text
analyze
→ identify unstable terms
→ translate representative occurrences
→ commit terminology decisions
→ translate dependent chapters
```
Либо нужен versioned decision store:
```json
{
"term_id": "order_of_ash",
"version": 4,
"target": "Орден Пепла",
"effective_from": "chapter_01",
"evidence": [...],
"locked": true
}
```
И при изменении решения backend обязан инвалидировать зависимые главы.
# 10. Несколько агентов создают ложную независимость
Часто marketing-схема выглядит так:
```text
Translator agent
Critic agent
Style agent
Consistency agent
Chief editor
```
Но все пять ролей могут быть:
* одной моделью;
* моделями одного семейства;
* с почти одинаковыми system prompts;
* с одинаковой book bible;
* с одним и тем же исходным ошибочным переводом.
Назначение разных ролей не превращает их в независимых экспертов.
Исследования self-refinement выявили self-bias: модели склонны предпочитать собственные генерации, а повторная самооценка способна усиливать эту предвзятость. При этом fluency может улучшаться, хотя целевая ошибка остаётся или появляется ложное исправление.
Отдельная работа по correlated errors показывает, что ошибки LLM существенно коррелируют; модели одного поставщика или архитектурного семейства ошибаются особенно похоже. В исследованных задачах пары моделей, когда обе ошибались, в среднем выбирали одинаковый неправильный ответ примерно в 60% случаев. Это не литературный benchmark, поэтому число нельзя напрямую переносить на перевод, но механизм важен для multi-agent backendов: **несколько моделей не равны нескольким независимым свидетельствам**. ([arXiv][4])
## Плохой consensus
```text
3 из 4 агентов считают перевод правильным.
```
Это ничего не доказывает, если:
* все получили одну ложную summary;
* все принадлежат одной model family;
* все предпочитают гладкий текст;
* все не заметили одно отрицание;
* все используют одинаковый rubric.
# 11. Агенты теряют информацию между этапами
Multi-agent backend должен передавать между ролями:
* текст;
* source alignment;
* обнаруженные ошибки;
* доказательства;
* ограничения;
* unresolved questions;
* version state.
Но часто передаётся только свободный текст:
```text
The translation is mostly good, but dialogue should be more natural
and terminology should be more consistent.
```
Editor должен сам восстановить, о каких местах речь.
Исследование failure modes multi-agent systems выделяет отдельные классы:
* context loss;
* игнорирование входа другого агента;
* неверные предположения;
* task derailment;
* withholding critical information;
* mismatch между reasoning и выполненным действием.
Авторы подчёркивают, что многие сбои возникают из-за architecture, prompt specification и state management, а не только из-за слабости базовой модели. ([arXiv][5])
## В переводческом backend это выглядит так
Critic:
```text
The character's tone is too formal in several places.
```
Editor:
* не знает, в каких местах;
* не знает, какой персонаж;
* не знает, с кем он разговаривает;
* не знает, какой register ожидался;
* переписывает все реплики менее формально.
Нужен structured issue protocol, а не литературное эссе от critic agent.
# 12. Coordinator усредняет несопоставимые оценки
Некоторые multi-agent evaluators вычисляют общий score:
```text
overall =
0.3 * terminology +
0.3 * narrative +
0.4 * style
```
Проблема: критическая смысловая ошибка может компенсироваться высоким style score.
```text
accuracy: 0.40
terminology: 0.95
style: 0.98
overall: 0.80
```
Система сообщает: «качество хорошее».
Но если перепутан убийца и жертва, итоговый текст непригоден независимо от красоты языка.
Опубликованный MAS-LitEval действительно использует специализированных агентов по терминологии, narrative perspective и стилю, а coordinator объединяет оценки взвешенным средним. Авторы сами указывают ограничения: субъективность style scoring, возможные LLM biases, тестирование лишь на двух произведениях и отсутствие подтверждения экспертной человеческой оценкой. ([arXiv][6])
## Правильная агрегация
Не одно число, а hard gates:
```text
critical omission → FAIL
wrong participant → FAIL
spoiler introduction → FAIL
lost negation → FAIL
unresolved terminology → REVIEW
style deviation → WARNING
minor fluency issue → PASS_WITH_WARNING
```
Некоторые категории нельзя усреднять.
# 13. LLM-validator проверяет «похожесть на хороший перевод», а не истинность
Validator получает оригинал и перевод и отвечает:
```text
The translation is accurate, natural and preserves the tone.
Score: 9/10.
```
Почему он может пропустить ошибку:
* перевод звучит правдоподобно;
* неправильная причинная связь всё равно логична;
* потерянное ограничение маленькое;
* смысловая ошибка находится далеко от проверяемого span;
* validator не знает будущего раскрытия;
* язык перевода для него слабее английского;
* rubric слишком общий;
* ответ оценивается целиком, а не атомарно.
Исследования multilingual LLM-as-a-judge показывают, что один и тот же judge может давать непоследовательные оценки в разных языках; особенно хуже результаты для low-resource languages.
Для литературного перевода проблема ещё глубже: стандартные автоматические метрики и даже сложная человеческая MQM-разметка плохо выделяли профессиональные человеческие переводы. В одном исследовании автоматические метрики распознавали превосходство человеческого перевода не более чем примерно в 20% случаев, тогда как более подходящая схема экспертного сравнения давала намного более уверенное предпочтение человеческим версиям.
# 14. Проверка consistency легко превращается в вредную унификацию
Consistency checker обычно ищет:
```text
одинаковый source term → одинаковый target term
один персонаж → одинаковая манера речи
одна сущность → одно название
```
Но в художественном тексте вариативность может быть намеренной.
## Примеры
Один персонаж называется:
* официальным именем;
* семейным прозвищем;
* оскорбительным прозвищем;
* титулом;
* кодовым именем.
Один термин:
* официально называется одним образом;
* в народе — другим;
* врагами — третьим.
Один персонаж:
* с начальником говорит формально;
* с другом сокращённо;
* в панике теряет грамотность;
* публично использует другой акцент.
Наивный consistency agent увидит рассогласование и исправит его.
## Нужно различать
```text
inconsistency
variation
alias
register-dependent form
speaker-dependent form
time-dependent form
deliberate deviation
```
Без этого «улучшение согласованности» уничтожает социальную структуру книги.
# 15. Backend не различает голос автора, рассказчика и героя
В романе могут одновременно существовать:
```text
authorial style
narrator style
POV character perception
spoken character dialogue
quoted document style
translator style
```
Наивный backend имеет один параметр:
```json
{
"style": "dark, poetic, concise"
}
```
Он применяет его ко всему.
В результате:
* рассказчик начинает говорить как главный герой;
* внутренний монолог становится похож на диалог;
* письма звучат как основной narrative;
* разные POV-главы унифицируются;
* стиль переводчика замещает стиль автора;
* речь второстепенных персонажей получает общую «литературность».
Правильная модель состояния должна быть иерархической:
```text
Book
├─ authorial constraints
├─ narrator A
│ ├─ POV chapter state
│ └─ narrative distance
├─ narrator B
├─ character Mira
│ ├─ public voice
│ ├─ private voice
│ ├─ voice with Tomas
│ └─ stress-state voice
└─ embedded documents
```
# 16. Финальный polish инвалидирует все предыдущие проверки
Типичный pipeline:
```text
translation
→ validation
→ fixes
→ final literary polish
→ export
```
Это логическая ошибка.
Validator проверил версию `v7`, но публикуется `v8`, которую никто не проверил.
Final polish может:
* удалить отрицание;
* переставить субъект;
* изменить обращение;
* объединить предложения;
* вернуть старый термин;
* испортить markup;
* удалить намеренный повтор.
После **любого генеративного изменения** должны повторно выполняться:
* alignment check;
* coverage check;
* entity check;
* negation check;
* number/date check;
* terminology check;
* dialogue attribution check;
* source-aware semantic validation.
# 17. Регенерация вместо patch ломает воспроизводимость
Модель получает просьбу:
```text
Исправь только второе предложение.
```
Но API возвращает весь абзац.
Даже при низкой temperature она может изменить:
* пунктуацию;
* слова-связки;
* порядок частей;
* кавычки;
* соседнюю реплику.
Backend затем сохраняет весь новый абзац, потому что не умеет надёжно выделить intended patch.
Это создаёт:
* новые незамеченные изменения;
* diff noise;
* невозможность нормального code review;
* неповторяемость результата;
* каскад повторных проверок;
* конфликт с translation memory.
Надёжнее требовать операции:
```json
{
"operation": "replace",
"target_block_id": "ch04.p17.s2",
"expected_old_hash": "8f30...",
"old_text": "...",
"new_text": "...",
"reason": "lost negation"
}
```
Если hash не совпадает, patch отвергается.
# 18. Нет настоящего понятия «не уверен»
LLM обычно вынуждают выбрать перевод:
```text
Translate the passage.
```
Даже если:
* пол персонажа неизвестен;
* термин двусмыслен;
* reference непонятен;
* рукопись повреждена;
* неизвестно, имя это или обычное слово.
Модель выдаёт уверенный вариант, который попадает в glossary и становится canon.
Нормальный backend должен разрешать:
```json
{
"status": "ambiguous",
"alternatives": [
{"text": "...", "interpretation": "..."},
{"text": "...", "interpretation": "..."}
],
"resolution_required_by": "chapter_18",
"temporary_strategy": "preserve ambiguity"
}
```
То есть uncertainty должна быть объектом системы, а не скрытым внутренним ощущением модели.
# 19. Самые опасные backend-анти-паттерны
В порядке практической опасности:
1. **Полная перегенерация текста каждым редактором.**
2. **Target-only polish без оригинала.**
3. **Один и тот же model family для translation, critique и validation.**
4. **Один global style guide для всех голосов.**
5. **Book bible без evidence и uncertainty.**
6. **Параллельный перевод глав до фиксации терминологии.**
7. **LLM-оценка одним общим score.**
8. **Отсутствие hard gates для критических ошибок.**
9. **Финальный polish после последней валидации.**
10. **Свободный текст между агентами вместо structured issues.**
11. **Семантический RAG без speaker/time/POV filters.**
12. **Проверка consistency как требования полной одинаковости.**
13. **Хранение голоса персонажа тремя прилагательными.**
14. **Отсутствие stable IDs и source-target alignment.**
15. **Невозможность модели ответить `NO_CHANGE` или `AMBIGUOUS`.**
# Как выглядел бы действительно сильный backend
```text
1. Parse
└─ immutable source blocks with stable IDs
2. Analyze
├─ entity graph with evidence
├─ timeline
├─ knowledge states
├─ relationship states
├─ terminology candidates
└─ voice exemplars
3. Translate
├─ local source context
├─ retrieved distant evidence
├─ speaker/addressee state
└─ locked terminology decisions
4. Detect
├─ deterministic invariants
├─ semantic issue agents
└─ voice deviation detectors
5. Verify
├─ independent model/provider
├─ blind to translator rationale
└─ source-span evidence required
6. Patch
├─ minimal edits only
├─ hash-protected spans
└─ no unrelated rewrites
7. Revalidate
├─ coverage
├─ entities
├─ dialogue attribution
├─ terminology
├─ voice
└─ formatting
8. Publish
└─ exact trace of every modification
```
Ключевой принцип:
> Генеративная модель должна предлагать перевод или конкретный patch. Она не должна сама бесконтрольно переписывать собственный результат, сама выставлять ему итоговую оценку и сама объявлять работу завершённой.
И именно здесь, на мой взгляд, сейчас находится наиболее интересная коммерческая ниша: не ещё один «пятиагентный переводчик», а **translation backend с нормальной инженерией состояния, доказуемыми изменениями, character-state tracking и source-grounded validation**.
Можно поставить ежемесячный мониторинг новых исследований именно по book-level translation pipelines, refinement drift, character voice и LLM-validation.
[1]: https://aclanthology.org/anthology-files/pdf/wmt.real/2025.wmt-1.104.pdf "Self-Retrieval from Distant Contexts for Document-Level Machine Translation"
[2]: https://arxiv.org/html/2412.01340v1 "A 2-step Framework for Automated Literary Translation Evaluation: Its Promises and Pitfalls"
[3]: https://arxiv.org/abs/2606.10113 "Emotion Profiling in LLM-Based Literary Translation: Systematic Shifts Across MT and Post-Editing"
[4]: https://arxiv.org/html/2506.07962v1 "Correlated Errors in Large Language Models"
[5]: https://arxiv.org/pdf/2503.13657 "Why Do Multi-Agent LLM Systems Fail?"
[6]: https://arxiv.org/html/2506.14199v1 "MAS-LitEval : Multi-Agent System for Literary Translation Quality Assessment"