LLiserginov/Luqwen4-4B
Luqwen4-4B
Luqwen4-4B — русскоязычная текстовая модель, полученная дообучением Qwen3.5-4B-Base методом LoRA (QLoRA), продолжающая линейку Luqwen-4B. Датасет построен на основе датасета Luqwen3.5 с добавлением новых частей: русских притч, кода (web + batch) и задач на внимание по логике и математике. Модель сочетает способность следовать инструкциям, вызывать инструменты, решать задачи по математике, физике, истории и аналитике, а также генерировать выразительные литературные тексты, притчи и программный код.
Базовая модель Qwen3.5-4B-Base использует гибридную архитектуру (Gated DeltaNet + Full Attention) с контекстом до 262k токенов, что обеспечивает эффективный инференс при сохранении качества генерации.
Что нового в версии 4
К датасету из Luqwen3.5 (принятому за 100%) добавлено:
- +10% — Притчи — русские притчи и поучительные истории (датасет LLiserginov/russian_parables)
- +10% — Код (web + batch) — генерация HTML-страниц и скриптов для Windows (
.bat), включая примеры с инструментами и запросами на создание/доработку кода - +5% — Логические и математические задачи на внимание — задачи на внимательность, аккуратность к условию и пошаговые вычисления
Base model
Подробнее: Qwen3.5-4B-Base
Training data
Датасет Luqwen4 построен на основе датасета Luqwen3.5, к которому добавлены новые части. Доли добавлений указаны относительно датасета Luqwen3.5, принятого за 100%:
Итоговое распределение частей в суммарном датасете (125%):
База — датасет Luqwen3.5 (80%)
Состоит из трёх частей (доли — внутри базы):
70% — Креативное письмо
Оригинальные тексты, написанные Claude Opus 4.6. Примерно 50% примеров оставлено на английском языке в оригинале, остальные переведены на русский с помощью Gemma 4 26B. После перевода был сделан ещё один проход Gemma 4 26B для исправления ошибок перевода, а затем выполнена ручная доработка и редактура текстов.
15% — Реальные диалоги пользователя с LLM
Диалоги включают:
- Задачи с использованием инструментов (tool calling) — вызов API, работа с файлами, команды
- Логические и рассуждающие задачи
- Кодинг — написание, отладка и объяснение кода
- Общие инструкции и вопросы
15% — Инструкционный датасет на русском языке
Примеры решения задач по категориям:
- Математика — алгебра, геометрия, задачи с рассуждениями
- Физика — механика, термодинамика, электродинамика
- Код — примеры решения задач по программированию
- История — вопросы и анализ исторических событий
- Аналитика — интерпретация данных, выводы и прогнозы
Новые части Luqwen4 (20%)
8% — Притчи
Русские притчи и поучительные истории из датасета LLiserginov/russian_parables. Примеры представлены в виде диалогов с пересказом, разбором смысла и морали.
8% — Код (web + batch)
- Web — генерация и доработка HTML-страниц: вёрстка, интерактивные элементы, стилизация
- Batch — создание Windows-скриптов (
.bat) для автоматизации задач
4% — Логические и математические задачи на внимание
Задачи на внимательность к условию, проверку данных и последовательные вычисления (скорость, время, расстояния, перестановки). Развивают аккуратность при решении и снижают количество «заученных» ошибок.
Pipeline подготовки данных
- Сбор диалогов с LLM (tool-calling, код, логика) — анонимизация, форматирование в ChatML
- Написание креативных текстов на английском через Claude Opus
- Перевод части текстов на русский через Gemma 4 26B (примерно половина креативных примеров остаётся на английском в оригинале)
- Проход Gemma 4 26B для исправления ошибок перевода
- Ручная доработка и редактура текстов
- Составление инструкционного датасета (математика, физика, код, история, аналитика)
- Сбор датасета притч (LLiserginov/russian_parables) и генерация промптов для притч с помощью Gemma 4 26B
- Составление датасета кода (web + batch) и задач на внимание
- Фильтрация и дедупликация
- Конвертация в ChatML-формат
Training procedure
Параметры LoRA
Гиперпараметры обучения
Слияние весов
После обучения LoRA-адаптер был слит с базовой моделью в 16-bit точность (метод merged_16bit через unsloth) для удобного использования без дополнительных зависимостей PEFT.
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "LLiserginov/Luqwen4-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,
temperature=0.7,
top_p=0.9,
do_sample=True,
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response)Вызов инструментов
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "LLiserginov/Luqwen4-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=256,
temperature=0.3,
top_p=0.9,
do_sample=True,
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response)Генерация кода (web + batch)
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "LLiserginov/Luqwen4-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": "Напиши HTML-страницу с простым калькулятором."},
]
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=2048,
temperature=0.4,
top_p=0.9,
do_sample=True,
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response)Использование с vLLM
from vllm import LLM, SamplingParams
llm = LLM(model="LLiserginov/Luqwen4-4B", trust_remote_code=True)
messages = [
{"role": "user", "content": "Объясни разницу между supervised и unsupervised learning."},
]
outputs = llm.chat(messages, sampling_params=SamplingParams(temperature=0.7, max_tokens=1024))
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/Luqwen4-4B --outfile Luqwen4-4B.Q4_K_M.gguf --outtype q4_K_MЗапуск через llama.cpp:
llama-cli -m Luqwen4-4B.Q4_K_M.gguf \
--prompt "Напиши рассказ о одиноком фонаре в осеннем парке." \
--temp 0.7 --top-p 0.9 \
--repeat-penalty 1.0 --repeat-last-n 206Limitations
- Креативный датасет состоит из англо- и русскоязычных примеров; русскоязычная часть переведена машинным способом (Gemma 4 26B) — возможны отдельные артефакты и буквализмы
- Инструкционный датасет ограничен по объёму — покрытие тем по математике, физике, истории и аналитике неполное
- Код (web + batch) охватывает ограниченный набор сценариев — генерация сложного или специфичного кода может быть неточной
- Модель не проходила RLHF/DPO-калибровку и может генерировать нежелательный или фактически неверный контент
- Не предназначена для использования в медицинских, юридических или других критических областях
License
Модель распространяется под лицензией Apache 2.0.
Базовая модель: Qwen3.5-4B-Base — Apache 2.0.
Датасет притч: LLiserginov/russian_parables.
