Через полгода после запуска в «Ковчег» приходит запрос от регулятора: клиент обжалует отказ по кредиту, датированный 12 мая. Вопрос простой и убийственный: «Почему ИИ рекомендовал отказать?» Если у вас нет ответа — не «модель так решила», а восстановимая цепочка: какой был системный промпт, какие данные клиента подтянулись, какая версия модели отвечала, какие guardrails и политики сработали, — то high-risk-система недоказуема, а значит несоответствна.
Эта глава — про audit plane: слой, где каждое решение ИИ оставляет неизменяемый след, достаточный, чтобы его воспроизвести и объяснить регулятору, аудитору или при разборе инцидента. Без него все предыдущие плоскости контроля недоказуемы: guardrails, которые нельзя предъявить в логе, для регулятора не существуют.
Бизнес-цена
Возможность по любому решению «Ковчега» восстановить полную цепочку рассуждений и воспроизвести контекст. Обещания бизнесу:
- По
trace_idвосстанавливается всё, что определило решение. - Лог неизменяем — его нельзя переписать задним числом (иначе он бесполезен как доказательство).
- Retention и защита лога сами соответствуют GDPR (лог содержит ПДн).
Драйвер: угроза или регулятор
- EU AI Act: Art. 12 — автоматическое ведение логов на весь срок жизни high-risk; Art. 13 (прозрачность); Art. 86 (право на объяснение отдельного решения).
- GDPR: ст. 22 — объяснимость автоматизированных решений.
- Инцидент-разбор: без трейса не отличить баг промпта от дрейфа модели от атаки — три разные причины, три разных ответа.
Архитектурный паттерн
Immutable AI Trace Log Pipeline на базе OpenTelemetry GenAI Semantic Conventions — сквозной трейсинг стандартными спанами, экспорт в неизменяемое хранилище с retention-политикой.
Почему именно OTel SemConv, а не проприетарный формат: экосистема observability фрагментирована (Langfuse, Helicone, Traceloop, LangSmith — несовместимые форматы = vendor lock-in). GenAI Semantic Conventions (под эгидой CNCF) задают единый словарь: спан от LangChain-агента выглядит так же, как от голого вызова OpenAI. Оговорка честности: на середину 2026 конвенции всё ещё в статусе Development — на проде включают OTEL_SEMCONV_STABILITY_OPT_IN для двойной эмиссии (legacy + новые атрибуты), чтобы пережить переход к stable.
Инженерный стек
- Трейсинг/стандарт: OpenTelemetry + GenAI Semantic Conventions (спаны LLM-вызовов, ретрива, tool-calls; конвенции для MCP-инструментов и мульти-агентов в активной разработке).
- Бэкенды: Arize Phoenix, Langfuse, LangSmith (принимают OTel).
- Транспорт: Kafka / NATS.
- Хранилище: ClickHouse (аналитика) + immutable/WORM-слой под юридический аудит.
Инженерная реализация
Шаг 1. Сквозной trace_id
Единый id через всю цепочку: gateway → RAG + FGA → input guardrails → модель → tools → output guardrails → ответ. Тот же id — ключ mapping ПДн и бюджета.
Шаг 2. Что именно фиксируем в спанах
По GenAI SemConv + расширения под аудит:
- версия системного промпта (хэш + ссылка на версию);
- точные RAG-чанки с их distance-скорами и
source_doc_id; - raw request/response (уже с маскированными ПДн);
- аргументы вызванных функций (Tool Calling) и вердикт policy-гейта;
- версия модели/провайдера, температура, seed;
- вердикты guardrails (что сработало, что заблокировано).
Шаг 3. Экспорт в неизменяемое хранилище
app (OTel SDK) → OTLP → collector → Kafka → ┬→ ClickHouse (аналитика/дашборды)
└→ WORM/append-only (юр. аудит, retention)
Append-only слой — не «база, куда договорились не писать», а хранилище с технической невозможностью перезаписи (object-lock / WORM).
Шаг 4. Воспроизводимость
По trace_id пересобираем полный вход. При фиксированной версии модели и seed можно переиграть решение — с оговоркой из failure modes.
Шаг 5. Приватность самого лога
Аудит содержит ПДн и секреты → шифрование, доступ по ролям, отдельный TTL, который балансирует Art. 12 (хранить) против GDPR (не хранить лишнее).
Где ломается
- Недетерминизм LLM. Даже с seed воспроизводимость неполная: провайдер меняет модель «под капотом», семплинг варьируется. «Объяснение» — реконструкция контекста решения, а не буквальная причинность.
- Post-hoc рационализация. Chain-of-thought в логе — это то, что модель написала, а не обязательно то, почему она так решила. Не выдавайте CoT за причинный механизм.
- Объём и стоимость. Полный трейс с чанками — терабайты; retention под Art. 12 против бюджета ClickHouse против минимизации GDPR — тройной конфликт, решается сэмплингом детализации (полный трейс для high-risk решений, усечённый для остального).
- Лог как поверхность атаки. Аудит с ПДн и секретами — лакомая цель; его утечка хуже исходной. Защита лога — часть периметра, не афтерсот.
- Стандарт ещё не stable. SemConv в Development — атрибуты меняются; отсюда dual-emission.
Стандарты и маппинг
- EU AI Act: Art. 12 (record-keeping), Art. 13 (transparency), Art. 86 (объяснение).
- ISO/IEC 42001: логирование, мониторинг, управление инцидентами.
- NIST AI RMF: Measure/Manage — traceability.
- GDPR: ст. 22.
Лаба и артефакт
Внедрить OTel GenAI SemConv в «Ковчег», экспорт через Kafka в ClickHouse + object-lock слой; по заданному trace_id восстановить полный контекст решения из вступления; настроить retention и шифрование лога. Артефакт: схема трейс-события (атрибуты SemConv + аудит-расширения) + дашборд «разбор одного решения» + retention/защита-политика.
Чеклист зрелости
- L1: логируются raw запрос/ответ и версия модели.
- L2: OTel-трейс (SemConv) с чанками, промпт-версией и tool-аргументами в append-only хранилище.
- L3: воспроизведение решения по
trace_id, retention под AI Act, шифрование и RBAC на аудит, dual-emission на переходный период стандарта.
Источники
- OpenTelemetry GenAI Semantic Conventions (MLflow docs)
- OpenTelemetry for AI Systems: LLM & Agent Observability 2026 (Uptrace)
- How OTel traces LLM, agent reasoning, MCP tools (Greptime)
- OpenTelemetry for LLMs: SRE guide 2026 (OpenObserve)
Регулятор не спрашивает «работает ли ваша модель». Регулятор спрашивает: «докажите, что 12 мая система сделала именно то, что вы утверждаете». Без неизменяемого трейса у вас нет доказательства — есть только уверенность, которая в суде не котируется.