melsmm/Spell-Corrector-RU-4B
Spell-Corrector-RU-4B
Spell-Corrector-RU-4B — языковая модель для автоматического исправления орфографических, пунктуационных и регистровых ошибок в русскоязычных текстах.
Модель дообучена на базе `RefalMachine/RuadaptQwen3-4B-Instruct` (адаптированная под русский язык версия `Qwen/Qwen3-4B-Instruct-2507`) методом LoRA в фреймворке LLaMA-Factory. LoRA-адаптер уже смержен с базовой моделью — её можно использовать напрямую.
📦 Код, ноутбуки и полное описание проекта: github.com/melsmm/llm-spell-corrector 📚 Датасеты для обучения: `melsmm/spell-correction-ru`
Для чего модель
Модель принимает текст с ошибками и возвращает его исправленную версию. Она умеет:
- 🔤 исправлять орфографические ошибки и опечатки;
- ❓ восстанавливать и исправлять пунктуацию;
- 🔠 восстанавливать регистр букв (заглавные/строчные) и букву «ё».
Основное преимущество перед существующими решениями (например, SAGE на архитектуре T5) — высокая скорость инференса (через vLLM, ~в 6 раз быстрее), простота внедрения в продакшен через OpenAI-совместимый API и лёгкость дообучения под новые домены с помощью LoRA.
На чём обучалась
Обучение проходило в две стадии:
Сначала модель учится на большом объёме разнообразных синтетических ошибок, затем «дошлифовывается» на меньшем, но более качественном наборе реальных пар. Оба датасета доступны в репозитории `melsmm/spell-correction-ru`.
Гиперпараметры LoRA: rank=32, alpha=64, dropout=0, bf16, cutoff length=4000.
Использование
Промпт
Модель ожидает следующий формат запроса:
Исходный текст:
{текст с ошибками}
Отредактируй исходный текст, исправив ошибки.Рекомендуемые параметры генерации: temperature=0.1, top_p=0.7.
Через transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "melsmm/Spell-Corrector-RU-4B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")
text = "привет как дила, что делаеш севодня"
prompt = f"Исходный текст:\n{text}\n\nОтредактируй исходный текст, исправив ошибки."
messages = [{"role": "user", "content": prompt}]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, return_tensors="pt"
).to(model.device)
outputs = model.generate(inputs, max_new_tokens=512, temperature=0.1, top_p=0.7, do_sample=True)
print(tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True))Через vLLM (рекомендуется для продакшена)
Запуск OpenAI-совместимого сервера:
vllm serve melsmm/Spell-Corrector-RU-4B \
--gpu-memory-utilization 0.95 \
--host 0.0.0.0 \
--port 9900 \
--served-model-name spell_correction \
--max-model-len 4096Обращение к серверу:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:9900/v1", api_key="EMPTY")
text = "привет как дила"
resp = client.chat.completions.create(
model="spell_correction",
messages=[{"role": "user", "content":
f"Исходный текст:\n{text}\n\nОтредактируй исходный текст, исправив ошибки."}],
temperature=0.1,
top_p=0.7,
)
print(resp.choices[0].message.content)Качество
Оценка на бенчмарке `ai-forever/spellcheck_punctuation_benchmark` (F1 по орфографии / пунктуации / регистру):
RUSpellRU
MultidomainGold
MedSpellchecker
GitHubTypoCorpusRu
Полные таблицы (Precision / Recall / F1 + сравнение со Stage 1) — в репозитории проекта.
Скорость инференса
На RUSpellRU (2008 примеров) через vLLM: 45 с (0.022 с/пример) против 284 с (0.141 с/пример) у sage-fredt5-large — ~в 6 раз быстрее.
Ограничения
- Модель уступает SAGE по орфографии на ряде доменов, но конкурентна по пунктуации и регистру.
- Качество может снижаться на узкоспециализированных доменах (например, медицина) — там рекомендуется дообучение под домен с помощью LoRA.
- Модель работает с русским языком; для других языков не предназначена.
Ссылки
- 🔗 Проект на GitHub: https://github.com/melsmm/llm-spell-corrector
- 🤗 Датасеты: https://huggingface.co/datasets/melsmm/spell-correction-ru
- 🧩 Базовая модель: https://huggingface.co/RefalMachine/RuadaptQwen3-4B-Instruct
