Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

Архитектура LLM-систем: как избежать трех типовых ошибок, приведших к громким ИИ-инцидентам

Разбираем три реальных ИИ-инцидента 2026 года: выдуманные источники в отчете Deloitte, ложное распознавание номеров Flock и массовое удаление подписок GPT-агент

Коротко

Что будет в материале

  1. 01

    Введение: почему «умная» модель не спасет от провала

  2. 02

    Три громких инцидента 2026 года: анатомия ошибок

  3. 03

    Архитектурные антидоты: как предотвратить каждый тип ошибки

  4. 04

    Выбор подхода: structured outputs vs. function calling и другие нюансы

Введение: почему «умная» модель не спасет от провала

В 2026 году три громких инцидента с искусственным интеллектом попали в заголовки деловых и технических изданий. Аналитический отчет Deloitte со ссылками на несуществующие исследования, система распознавания номеров Flock, отправившая штраф невиновному человеку, и GPT-агент, массово удаливший платные подписки пользователей. Во всех трех случаях расследование показало одно и то же: модели работали штатно, а катастрофа произошла из-за ошибок проектирования системы вокруг них.

Корень проблем - отсутствие детерминированного контроля на границах системы, валидации данных и принципа минимальных привилегий. LLM выдали вероятностный результат, а архитектура безоговорочно приняла его за истину. Этот текст - не разбор новостей, а инженерный анализ: какие архитектурные решения должны были предотвратить каждый инцидент, и как реализовать их с помощью Claude API. Вы получите конкретные паттерны кода для structured outputs, citations, human-in-the-loop и ограничения прав инструментов.

Основной вывод, к которому мы придем: инвестиции в архитектурную грамотность команды и защитные слои вокруг LLM дают больший прирост надежности, чем переход на следующую, «более умную» модель. Галлюцинации и неожиданное поведение - не баги модели, а симптомы архитектурного дефицита.

Три громких инцидента 2026 года: анатомия ошибок

Три кейса образуют почти полный спектр типовых провалов LLM-систем: проблема на входе в контекст, проблема на выходе из модели и проблема с действиями агента во внешнем мире. Разберем каждый.

Выдуманные источники в отчете Deloitte: отсутствие citations и валидации

В начале 2026 года Deloitte выпустил аналитический отчет по рынку полупроводников. Документ содержал десятки ссылок на исследования и статистические выкладки. Через две недели после публикации сторонний аналитик обнаружил: часть источников просто не существует. LLM, задействованная в подготовке отчета, сгенерировала правдоподобные названия статей и имена авторов, а конвейер публикации не проверил их существование.

Архитектурная ошибка: модель возвращала свободный текст без обязательной привязки утверждений к верифицируемым источникам. Не было ни structured outputs с полем citations, ни пост-обработки с проверкой ссылок через API научных баз. Система не различала «модель уверенно заявила» и «факт подтвержден».

Схожий паттерн мы разбирали в статье про верификацию в LLM-агентах: агент-скептик и воспроизводимые тесты превращают демо в надежный инструмент. Для аналитических систем это означает обязательную трассировку каждого утверждения до источника.

Ложное распознавание номеров Flock: слепое доверие к выводу модели

Система Flock, используемая для автоматической фиксации нарушений, распознала номер автомобиля с ошибкой в одном символе. Результат ушел в систему штрафов без дополнительной проверки. Водитель получил постановление за нарушение, которого не совершал, и потратил недели на обжалование.

Архитектурная ошибка: вывод LLM не проходил детерминированную валидацию. Формат номера проверяется регулярным выражением за микросекунды. Принадлежность номера к региону и марке автомобиля верифицируется через API базы данных. Ни один из этих дешевых и быстрых шагов не был встроен в пайплайн. Система слепо доверяла вероятностному выводу модели.

Массовое удаление подписок GPT-агентом: нарушение принципа минимальных привилегий

Агент на базе GPT, развернутый SaaS-платформой для автоматизации поддержки, получил запрос от оператора: «очисти тестовые подписки из базы». Агент неправильно интерпретировал контекст и удалил все активные подписки платящих пользователей. Восстановление заняло несколько суток.

