# 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 финала); центральный тезис §1–2 (monolingual polish теряет accuracy) **независимо подтверждён по первоисточнику arXiv:2605.13368** → пилот-арм D13.1; непроцитированные числа («85,7→76–78» и пр.) — НЕ факты до верификации. Реальные точки напряжения: моно-редактор D1 (→D17), rewrite-vs-patch (решает пилот C0–C3), 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 refiner’s 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 до диапазона около 76–78. Обратная комбинация — слабый перевод и сильный редактор — давала большой рост. Это означает, что добавление ещё одного агента само по себе ничего не гарантирует: **слабый 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"
