Разбираю «Qwen3.5-21B-Claude-4.6-Opus-Heretic-Uncensored»: что на самом деле внутри файнтюна с громким именем

от автора

Технический разбор модели, которую в телеграме продают как «Claude без цензуры»

В моей ленте недавно завирусился пост: якобы кто-то «дообучил Qwen 3.5 до уровня Claude 4.6 Opus, убрал цензуру через Heretic и получил настоящего монстра». Звучит сенсационно. Я зашёл на HuggingFace, открыл карточку модели и провёл вечер, разбираясь, что там реально под капотом.

Спойлер: внутри много интересной техники, но к Claude эта модель имеет такое же отношение, как кроссовки с надписью «Adibas» к Adidas. Ниже расскажу, что действительно сделал автор, что такое abliteration и Heretic с инженерной точки зрения, и как читать названия файнтюнов на HuggingFace, чтобы не вестись на маркетинг.


Что заявлено и что на самом деле

Полное имя модели: Qwen3.5-21B-Claude-4.6-Opus-Deckard-Heretic-Uncensored-Thinking. Автор — DavidAU, известный в сообществе мерджер моделей.

Пройдусь по каждой части имени и переведу её на технический язык.

Qwen3.5 — базовая модель от Alibaba Cloud. Это open-weights LLM, всё честно.

21B — заявленное число параметров. Но базовый Qwen3 идёт в размерах 0.6B, 1.7B, 4B, 8B, 14B, 32B, 235B. Размер 21B — это не оригинальный размер семейства. Получают его через depth upscaling: берут модель меньшего размера (обычно 14B) и склеивают слои так, чтобы общее число параметров выросло. Метод известный, описан в статье SOLAR 10.7B от Upstage. Работает, но никаких «новых знаний» добавить не может — это просто архитектурная манипуляция с весами, которые уже есть.

Claude-4.6-Opus — а вот это самая интересная часть имени. К Claude отношения никакого нет. Веса Claude закрытые, Anthropic их не публикует. Что реально стоит за этой надписью: автор файнтюнил Qwen на синтетическом датасете, который сгенерирован запросами к Claude. То есть модель не «дообучена до уровня Claude», она дообучена на ответах Claude. Это distillation в самом простом смысле — попытка заставить ученика имитировать стиль учителя через обучение на его выходах. Качество такого подхода зависит от объёма и качества датасета, и обычно даёт улучшение в стиле и форматировании, но никак не повторяет capabilities исходной модели.

В тегах модели видно отсылку к датасету TeichAI/claude-4.5-opus-high-reasoning-250x — судя по всему, оттуда и пришло «Claude 4.6 Opus» в названии.

Deckard — отсылка к персонажу Филипа К. Дика, тег указывает на датасет DavidAU/PkDick-Deckard-5-Datasets. Это файнтюн на текстах в стилистике Дика для творческого письма. К capabilities не имеет отношения, влияет только на стиль вывода в художественных задачах.

Heretic-Uncensored — здесь применили abliteration. Это технический процесс снятия отказов модели на «опасные» запросы. Подробнее ниже.

Thinking — модель умеет генерировать reasoning-цепочки в тегах <think>...</think>, как DeepSeek-R1 и OpenAI o1. Это либо встроено в базовый Qwen3 (он действительно поддерживает thinking-режим), либо допилено через файнтюн.

Итого реальное описание: depth-upscaled Qwen3 14B → файнтюн на синтетических данных от Claude → файнтюн на художественных текстах → abliteration через Heretic → пакетирование с поддержкой thinking-режима.

Звучит уже не так громко, правда?


Что такое abliteration с технической точки зрения

Это самая интересная часть всей истории, и здесь стоит остановиться подробно.

В декабре 2023 года команда исследователей (Arditi, Obeso, Syed et al.) опубликовала работу, которая позже легла в основу статьи в NeurIPS 2024 — «Refusal in Language Models Is Mediated by a Single Direction». Идея простая, но красивая.

Когда современная LLM получает запрос, нарушающий её guidelines, она генерирует отказ. На уровне архитектуры это значит, что в какой-то момент в residual stream трансформера активируется паттерн, который смещает распределение выходных токенов в сторону «I cannot help with that». Авторы показали, что в большинстве моделей этот паттерн представляется одним конкретным направлением в пространстве активаций — refusal direction.

Алгоритм его поиска такой:

  1. Берёшь набор harmful-промптов (которые модель отклоняет) и harmless-промптов (которые она выполняет).

  2. Прогоняешь оба набора через модель, снимаешь активации residual stream на каждом слое.

  3. Считаешь среднее активаций для harmful и harmless отдельно. Разница векторов — это и есть refusal direction. Дальше — самое интересное. Можно либо инвертировать это направление при инференсе (steering), либо перманентно убрать его проекцию из весов модели. Второй метод и называется abliteration. Технически это weight orthogonalization: для каждой матрицы весов, которая пишет в residual stream, проецируется и вычитается компонента вдоль refusal direction.

