Luqwen5-4B

Luqwen5-4B — русскоязычная текстовая модель, полученная дообучением Qwen3.5-4B-Base методом LoRA (QLoRA), продолжающая линейку Luqwen-4B. В версии 5 увеличена доля русскоязычных текстов, добавлены задачи на логику.

Базовая модель Qwen3.5-4B-Base использует гибридную архитектуру (Gated DeltaNet + Full Attention) с контекстом до 262k токенов, что обеспечивает эффективный инференс при сохранении качества генерации.

Что нового в версии 5

  • Продолжение рассказа по пересказу
  • Логика с персонажами
  • Компактный и вычищенный датасет

Base model

Свойство Значение
Архитектура Qwen3.5 For Causal LM (гибридный Linear/Full Attention, full_attention_interval = 4)
Параметров 4B
Скрытая размерность 1024
Слоёв 24
Контекст до 262 144 токенов
Вокабуляр 248 320
MTP 1 слой

Подробнее: Qwen3.5-4B-Base

Training data

Датасет Luqwen5 — целиком пересобранный набор из 1 544 примеров в ChatML-формате, объединённых из 13 источников и перемешанных случайным образом. Распределение по группам:

Группа Примеров Доля
Продолжение художественного рассказа 432 28.0%
Креативное письмо, английский (Claude Opus) 400 25.9%
Вызов инструментов (tool calling) 166 10.8%
Код: веб (HTML/CSS/JS) 165 10.7%
Инструкции: математика, физика, код, история, аналитика 140 9.1%
Притчи 110 7.1%
Логика и персонажи 58 3.8%
Креативное письмо, русский 53 3.4%
Код: Windows-скрипты (.bat) 20 1.3%
Итого 1 544 100%

Краткие пояснения к группам:

  • Продолжение рассказа — пересказ предыдущей части → продолжение в том же стиле; отобрано по rm_score
  • Креативное письмо — тексты по жанровым промптам (EN — оригиналы Opus, RU — переводы с ручной доработкой)
  • Tool calling — диалоги с системным описанием функций в форматах <tools> и <functions>
  • Код — генерация одностраничных веб-приложений и .bat-скриптов для автоматизации
  • Инструкции — решение задач по математике, физике, истории, аналитике и программированию
  • Притчи — библейские, суфийские, восточные и народные притчи с разбором смысла
  • Логика и персонажи — дедукция по ограничениям и проверка правдивости утверждений по тексту диалога

Датасет разбит на обучающую и валидационную части в соотношении ~90/10, дедуплицирован и отфильтрован по длине (до 4096 токенов).

Training procedure

Параметры LoRA

Параметр Значение
rank (r) 8
lora_alpha 16
lora_dropout 0
bias none
use_rslora / use_dora false
Целевые модули q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, in_proj_qkv, in_proj_z, out_proj, in_proj_a, in_proj_b

Гиперпараметры обучения

Параметр Значение
Оптимизатор AdamW 8-bit
Precision BF16 (mixed)
Batch size 1 (8 gradient accumulation steps)
Learning rate 2e-4, линейный schedule
Warmup steps 50
Эпохи 3 максимум
Max seq length 4096 токенов
Обёртка unsloth (4-bit QLoRA)
Маскирование обучаются только токены ответа (prompt замаскирован)

Валидация и ранняя остановка

Параметр Значение
Валидация каждые 50 шагов (≈155 примеров)
Метрика eval loss
Early stopping patience 3
Фактически пройдено 350 из 522 шагов (2.01 эпохи из 3)
Лучший eval loss 1.311 (step 350)
Финальный train loss ≈1.14

Обучающий loss стабильно падал: 1.63 (step 10) → 1.39 (step 60) → 1.14 (step 350), без признаков переобучения — eval loss монотонно улучшался параллельно.

Рекомендуемые параметры семплинга

Параметр Значение
temperature 0.7
top_p 0.8
top_k 20
min_p 0.0
presence_penalty 1.5
repetition_penalty 1.0

Повышенный presence_penalty (1.5) подобран против повторов и зацикливания на длинных генерациях.

Usage

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "LLiserginov/Luqwen5-4B"

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto",
    trust_remote_code=True,
)

