--- language: - ru - en license: apache-2.0 library_name: transformers base_model: Qwen/Qwen3.5-4B-Base tags: - qwen - qwen3.5 - lora - peft - russian - instruct - unsloth - creative-writing - tool-use - opus - parables - code pipeline_tag: image-text-to-text datasets: - custom - LLiserginov/russian_parables widget: - messages: - role: user content: "Напиши рассказ о одиноком фонаре в осеннем парке." --- # 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](https://huggingface.co/datasets/LLiserginov/russian_parables)) - **+10% — Код (web + batch)** — генерация HTML-страниц и скриптов для Windows (`.bat`), включая примеры с инструментами и запросами на создание/доработку кода - **+5% — Логические и математические задачи на внимание** — задачи на внимательность, аккуратность к условию и пошаговые вычисления ## Base model | Свойство | Значение | |---|---| | Архитектура | Qwen3.5 For Causal LM (гибрид Linear/Full Attention) | | Параметров | 4B | | Скрытая размерность | 1024 | | Слоёв | 24 | | Контекст | до 262 144 токенов | | Вокабуляр | 248 320 (padding) | | MTP | 1 слой | Подробнее: [Qwen3.5-4B-Base](https://huggingface.co/Qwen/Qwen3.5-4B-Base) ## Training data Датасет Luqwen4 построен на основе датасета Luqwen3.5, к которому добавлены новые части. Доли добавлений указаны относительно датасета Luqwen3.5, принятого за 100%: | Добавление | Доля от базы 3.5 | |---|---| | База Luqwen3.5 | 100% | | Притчи | +10% | | Код (web + batch) | +10% | | Логические и математические задачи на внимание | +5% | Итоговое распределение частей в суммарном датасете (125%): | Часть | Доля в итоге | |---|---| | База Luqwen3.5 | 80% | | Притчи | 8% | | Код (web + batch) | 8% | | Логика и математика на внимание | 4% | ### База — датасет 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](https://huggingface.co/datasets/LLiserginov/russian_parables). Примеры представлены в виде диалогов с пересказом, разбором смысла и морали. **8% — Код (web + batch)** - **Web** — генерация и доработка HTML-страниц: вёрстка, интерактивные элементы, стилизация - **Batch** — создание Windows-скриптов (`.bat`) для автоматизации задач **4% — Логические и математические задачи на внимание** Задачи на внимательность к условию, проверку данных и последовательные вычисления (скорость, время, расстояния, перестановки). Развивают аккуратность при решении и снижают количество «заученных» ошибок. ### Pipeline подготовки данных 1. Сбор диалогов с LLM (tool-calling, код, логика) — анонимизация, форматирование в ChatML 2. Написание креативных текстов на английском через Claude Opus 3. Перевод части текстов на русский через Gemma 4 26B (примерно половина креативных примеров остаётся на английском в оригинале) 4. Проход Gemma 4 26B для исправления ошибок перевода 5. Ручная доработка и редактура текстов 6. Составление инструкционного датасета (математика, физика, код, история, аналитика) 7. Сбор датасета притч (LLiserginov/russian_parables) и генерация промптов для притч с помощью Gemma 4 26B 8. Составление датасета кода (web + batch) и задач на внимание 9. Фильтрация и дедупликация 10. Конвертация в ChatML-формат ## Training procedure ### Параметры LoRA | Параметр | Значение | |---|---| | rank (r) | 16 | | lora_alpha | 32 | | lora_dropout | 0 | | bias | none | | Целевые модули | `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 | | Эпохи | 4 | | Warmup steps | 50 | | Max seq length | 4096 токенов | | Обёртка | unsloth (4-bit QLoRA) | | Маскирование | обучаются только токены ответа (prompt замаскирован) | ### Слияние весов После обучения LoRA-адаптер был слит с базовой моделью в 16-bit точность (метод `merged_16bit` через unsloth) для удобного использования без дополнительных зависимостей PEFT. ## Usage ```python 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) ``` ### Вызов инструментов ```python 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) ```python 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 ```python 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-версию модели можно найти в [файлах](https://huggingface.co/LLiserginov/Luqwen4-4B/tree/main) или сконвертировать самостоятельно: ```bash 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: ```bash llama-cli -m Luqwen4-4B.Q4_K_M.gguf \ --prompt "Напиши рассказ о одиноком фонаре в осеннем парке." \ --temp 0.7 --top-p 0.9 \ --repeat-penalty 1.0 --repeat-last-n 206 ``` ## Limitations - Креативный датасет состоит из англо- и русскоязычных примеров; русскоязычная часть переведена машинным способом (Gemma 4 26B) — возможны отдельные артефакты и буквализмы - Инструкционный датасет ограничен по объёму — покрытие тем по математике, физике, истории и аналитике неполное - Код (web + batch) охватывает ограниченный набор сценариев — генерация сложного или специфичного кода может быть неточной - Модель не проходила RLHF/DPO-калибровку и может генерировать нежелательный или фактически неверный контент - Не предназначена для использования в медицинских, юридических или других критических областях ## License Модель распространяется под лицензией **Apache 2.0**. Базовая модель: [Qwen3.5-4B-Base](https://huggingface.co/Qwen/Qwen3.5-4B-Base) — Apache 2.0. Датасет притч: [LLiserginov/russian_parables](https://huggingface.co/datasets/LLiserginov/russian_parables).