Модный метод, который всё ломает
В 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 нарушает эту детерминированность. Модель начинает "думать" о смысле, но забывает про синтаксис. Получается как с программистом, который отлично понимает алгоритм, но постоянно путает точки с запятыми.
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, но статьи про него продолжают выходить. Думаю, вот почему:
- Эффект новизны - "управление активациями" звучит круче, чем "настройка sampling'а"
- Публикации от Anthropic - авторитет компании заставляет доверять
- Сложность воспроизведения - не все тестируют на JSON, многие проверяют на задачах классификации или свободного текста
- Эффект плацебо - разработчики верят, что метод работает, и "видят" улучшения
Но данные не лгут. На задачах структурированного вывода 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. Вообще. Даже если кажется, что он помогает с другими аспектами - синтаксис пострадает.
Вместо этого:
- Используйте нативные structured outputs провайдера
- Если их нет - grammar-constrained sampling
- Для сложных схем - fine-tuning + валидация
- Всегда добавляйте слой исправления ошибок
JSON - это мост между LLM и традиционным софтом. Этот мост должен быть прочным, а не "творческим". SAE Steering делает его творческим. И мост рушится.
P.S. Если ваша модель всё равно генерирует кривой JSON, даже с правильными методами - возможно, проблема в сэмплерах. У меня есть гайд по настройке сэмплеров для Qwen3-VL-8B, но принципы универсальны для всех моделей.