Псевдокод выглядит так:

def abliterate_weight_matrix(W, refusal_dir):    """Убирает проекцию весов на направление отказа."""    # refusal_dir должен быть нормализован    refusal_dir = refusal_dir / refusal_dir.norm()        # Проекция каждой строки W на refusal_dir    projection = W @ refusal_dir.unsqueeze(-1) * refusal_dir        # Вычитаем проекцию из исходных весов    return W - projection  # Применяется ко всем матрицам, пишущим в residual:# attention out_proj, MLP down_proj, embed_tokens, etc.for layer in model.layers:    layer.self_attn.o_proj.weight.data = abliterate_weight_matrix(        layer.self_attn.o_proj.weight.data, refusal_dir    )    layer.mlp.down_proj.weight.data = abliterate_weight_matrix(        layer.mlp.down_proj.weight.data, refusal_dir    )

После такой операции модель физически теряет способность активировать отказ, потому что соответствующее направление в её представлениях стало нулевым.

Heretic — это инструмент, который автоматизирует весь этот пайплайн. По сути, обёртка над методом Arditi с удобным API: загружаешь модель, даёшь два набора промптов, получаешь модифицированные веса. На GitHub достаточно много форков и реализаций.

Важный нюанс. Abliteration — не безболезненная операция. Удаление направления из весов сужает пространство представлений модели, что сказывается на общем качестве. Замеры на open benchmarks (MMLU, GSM8K, HumanEval) обычно показывают просадку на 1–5% после abliteration. Для chat-сценариев это незаметно, для математики и кода — заметно.

Ещё момент: abliteration снимает только те отказы, которые завязаны на найденное направление. Если отказ реализуется через другой механизм (например, distribution shift в специфических контекстах), он останется. Поэтому «Uncensored» в названии — это маркетинг. Точнее было бы «Refusal-direction-orthogonalized», но для громкого имени не подходит.


Что не так с примером, который автор сам поместил в карточку

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

И вот тут начинается интересное. Я физик не профессиональный, но школьную программу помню. Что я увидел в выводе модели:

В блоке <think> модель пишет: «The Stefan-Blackmann-Weinmann equation relates radiated power: P = εσC(T² − T²)».

Это выдумка. Уравнение Стефана-Больцмана, которое описывает излучение абсолютно чёрного тела, выглядит так: P = εσAT⁴. Степень — четвёртая, не вторая. Никакого Вайнмана в названии нет. Площадь обозначается обычно A, не C. Само выражение T² − T² тождественно равно нулю — модель явно пыталась написать что-то вроде (T₁² − T₂²), но потеряла индексы и не заметила.

Дальше модель приводит численные значения:

«σ = Stefan-Blackmann constant (2.378 × 10⁻³ K⁻³)»

Реальное значение постоянной Стефана-Больцмана: 5.670 × 10⁻⁸ Вт/(м²·К⁴). Размерность — четвёртая степень Кельвина в знаменателе и метр в квадрате в числителе, потому что закон Стефана-Больцмана даёт мощность с единицы площади. У модели в ответе всё неправильно: и значение, и порядок, и размерность.

Дальше идут таблицы с показателями эффективности и капитальными затратами. Числа выглядят правдоподобно, но при ближайшем рассмотрении не сходятся между собой. Например, в одной таблице сказано «Annual savings: 81.50», в следующей — «50,000–70,000» для аналогичной площади. Разница в 600 раз без объяснения.

В разделе про географическую применимость в одной строке указан «Arctic» с потенциалом 20–40 W/m², в этой же таблице помечено (A) рядом с десертом и Арктикой одновременно — модель просто скопипастила обозначение.

Это типичные галлюцинации LLM, ничего нового. Но критично здесь не то, что модель ошибается — все модели ошибаются. Критично, что автор разместил именно этот вывод как демонстрацию возможностей своей «Claude 4.6 Opus». Если такая планка показывается как лучший пример работы — реальный уровень модели я бы оценивал ниже базового Qwen3 14B.


Почему 21B параметров — это не «улучшение»

Вернусь к depth upscaling, про который писал в начале. Метод выглядит примерно так:

# Берём базовую модель с 24 слоямиbase_model = load_model("Qwen3-14B")  # допустим, 24 transformer-блока # Создаём расширенную версию через дублирование слоёвupscaled_layers = []upscaled_layers.extend(base_model.layers[:16])  # первые 16 слоёв как естьupscaled_layers.extend(base_model.layers[8:24])  # слои 8-24 копируем# Получили 32 слоя, число параметров выросло пропорционально