Архитектурная ошибка: двойное нарушение. Во-первых, агент имел права на удаление данных в production-базе - это прямое нарушение принципа минимальных привилегий. Для задачи очистки тестовых данных ему требовался доступ только на чтение и запись в изолированное тестовое окружение. Во-вторых, отсутствовал human-in-the-loop для необратимых операций: агент должен формировать предложение действия, а исполнять его - только после подтверждения человеком. Тема ограничения tool calls для AI-агентов детально раскрыта в материале про enterprise guardrails на примере StarGuard AI.

Архитектурные антидоты: как предотвратить каждый тип ошибки

Три инцидента - три архитектурных решения. Каждое реализуемо с помощью Claude API и минимальной обвязки на Python.

Structured outputs и citations: лекарство от галлюцинаций

Claude API поддерживает режим structured outputs - модель возвращает JSON, соответствующий заданной схеме, а не свободный текст. Для аналитических систем схема должна включать обязательное поле sources с массивом ссылок на верифицируемые источники.

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="Ты - аналитик. Каждое утверждение должно сопровождаться источником.",
    messages=[{"role": "user", "content": "Опиши тренды рынка полупроводников в 2026 году"}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "type": "object",
            "properties": {
                "claims": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "statement": {"type": "string"},
                            "sources": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "title": {"type": "string"},
                                        "doi": {"type": "string"},
                                        "url": {"type": "string"}
                                    },
                                    "required": ["title"]
                                }
                            }
                        },
                        "required": ["statement", "sources"]
                    }
                }
            },
            "required": ["claims"]
        }
    }
)

result = response.content[0].text
# Далее: валидация каждого источника через API CrossRef или Semantic Scholar

Схема заставляет модель явно указывать источники для каждого утверждения. Следующий шаг - пост-валидация: скрипт проверяет DOI через CrossRef API и помечает несуществующие источники. Модель остается генеративной и вероятностной, но архитектура добавляет детерминированный слой проверки.

Детерминированная валидация на границах: не доверяй, а проверяй

Вывод LLM - это гипотеза, а не факт. Система обязана проверить гипотезу по жестким правилам до того, как результат уйдет потребителю. Для кейса Flock пайплайн выглядит так:

import re
import anthropic

client = anthropic.Anthropic()

# Шаг 1: получаем номер от модели
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=256,
    messages=[{
        "role": "user",
        "content": "Распознай номер автомобиля на изображении: [base64_image]"
    }]
)

raw_plate = response.content[0].text.strip()

# Шаг 2: детерминированная валидация формата
PLATE_PATTERN = r'^[АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}\d{2,3}$'

if not re.match(PLATE_PATTERN, raw_plate):
    raise ValueError(f"Номер {raw_plate} не соответствует формату РФ")

# Шаг 3: верификация через внешний API
def verify_plate_against_database(plate: str) -> bool:
    # Запрос к API ГИБДД или коммерческому сервису
    response = external_api.check(plate)
    return response.get("exists", False)

if not verify_plate_against_database(raw_plate):
    # Отправляем на ручную проверку, а не выписываем штраф
    send_to_human_review(raw_plate)
else:
    issue_fine(raw_plate)

Модель выполняет творческую часть - распознавание с учетом шума, ракурса, освещения. Детерминированный слой проверяет результат по формальным критериям. Два дешевых шага - regex и API-запрос - предотвращают ложное обвинение.

Human-in-the-loop и минимальные привилегии: контроль для критических действий

Агент не должен иметь прав на необратимые операции. Архитектурный паттерн: агент генерирует предложение действия, система ставит его в очередь на аппрув, и только после подтверждения человеком действие исполняется с минимально необходимыми правами.

import json
import anthropic

client = anthropic.Anthropic()

# Шаг 1: агент анализирует запрос и предлагает действие
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=512,
    system="Ты - агент поддержки. Ты можешь предлагать действия, но не исполняешь их.",
    messages=[{"role": "user", "content": "Очисти тестовые подписки из базы"}],
    tools=[
        {
            "name": "propose_action",
            "description": "Предложить действие для подтверждения оператором",
            "input_schema": {
                "type": "object",
                "properties": {
                    "action_type": {"type": "string", "enum": ["delete", "update", "read"]},
                    "target": {"type": "string"},
                    "filter": {"type": "string"},
                    "reasoning": {"type": "string"}
                },
                "required": ["action_type", "target", "filter", "reasoning"]
            }
        }
    ]
)

# Шаг 2: предложение попадает в очередь на аппрув
proposal = json.loads(response.content[0].text)
approval_queue.add(proposal, created_by="gpt-agent")

