Qwen3.5 Chat (локальный LLM)

Qwen3.5-0.8B — это гибридная модель DeltaNet (linear attention) + GatedAttention с 24 слоями (18 DeltaNet + 6 GatedAttention), квантизированная до INT4 для MLX (Metal GPU) и INT8 для CoreML (Neural Engine). Работает на Mac через MLX или на iPhone и Mac через CoreML с потоковой генерацией токенов. Создана для голосовых пайплайнов, где локальный LLM служит «мозгом» между ASR и TTS.

Готов к голосовому пайплайну

Qwen3.5 Chat интегрируется с SpeechCore VoicePipeline как LLM-компонент в цепочках ASR → LLM → TTS. Гибридная архитектура DeltaNet обеспечивает эффективное attention с линейной сложностью для длинных контекстов.

Быстрый старт

import Qwen3Chat

let chat = try await Qwen35MLXChat.fromPretrained()

// Одиночный ответ
let response = try chat.generate("What is Swift?", systemPrompt: "Answer briefly.")
print(response)

// Потоковые токены
let stream = chat.chatStream("Tell me a joke", systemPrompt: "Be funny.")
for try await token in stream {
    print(token, terminator: "")
}

Архитектура

Qwen3.5-0.8B — это гибридная модель с 24 слоями: 18 слоёв DeltaNet (linear attention с gated delta rule recurrence и RMSNormGated) и 6 слоёв GatedAttention (стандартное scaled dot-product attention). Бэкенд MLX выполняет инференс на Metal GPU с весами в safetensors. Бэкенд CoreML использует архитектуру с двумя моделями (prefill + decode), оптимизированную под Neural Engine. Оба поддерживают KV cache с кешированием подсказки и настраиваемым сэмплированием (temperature, top-k, top-p, штраф за повторения).

I/O модели

НаправлениеИмяФормаОписание
Входinput_ids[1, seq_len]Token ID (Int32)
Входattention_mask[1, seq_len]Attention-маска (Int32)
Входkv_cacheper-layerСостояние KV-кеша
Выходlogits[1, 1, 151936]Логиты следующего токена (Float16)
Выходkv_cache_outper-layerОбновлённый KV-кеш

Варианты модели

ВариантКвантизацияРазмерВычисленияHuggingFace
Qwen3.5-0.8B ChatINT4418 МБMetal GPU (MLX)aufklarer/Qwen3.5-0.8B-Chat-MLX
Qwen3.5-0.8B ChatINT8981 МБNeural Engine (CoreML)aufklarer/Qwen3.5-0.8B-Chat-CoreML

Конфигурация сэмплирования

let config = ChatSamplingConfig(
    temperature: 0.7,
    topK: 40,
    topP: 0.9,
    maxTokens: 128,
    repetitionPenalty: 1.1,
    disableThinking: false,
    maxThinkingTokens: 50
)
let response = try chat.generate("Explain gravity", sampling: config)
ПараметрПо умолчаниюОписание
temperature0.6Случайность (0 = жадный, 1 = креативный)
topK50Оставить top K кандидатов
topP0.95Порог nucleus sampling
maxTokens512Максимум токенов ответа
repetitionPenalty1.1Штраф за повторяющиеся токены
disableThinkingfalseПропустить режим размышления
maxThinkingTokens100Ограничение токенов размышления

Многошаговый диалог

let chat = try await Qwen35MLXChat.fromPretrained()

let r1 = try chat.generate("My name is Alex", systemPrompt: "Remember the user's name.")
print(r1)  // "Nice to meet you, Alex!"

let r2 = try chat.generate("What's my name?")
print(r2)  // "Your name is Alex!"

chat.resetConversation()  // Очистить историю и KV-кеш

Управление памятью

// Проверить состояние памяти
print(chat.isLoaded)        // true
print(chat.memoryFootprint) // 438304768 (~418 МБ)

// Освободить память при нагрузке
chat.unload()
print(chat.isLoaded)        // false

// Перезагрузить при необходимости
let chat = try await Qwen35MLXChat.fromPretrained()
Совет по памяти iOS

На iPhone выгрузка LLM перед инференсом TTS освобождает ~418 МБ (INT4 MLX) или ~981 МБ (INT8 CoreML), предотвращая jetsam-завершение при работе полных пайплайнов ASR → LLM → TTS.

Производительность

УстройствоPrefillDecodeТокенов/сек
M2 Max~50 мс~65 мс/ток~15 ток/с
iPhone 16 Pro~1.5 с~450 мс/ток~2.2 ток/с

Конвертация

Веса MLX конвертируются из оригинального чекпоинта Qwen3.5-0.8B через скрипт конвертации MLX. CoreML-модели используют отдельный скрипт конвертации для развёртывания на Neural Engine. Предварительно сконвертированные веса доступны на HuggingFace: aufklarer/Qwen3.5-0.8B-Chat-MLX (INT4: 418 МБ) и aufklarer/Qwen3.5-0.8B-Chat-CoreML (INT8: 981 МБ).