messages = [
    {"role": "user", "content": "Продолжи рассказ: старый фонарь на краю осеннего парка горел последние тридцать лет и ни разу не погас — он ждал, когда кто-нибудь наконец подойдёт."},
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)

inputs = tokenizer(text, return_tensors="pt").to(model.device)

outputs = model.generate(
    **inputs,
    max_new_tokens=1024,
    do_sample=True,
    temperature=0.7,
    top_p=0.8,
    top_k=20,
    min_p=0.0,
    presence_penalty=1.5,
    repetition_penalty=1.0,
)

response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response)

Загрузка LoRA-адаптера

from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

base_model_id = "Qwen/Qwen3.5-4B-Base"
adapter_id = "LLiserginov/Luqwen5-4B"

tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True)
base = AutoModelForCausalLM.from_pretrained(
    base_model_id,
    torch_dtype="auto",
    device_map="auto",
    trust_remote_code=True,
)
model = PeftModel.from_pretrained(base, adapter_id)

Вызов инструментов

outputs = model.generate(
    **inputs,
    max_new_tokens=256,
    do_sample=True,
    temperature=0.3,
    top_p=0.8,
    top_k=20,
    presence_penalty=1.5,
    repetition_penalty=1.0,
)

Генерация кода (web + batch)

outputs = model.generate(
    **inputs,
    max_new_tokens=2048,
    do_sample=True,
    temperature=0.4,
    top_p=0.8,
    top_k=20,
    presence_penalty=1.5,
    repetition_penalty=1.0,
)

Использование с vLLM

from vllm import LLM, SamplingParams

llm = LLM(model="LLiserginov/Luqwen5-4B", trust_remote_code=True)

messages = [
    {"role": "user", "content": "Объясни разницу между supervised и unsupervised learning."},
]

sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.8,
    top_k=20,
    min_p=0.0,
    presence_penalty=1.5,
    repetition_penalty=1.0,
    max_tokens=1024,
)
outputs = llm.chat(messages, sampling_params=sampling_params)
print(outputs[0].outputs[0].text)

GGUF (llama.cpp)

GGUF-версию модели можно найти в файлах или сконвертировать самостоятельно:

git clone https://github.com/ggml-ai/llama.cpp
cd llama.cpp
python convert_hf_to_gguf.py /path/to/Luqwen5-4B --outfile Luqwen5-4B.Q4_K_M.gguf --outtype q4_K_M

Запуск через llama.cpp:

llama-cli -m Luqwen5-4B.Q4_K_M.gguf \
  --prompt "Продолжи рассказ: старый фонарь на краю осеннего парка горел последние тридцать лет и ни разу не погас — он ждал, когда кто-нибудь наконец подойдёт." \
  --temp 0.7 --top-p 0.8 --top-k 20 \
  --presence-penalty 1.5 --repeat-penalty 1.0

Мобильные устройства (PocketPal AI)

Для телефонов и планшетов используйте квант Q4_0 — на мобильных CPU/GPU он заметно быстрее Q4_K_M, хотя качество немного ниже. Это рекомендуемый вариант для PocketPal AI (iOS / Android, локальная генерация на устройстве).

Параметры семплинга в приложении:

Параметр Значение
Temperature 0.7
Top K 20
Top P 0.8
Min P 0.0
Repeat penalty 1.0
Presence penalty 1.5
Context size 2048–4096 (зависит от свободной памяти)

Limitations

  • Часть креативного датасета состоит из англо- и русскоязычных примеров; русскоязычная часть переведена машинным способом (Gemma 4 26B) — возможны отдельные артефакты и буквализмы
  • Инструкционный датасет ограничен по объёму — покрытие тем по математике, физике, истории и аналитике неполное
  • Код (web + batch) охватывает ограниченный набор сценариев — генерация сложного или специфичного кода может быть неточной
  • Модель не проходила RLHF/DPO-калибровку и может генерировать нежелательный или фактически неверный контент
  • Не предназначена для использования в медицинских, юридических или других критических областях

License

Модель распространяется под лицензией Apache 2.0.

Базовая модель: Qwen3.5-4B-Base — Apache 2.0.

Downloads last month
1,713
GGUF
Model size
4B params
Architecture
qwen35
Hardware compatibility
Log In to add your hardware

4-bit

6-bit

8-bit

16-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for LLiserginov/Luqwen5-4B

Adapter
(65)
this model