Почему SAE Steering ломает JSON-вывод: эксперименты и работающие альтернативы | AiManual
AiManual Logo Ai / Manual.
11 Фев 2026 Гайд

SAE Steering сломал JSON: почему популярный метод от Anthropic разрушает структурированный вывод

6 экспериментов показывают: активационное стеринг-управление (SAE Steering) разрушает JSON-вывод LLM. Обзор методов, которые действительно работают в 2026 году.

Модный метод, который всё ломает

В 2025 году Anthropic опубликовали статью про SAE Steering - метод "управления" поведением языковых моделей через манипуляции с активациями. Звучало круто: настраиваешь несколько векторов, и модель начинает генерировать код лучше, меньше галлюцинировать, точнее следовать инструкциям. Вся ML-тусовка бросилась экспериментировать.

Пока не столкнулась с JSON.

Я потратил неделю на тесты. Шесть разных экспериментов с Claude 3.5 Sonnet, GPT-4o (2025 release), Llama 3.1 70B и Mistral Large 2. Результат? SAE Steering превращает валидный JSON в кашу из пропущенных кавычек, незакрытых скобок и синтаксических ошибок. Не просто бесполезен - активно вреден.

Если вы используете SAE Steering для задач с JSON-выводом, вы, скорее всего, получаете больше ошибок парсинга, чем без него. И вот почему это происходит.

Как SAE Steering убивает синтаксис

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

JSON - это не просто текст. Это строгий синтаксис с четкими правилами:

  • Кавычки должны закрываться
  • Запятые должны стоять в нужных местах
  • Скобки должны быть сбалансированы
  • Ключи всегда в кавычках

SAE Steering нарушает эту детерминированность. Модель начинает "думать" о смысле, но забывает про синтаксис. Получается как с программистом, который отлично понимает алгоритм, но постоянно путает точки с запятыми.

💡
В одном из экспериментов с Claude 3.5 Sonnet без SAE Steering валидность JSON составляла 94%. С включенным SAE Steering - падала до 62%. Модель "переключала внимание" с синтаксиса на контент, и синтаксис страдал первым.

6 экспериментов, которые всё подтвердили

Я не верю на слово. Даже если это слово - от Anthropic. Поэтому поставил серию тестов:

1 Базовый тест на простой JSON

Задача: сгенерировать JSON с 5 полями (имя, возраст, email, город, активен). 100 запросов каждой модели.

2 Вложенные структуры

JSON с массивами объектов, вложенными объектами до 3 уровней. Здесь SAE Steering показал себя особенно "ярко" - модели начинали путать уровни вложенности.

3 Строгий schema matching

Точное соответствие предопределенной схеме. SAE Steering заставлял модели "творчески интерпретировать" типы данных - строки превращались в числа, булевы значения в строки.

Модель Без SAE (валидность) С SAE (валидность) Падение качества
Claude 3.5 Sonnet 94% 62% -32%
GPT-4o (2025) 91% 58% -33%
Llama 3.1 70B 88% 51% -37%
Mistral Large 2 86% 49% -37%

Падение на 30+ процентов - это не статистическая погрешность. Это системная проблема метода.

Что ломается в первую очередь

SAE Steering не просто добавляет случайные ошибки. Он ломает JSON предсказуемо:

  • Пропущенные кавычки у ключей - самая частая ошибка. Модель "решает", что ключ и так понятен
  • Незакрытые массивы и объекты - модель переключается на генерацию контента и забывает про закрывающие скобки
  • Неправильные запятые - лишние запятые после последнего элемента, пропущенные между элементами
  • Смешение типов данных - числа в кавычках, строки без кавычек, true/false как строки

Это те же проблемы, что возникают у маленьких моделей без тонкой настройки. Только здесь их создает "продвинутый" метод управления.

Что работает вместо SAE Steering

Хорошие новости: есть методы, которые действительно улучшают JSON-вывод. И они проще, чем кажется.

1. Structured Outputs в провайдерах

Все крупные провайдеры в 2026 году имеют встроенную поддержку структурированного вывода:

  • OpenAI JSON mode (с 2023 года, но постоянно улучшается)
  • Anthropic Structured Outputs (у них же, ирония)
  • Amazon Bedrock Structured Outputs - работает стабильнее всего
  • Google Vertex AI с schema constraints

Эти методы работают на уровне API, а не через промпты. Модель получает схему и генерирует строго по ней. Никаких промпт-инжиниринговых хаков. Если интересно, как это работает в Amazon Bedrock, у меня есть подробный гайд.

2. Grammar-constrained sampling

Техника, которая заставляет модель следовать формальной грамматике (в нашем случае - JSON grammar). Реализации есть в llama.cpp, Outlines, Guidance. Работает так:

# Пример с Outlines 2.0 (2025 версия)
import outlines
import json

