Григорий Добряков

Howto · разбор

Разбор 01 Facebook · 105 399 просмотров · 203 комментария

Book-as-context: проектирование сложной архитектуры с ИИ через подложку из книги

Как заземлить агента на авторитетный первоисточник, чтобы он проектировал event-driven архитектуру production-grade уровня с гарантиями доставки и согласованностью данных между системами «с одного промпта».

CTO Head of AI Tech Lead Architect

Проблема

Если сказать Claude или Cursor «сделай передачу заказов из интернет-магазина в ERP» — на выходе будет наколеночный файловый обмен по FTP и рапорт «готово». Дальше разработчики смеются и делают вывод «ИИ не тянет архитектуру».

Причина не в модели. Модель опирается на «среднюю температуру по интернету» — усреднённый код из открытых источников, где production-grade интеграции встречаются реже, чем туториалы. Без предметной базы агент не знает, что правильный ответ здесь — event-driven с гарантиями доставки, idempotency (идемпотентностью) и согласованностью данных между системами. На уровне intake ту же дыру закрывает clarify gate в Jira (#11): пока в тикете нет цели, scope и AC, задача не уходит в разработку.

Сквозной пример: магазин → ERP

Один и тот же класс задачи, два разных результата.

Без подложки: «Сделай передачу заказов из интернет-магазина в ERP» → CSV, cron, FTP, «готово».

С wiki Таненбаума — реальная постановка: интеграция 1С-Битрикс → ERP «Галактика» → CRM Creatio. Агент идёт по графу концептов:

«ERP может быть недоступна часами, заказы не должны теряться»
  → message-oriented middleware (MOM):
    persistent communication — очередь хранит сообщение до доставки
    vs transient communication — получатель должен принять прямо сейчас
  → message queue systems — не email: гарантии доставки, журнал, балансировка
  → AMQP: unsettled → settled → forgotten — три шага фиксации доставки
  → two-phase commit (2PC) — если две БД должны обновиться атомарно
Вопрос Без wiki С wiki (реальный выход)
Синхронность REST «отправил — готово» outbox в БД → брокер → адаптеры (асинхронно)
ERP offline «перешлём завтра вручную» persistent communication: очередь копит; магазин работает
Потеря / дубликат «перешлём ещё раз» idempotency key, at-least-once, dead letter queue (DLQ)
Транспорт к ERP FTP как основной путь шина/очередь → REST/SOAP → файловый обмен только fallback
ERP + CRM «надеемся на best effort» журнал состояний, partial success, eventual consistency

Что реально вышло на выходе

Фрагмент реального ТЗ: агент с wiki-подложкой по задаче 1С-Битрикс → ERP «Галактика» → CRM Creatio.

Источник событий — Битрикс после фиксации заказа. Событие фиксируется через transactional outbox, преобразуется в каноническую модель и попадает в персистентный брокер. Адаптеры асинхронно доставляют данные в ERP и CRM; сквозное состояние — в журнале интеграции. Повторы — через idempotency, экспоненциальный backoff и DLQ; порядок изменений одного заказа сохраняется по causal ordering (причинному порядку событий).

Логическая схема из §7.1:

[ИМ 1С-Битрикс] --(Outbox/событие)--> [Интеграционный сервис]
                                      |
                    Канонизация, валидация, обогащение НСИ
                                      |
                         [Брокер сообщений (персистентные очереди)]
                         /                              \
            [Адаптер ERP «Галактика»]          [Адаптер CRM Creatio]
                         \                              /
                          `--> [Журнал состояний / сквозная БД] <--'

Приоритет транспорта к ERP — файловый обмен не основной путь:

Приоритет Решение
1 Корпоративная шина / менеджер очередей
2 HTTPS REST или SOAP
3 (fallback) Файловый обмен — только аварийный или пакетный канал

SLO и отказоустойчивость (§6.1)

Показатель Значение в ТЗ
RPO (брокер/outbox) 0 — потеря недопустима
RTO ≤ 1 ч штатно, ≤ 4 ч при деградации
End-to-end ERP + CRM P95 ≤ 5 мин, P99 ≤ 15 мин
Доступность контура ≥ 99,9% / месяц

Частичный успех ERP + CRM (§12.3)

eventual consistency — конечная согласованность без автоматического two-phase commit.

Безопасность каналов (§8)

Traceability: wiki → ТЗ (Приложение А)

Принцип из wiki (термин Таненбаума) Как отражено в ТЗ
Message queue systems: guaranteed delivery, persistence, load balancing §6.1, §7.1, §12.1
Fault tolerance: redundancy, failure models §6.1, §7.5
RPC / timeouts: retry semantics, idempotency §7.4, §7.5, §12.1
Eventual consistency, replay, compensation §5.5, §12.3
Security: threats, encryption, audit, DoS §8, §12.4
Scalability: fallacies of distributed computing, cache/TTL §6.2, §12.2

В §1.2 документ ссылается на wiki: middleware вместо point-to-point, failure models, семантика повторов (at-least-once и т.п.). Запрещённые предпосылки из §6.2 — fallacies of distributed computing: «the network is reliable», «latency is zero», «topology never changes».

Методика

Заземлить агента на конкретную авторитетную книгу по предметной области.

  1. 1. Выбор книги. Под архитектуру / хайлоад / событийку — Таненбаум, «Распределённые системы: принципы и парадигмы». Это уровень «как Котлер у маркетологов»: жёсткий сопромат с формулами.
  2. 2. Нарезка в wiki. Пайплайн olw (obsidian-llm-wiki): fast-модель на ingest, heavy на compile. На текущем прогоне по Таненбауму: 30 source-чанков → 116 concept-страниц в .drafts/.
  3. 3. Параметры. Несколько итераций по чанкам / токенам / моделям. Стоимость полного прогона — порядка $1.5 через OpenRouter. Три прогона olw дали 16 + 14 + 23 note(s).
  4. 4. Подкладка в проект. Wiki кладётся в репозиторий. Агент ходит по индексу — через hybrid-search MCP (разбор #02) либо индексацию Cursor. Контекст не деградирует: агент бегает по файлам, не загружая книгу целиком в окно.
  5. 5. Агентный слой поверх поиска. Wiki + retrieval — инфраструктура. Поверх — query routing, интерпретация scores, traversal от бизнес-требования к паттерну. Запросы формулируются в терминах автора:
    Плохой запрос Хороший запрос (термин автора + plain language)
    «найди что-то про Kafka» reliable multicast + FIFO ordering — порядок доставки и надёжная рассылка
    «как синхронизировать заказы» persistent vs transient communication — очередь хранит vs получатель online сейчас
    «гарантии доставки» AMQP: unsettled → settled → forgotten — три состояния фиксации доставки
  6. 6. Эффект. Планы работ, API-контракты, инфраструктурные решения и вайб-кодинг идут через оптику книги. Уровень держится «с одного промпта».

Механика переносима: wiki — текст, копируется между проектами. Под разные фазы — разные книги: «Чистый код» на разработке, Фаулер на ревью, Савин на QA.

Анатомия vault'а: три слоя

Реальная структура каталога tanenbaum/wiki/:

tanenbaum/wiki/
├── raw/tanenbaum-full_rag_00012.md            # чанк книги + YAML
├── wiki/sources/Tanenbaum Full_Rag_00012.md   # summary + Concepts
├── wiki/.drafts/Передача сообщений.md          # concept-статья
├── wiki/index.md                               # индекс 30 источников
├── wiki/log.md                                 # журнал прогонов olw
└── wiki.toml                                   # модели, ctx, language

Слой 1 — raw-чанк

rag_chunk: 12
rag_total_chunks: 30
rag_chunk_size: 51542
rag_overlap: 800

Слой 2 — source-страница

Concepts (оглавление чанка у автора): IBM WebSphere MQ, message channels, routing tables, message transmission — агент видит индекс до чтения полного текста.

Слой 3 — concept-статья

Фрагмент wiki/.drafts/Передача сообщений.md:

Системы очередей сообщений обеспечивают гарантированную доставку,
приоритеты, ведение журналов, [[балансировку нагрузки]] и [[отказоустойчивость]]
[[Tanenbaum Full_Rag_00012]].

Процесс передачи сообщений в [[AMQP]] включает три этапа:
1. Сообщение в "неустановленном состоянии" на отправителе и сервере.
2. Получатель обработал → "установленное состояние".
3. Отправитель забывает о сообщении, получатель формально отмечает settled
   [[Tanenbaum Full_Rag_00012]].

## See Also
[[Модели с ориентацией на сообщения]] · [[Двухфазный протокол фиксации]]
· [[Tanenbaum Full_Rag_00012]]

Перекрёстные ссылки важны: агент идёт от «заказы не должны теряться» к persistent communication (очередь хранит сообщение), дальше к состояниям доставки AMQP (unsettled → settled), и только потом — к Kafka/RabbitMQ как реализации.

Frontmatter + quality flags:

confidence: 0.35
status: draft
sources:
  - raw/tanenbaum-full_rag_00012.md

<!-- olw-auto: low-confidence (0.35) — verify before publishing -->
<!-- olw-auto: single-source — cross-reference recommended -->

Параметры прогона

Из wiki.toml реального vault'а:

fast = "google/gemini-2.0-flash-lite-001"   # ingest
heavy = "google/gemini-2.5-flash"           # compile
fast_ctx = 24000                            # ≈ 12k символов на чанк
max_concepts_per_source = 25
language = "ru"

Пайплайн olw: raw/ → ingest → compile → lint → approve. Команда: olw run.

Артефакт

Инструмент: obsidian-llm-wiki (форк) — локальный пайплайн Karpathy-style LLM Wiki.

olw init my-book-wiki
# положить чанки в raw/
olw run
Подпись серии

Где ломается

Для кого и почему

Если вы строите AI-assisted разработку и хотите, чтобы агент держал архитектурный уровень без напоминаний — методика переносима на любую предметную область. Bottleneck здесь не код: это выбор правильного первоисточника и дисциплина его применения.

Хотите такую планку в архитектурной работе вашей команды?

Постановка AI-assisted разработки так, чтобы агент проектировал на уровне первоисточника, а не «средней температуры по интернету».

Написать на почту

Другие разборы

Серия инженерных разборов: реальная задача → методика → работающий артефакт → честный разбор, где он ломается.

К серии →