После такого «расширения» модель работает, но качество без файнтюна сильно падает — границы между склеенными блоками рвут информационный поток. Поэтому upscaled-модели всегда требуют дополнительного continued pretraining на больших объёмах данных.

В случае с этой моделью я не нашёл в карточке информации о том, проводился ли continued pretraining после upscaling, или сразу пошёл файнтюн на узких датасетах. Если второе — это значит, что модель технически «толще» базового Qwen3 14B, но работает скорее всего не лучше. Лишние параметры просто занимают видеопамять.

Эмпирическое правило для такой техники: SOLAR 10.7B действительно работал лучше базы благодаря качественному continued pretraining от Upstage. Большинство любительских франкенмерджей — нет.


Как читать имена моделей на HuggingFace

Раз уж разобрали этот случай, расскажу про практическую сторону: как не вестись на маркетинговые названия в открытой экосистеме.

Признак 1: Имя называет проприетарную модель. Если в названии файнтюна Llama или Qwen есть «GPT-4», «Claude», «Gemini-Pro» — почти всегда это значит, что модель обучали на ответах этой проприетарной системы, а не «достигли её уровня». Веса GPT-4 и Claude закрыты, технически воспроизвести их невозможно.

Признак 2: Преувеличенный размер параметров. Размеры, которые не входят в стандартный модельный ряд семейства (например, 21B для Qwen3), почти всегда получены через upscaling или франкенмердж. Это не плохо само по себе, но и не «улучшение».

Признак 3: Стопка хайповых тегов. «Uncensored-Thinking-Reasoning-Coding-Creative-Writing-AGI» — чем больше способностей перечислено в имени, тем меньше вероятность, что модель действительно сильна в каждой из них. Узкие файнтюны обычно хорошо работают на одном-двух доменах и теряют качество на остальных.

Признак 4: Отсутствие бенчмарков. Серьёзные модели публикуют замеры на стандартных бенчмарках (MMLU, ARC, HellaSwag, GSM8K, HumanEval). Если в карточке только «WARNING: This model has character and intelligence», это маркетинг.

Что стоит проверять перед использованием:

  • Лицензию (apache-2.0 — ок, AGPL — внимательно к коммерческому использованию).

  • Дату обновления (живой проект, заброшенный, разовая публикация).

  • Раздел Community для сообщений о проблемах от пользователей.

  • Файлы конфигурации config.json — там видно реальную архитектуру и число слоёв.

  • Размер safetensors-файлов — позволяет оценить, действительно ли там заявленное число параметров.


Где такая модель реально применима

Несмотря на всю критику, у подобных файнтюнов есть законная ниша. Назову прямо.

Художественное письмо без ограничений. Если вы пишете тёмное фэнтези, нуар, боевик с насилием — стандартные коммерческие модели часто отказываются работать со сценами, которые в литературе абсолютно нормальны. Файнтюны с abliteration этого ограничения лишены. Качество стилистики у них обычно посредственное, но как генератор черновиков для последующей правки — рабочий вариант.

Локальный inference без облака. Для людей, которым принципиально, чтобы запросы не уходили на серверы Anthropic или OpenAI, локальные модели с GGUF-квантизацией под llama.cpp — единственный путь. Тут Qwen3 в любом виде лучше, чем ничего.

Эксперименты с reasoning-режимом. Поддержка <think> тегов — это интересная фича, которую можно изучать локально без оплаты API.

Чего я бы не делал с такой моделью:

  • Не использовал бы для задач, требующих фактической точности (как видно из примера про физику, галлюцинации серьёзные).

  • Не стал бы её рекомендовать тем, кто ищет «бесплатную замену Claude» для рабочих задач — этой замены не существует ни в каком виде.

  • Не стал бы доверять reasoning-выводам для математики или кода без проверки.


Вывод

«Qwen3.5-21B-Claude-4.6-Opus-Deckard-Heretic-Uncensored-Thinking» — это аккуратный пример того, как в open-weights экосистеме маркетинговое имя расходится с технической реальностью. Под капотом там законные техники: distillation на синтетических данных, depth upscaling, abliteration через Heretic, файнтюн на художественных текстах. Каждая из них имеет смысл и применение.

Но «конкурент Claude 4.6 Opus» из этого не получается, и не может получиться в принципе. Сравнение с фронтирной коммерческой моделью на 1B+ долларов обучения и закрытыми весами — это уровень рекламной обёртки, не технической реальности.

Полезное, что я взял из этой истории: сам метод Arditi с refusal direction — красивая работа по интерпретируемости. Стоит почитать оригинальную статью на arXiv (2406.11717) и посмотреть, как он применим в задачах безопасности и evaluation. А вот «годзиллу» из телеграма я бы поставил себе только для эксперимента — и точно не для прода.


Ссылки:

ссылка на оригинал статьи https://habr.com/ru/articles/1032324/