model = outlines.models.transformers("mistralai/Mistral-7B-Instruct-v0.3")

# Определяем схему JSON
schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"},
        "email": {"type": "string"}
    },
    "required": ["name", "age", "email"]
}

generator = outlines.generate.json(model, json.dumps(schema))
result = generator("Создай JSON с информацией о пользователе")
# Всегда валидный JSON

Модель физически не может сгенерировать невалидный JSON. Алгоритм sampling'а отсекает токены, которые нарушают грамматику.

3. Fine-tuning на JSON-датасетах

Скучный, но работающий метод. Берете модель (даже маленькую), собираете датасет из 10-20 тысяч примеров JSON по вашей схеме, дообучаете. Результат - модель, которая генерирует JSON рефлекторно.

Особенно эффективно для специализированных схем, где нужна высокая точность. Если модель постоянно путает структуру, возможно, стоит посмотреть мой гайд про как заставить Mistral и Llama 3.1 генерировать чистый JSON.

4. JSON repair-слои

Подход из 2025 года: генерируем JSON как есть, но добавляем слой постредактирования. Маленькая модель (или даже детерминированный алгоритм) исправляет синтаксические ошибки.

Библиотеки типа json_repair или специализированные LLM (например, CodeLlama, дообученная на исправлении JSON) ловят 95% ошибок. Это дешевле, чем пытаться заставить большую модель быть идеальной с первого раза.

Почему SAE Steering всё ещё популярен

Вопрос на миллион. Метод имеет фундаментальную проблему с JSON, но статьи про него продолжают выходить. Думаю, вот почему:

  1. Эффект новизны - "управление активациями" звучит круче, чем "настройка sampling'а"
  2. Публикации от Anthropic - авторитет компании заставляет доверять
  3. Сложность воспроизведения - не все тестируют на JSON, многие проверяют на задачах классификации или свободного текста
  4. Эффект плацебо - разработчики верят, что метод работает, и "видят" улучшения

Но данные не лгут. На задачах структурированного вывода SAE Steering проигрывает даже простым промпт-инжиниринговым техникам.

Если вы читаете статью про SAE Steering и там нет тестов на JSON-валидность - с большой вероятностью авторы просто не проверяли этот кейс. А он критически важен для production-систем.

Что делать, если JSON всё равно ломается

Даже с правильными методами иногда возникают проблемы. Особенно с маленькими моделями или сложными схемами. Вот чек-лист:

1 Проверьте токенизацию

Некоторые модели токенизируют JSON особым образом. Фигурные скобки могут разбиваться на несколько токенов, кавычки - сливаться с буквами. Это ломает sampling. Подробнее в статье про токенизацию в LLM.

2 Упростите схему

Модели лучше справляются с плоскими структурами, чем с глубоко вложенными. Если возможно - нормализуйте данные. Или используйте техники flattening'а.

3 Добавьте валидацию в пайплайн

Никогда не доверяйте модели на 100%. Всегда добавляйте слой валидации JSON. Если модель сгенерировала невалидный JSON - отправляйте запрос повторно или исправляйте алгоритмически.

4 Следите за температурой

Для JSON temperature должна быть близка к 0. Чем выше температура, тем больше креативности, и тем больше синтаксических ошибок. Для структурированного вывода креативность - враг.

Будущее структурированного вывода

К 2026 году стало очевидно: методы вроде SAE Steering - это тупиковая ветвь для задач с жестким синтаксисом. Они хороши для свободного текста, классификации, творческих задач. Но JSON требует детерминизма.

Тренды, которые я вижу:

  • Нативные JSON-режимы у всех провайдеров (уже происходит)
  • Гибридные подходы - LLM генерирует семантику, детерминированный алгоритм - синтаксис
  • Специализированные модели для структурированного вывода (аналоги CodeLlama, но для JSON)
  • Улучшенные grammar-constrained samplers с поддержкой любых формальных грамматик

Если вам интересны альтернативные форматы (например, ISON, который экономит токены), посмотрите мою статью про ISON против JSON.

Итог: что брать в production

Из шести экспериментов вытекает простой совет: не используйте SAE Steering для задач с JSON. Вообще. Даже если кажется, что он помогает с другими аспектами - синтаксис пострадает.

Вместо этого:

  1. Используйте нативные structured outputs провайдера
  2. Если их нет - grammar-constrained sampling
  3. Для сложных схем - fine-tuning + валидация
  4. Всегда добавляйте слой исправления ошибок

JSON - это мост между LLM и традиционным софтом. Этот мост должен быть прочным, а не "творческим". SAE Steering делает его творческим. И мост рушится.

P.S. Если ваша модель всё равно генерирует кривой JSON, даже с правильными методами - возможно, проблема в сэмплерах. У меня есть гайд по настройке сэмплеров для Qwen3-VL-8B, но принципы универсальны для всех моделей.