محادثة Qwen3.5 (LLM على الجهاز)
Qwen3.5-0.8B نموذج هجين يجمع بين DeltaNet (الانتباه الخطّي) وGatedAttention، يتألّف من 24 طبقة (18 طبقة DeltaNet + 6 طبقات GatedAttention)، مُكمَّم إلى INT4 لـ MLX (وحدة معالجة الرسوم Metal) وINT8 لـ CoreML (Neural Engine). يعمل على Mac عبر MLX، وعلى iPhone وMac عبر CoreML مع توليد رموز بالبثّ. مُصمَّم لخطوط أنابيب الصوت التي يوفّر فيها LLM على الجهاز "العقل" بين ASR وTTS.
يتكامل Qwen3.5 Chat مع VoicePipeline في SpeechCore بوصفه مكوّن LLM في سلاسل ASR → LLM → TTS. توفّر بنية DeltaNet الهجينة انتباهًا فعّالًا بزمن خطّي للسياقات الطويلة.
بداية سريعة
import Qwen3Chat
let chat = try await Qwen35MLXChat.fromPretrained()
// Single response
let response = try chat.generate("What is Swift?", systemPrompt: "Answer briefly.")
print(response)
// Streaming tokens
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 (انتباه خطّي مع تكرار قاعدة دلتا مبوَّبة gated delta rule وRMSNormGated) و6 طبقات GatedAttention (انتباه قياسي scaled dot-product). يُجري الواجهة الخلفية لـ MLX الاستدلال على وحدة معالجة الرسوم Metal بأوزان safetensors. وتستخدم الواجهة الخلفية لـ CoreML بنية نموذج مزدوج (prefill + decode) مُحسَّنة لـ Neural Engine. كلاهما يدعم ذاكرة KV cache مع prompt caching وأخذ عيّنات قابلًا للتهيئة (temperature، top-k، top-p، repetition penalty).
مدخلات/مخرجات النموذج
| الاتجاه | الاسم | الشكل | الوصف |
|---|---|---|---|
| إدخال | input_ids | [1, seq_len] | معرّفات الرموز (Int32) |
| إدخال | attention_mask | [1, seq_len] | قناع الانتباه (Int32) |
| إدخال | kv_cache | لكلّ طبقة | حالة ذاكرة المفتاح-القيمة |
| إخراج | logits | [1, 1, 151936] | logits للرمز التالي (Float16) |
| إخراج | kv_cache_out | لكلّ طبقة | ذاكرة KV محدَّثة |
متغيّرات النموذج
| المتغيّر | التكميم | الحجم | الحوسبة | HuggingFace |
|---|---|---|---|---|
| Qwen3.5-0.8B Chat | INT4 | 418 MB | وحدة معالجة الرسوم Metal (MLX) | aufklarer/Qwen3.5-0.8B-Chat-MLX |
| Qwen3.5-0.8B Chat | INT8 | 981 MB | 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)
| المعامل | الافتراضي | الوصف |
|---|---|---|
temperature | 0.6 | العشوائية (0 = greedy، 1 = إبداعي) |
topK | 50 | الإبقاء على أفضل K مرشّحًا |
topP | 0.95 | عتبة أخذ عيّنات النواة nucleus |
maxTokens | 512 | الحدّ الأقصى لرموز الردّ |
repetitionPenalty | 1.1 | عقوبة على الرموز المكرَّرة |
disableThinking | false | تخطّي وضع thinking |
maxThinkingTokens | 100 | سقف رموز thinking |
حوار متعدّد الأدوار
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() // Clear history and KV cache
إدارة الذاكرة
// Check memory state
print(chat.isLoaded) // true
print(chat.memoryFootprint) // 438304768 (~418 MB)
// Free memory under pressure
chat.unload()
print(chat.isLoaded) // false
// Reload when needed
let chat = try await Qwen35MLXChat.fromPretrained()
على iPhone، تفريغ LLM قبل استدلال TTS يحرّر ~418 MB (INT4 MLX) أو ~981 MB (INT8 CoreML)، ممّا يمنع إنهاء العمليّة بـ jetsam عند تشغيل خطوط أنابيب كاملة ASR → LLM → TTS.
الأداء
| الجهاز | Prefill | Decode | رموز/ثانية |
|---|---|---|---|
| M2 Max | ~50ms | ~65ms/tok | ~15 tok/s |
| iPhone 16 Pro | ~1.5s | ~450ms/tok | ~2.2 tok/s |
التحويل
تُحوَّل أوزان MLX من نقطة تفتيش Qwen3.5-0.8B الأصلية باستخدام برنامج تحويل MLX النصّي. وتستخدم نماذج CoreML برنامج تحويل مستقلًّا للنشر على Neural Engine. تتوفّر الأوزان المحوَّلة مسبقًا على HuggingFace في aufklarer/Qwen3.5-0.8B-Chat-MLX (INT4: 418 MB) وaufklarer/Qwen3.5-0.8B-Chat-CoreML (INT8: 981 MB).