# Шаг 3: человек подтверждает - и только тогда выполняется действие
# с минимальными привилегиями (read-only доступ к production, write - к test)
def execute_approved_action(proposal, approved_by: str):
    if proposal["action_type"] == "delete":
        # Проверяем, что цель - тестовое окружение
        if "test" not in proposal["target"]:
            raise PermissionError("Удаление разрешено только в тестовом окружении")
        test_db.delete(proposal["filter"])
        log(f"Удаление выполнено {approved_by} на основе предложения агента")

Паттерн разделяет генерацию намерения и исполнение. Агент работает в контуре «предложи», человек - в контуре «подтверди», а исполняющий код имеет жестко ограниченные права. Даже если агент ошибается в интерпретации запроса, ущерб ограничен необходимостью человеческого подтверждения.

Принцип минимальных привилегий реализуется на уровне инструментов: агент для биллинга получает доступ только на чтение данных о подписках, но не на их изменение. Инструмент delete_subscription просто не включается в список доступных агенту tools. Это архитектурное решение, а не промпт-инжиниринг.

Выбор подхода: structured outputs vs. function calling и другие нюансы

Structured outputs в Claude API и function calling в OpenAI решают схожие задачи - получение структурированного ответа от модели. Разница в гарантиях и удобстве.

Structured outputs Claude API гарантирует, что ответ модели будет соответствовать заданной JSON-схеме. Модель физически не может вернуть текст, нарушающий структуру - это обеспечивается на уровне инференса через constrained decoding. Function calling OpenAI дает схожий результат, но через механизм вызова функций: модель возвращает аргументы для функции, а не произвольную структуру.

Когда использовать structured outputs: аналитические отчеты, извлечение сущностей, генерация структурированных документов - везде, где важна схема данных. Когда использовать function calling: интеграция с внешними API, где модель выбирает действие и параметры - звонок к базе данных, поиск, отправка сообщения.

Критическое ограничение: structured outputs гарантирует форму, но не истинность содержания. Модель вернет корректный JSON с полем sources, но источники могут быть выдуманными. Валидация содержания - отдельный архитектурный слой, который нельзя пропускать.

Внедрение в процесс разработки: от архитектуры к культуре

Архитектурная грамотность команды - не разовая акция, а процесс. Три практики, которые стоит встроить в цикл разработки LLM-систем.

Обязательное ревью архитектуры для каждого компонента, взаимодействующего с LLM. Чек-лист из трех вопросов: где детерминированная валидация вывода, какие права у агента, есть ли human-in-the-loop для необратимых действий. Ревью проводит инженер, не участвовавший в написании кода - свежий взгляд ловит слепые зоны.

Тестирование на adversarial inputs: подача на вход заведомо провокационных запросов, которые могут сбить модель. «Очисти все подписки» вместо «очисти тестовые подписки», изображение с номером, частично закрытым грязью, запрос на генерацию отчета по несуществующей теме. Система должна достойно отказаться или запросить уточнение, а не выполнить опасное действие.

Мониторинг аномалий в выводах: отслеживание распределения типов действий агента, процента отказов валидации, количества предложений, отправленных на human-in-the-loop. Резкий рост любого из этих показателей - сигнал о проблеме в модели или архитектуре. Тема скрытых издержек плохой архитектуры раскрыта в статье про технический долг в эпоху AI: архитектурная энтропия экспоненциально увеличивает затраты на контекст и верификацию.

Заключение: защитные слои как стандарт индустрии

Три инцидента 2026 года - Deloitte, Flock, GPT-агент - лишь публичные случаи системных проблем. С ростом внедрения LLM в критическую инфраструктуру количество ошибок будет расти пропорционально количеству развернутых систем, а не качеству моделей.

Единственный способ переломить тренд - строить системы с детерминированным контролем на границах, обязательной валидацией данных и минимальными привилегиями для агентов. Structured outputs, citations, human-in-the-loop и ограничение прав инструментов - не опциональные фичи, а минимальный набор защитных слоев для любой LLM-системы, взаимодействующей с реальным миром.

Проведите аудит своих систем по чек-листу из этой статьи. Проверьте, где вывод модели принимается на веру без валидации. Проверьте, какие права имеют ваши агенты. Добавьте human-in-the-loop для необратимых операций. Инвестиции в эти архитектурные практики окупаются предотвращением одного инцидента. А один инцидент, как показывают кейсы 2026 года, стоит дороже любого рефакторинга.

Подписаться на канал