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.
На чём обучалась
Обучение проходило в две стадии :
Стадия Датасет Объём Описание Stage 1 synth_spell_correction_1m~1 млн Синтетические ошибки, внесённые в чистые корпусы (nerus, gazeta, wikipedia) с помощью SAGE (SBSC, CharAug, WordAug) и собственного алгоритма пунктуационной порчи. Stage 2 spell_correction_30k~30 тыс. Объединение готовых пар «ошибка → исправление» из открытых датасетов (RUSpellRU, MultidomainGold, GEC).
Сначала модель учится на большом объёме разнообразных синтетических ошибок, затем «дошлифовывается» на меньшем, но более качественном наборе реальных пар. Оба датасета доступны в репозитории
melsmm/spell-correction-ru.
Гиперпараметры LoRA: rank=32, alpha=64, dropout=0, bf16, cutoff length=4000.
Использование
Промпт
Модель ожидает следующий формат запроса:
Исходный текст:
{текст с ошибками}
Отредактируй исходный текст, исправив ошибки.
Рекомендуемые параметры генерации: temperature=0.1, top_p=0.7.
Через transformers
1 from transformers import AutoModelForCausalLM , AutoTokenizer
2
3 model_name = "melsmm/Spell-Corrector-RU-4B"
4 tokenizer = AutoTokenizer . from_pretrained ( model_name )
5 model = AutoModelForCausalLM . from_pretrained ( model_name , torch_dtype = "auto" , device_map = "auto" )
6
7 text = "привет как дила, что делаеш севодня"
8 prompt = f"Исходный текст:\n { text } \n\nОтредактируй исходный текст, исправив ошибки."
9
10 messages = [ { "role" : "user" , "content" : prompt } ]
11 inputs = tokenizer . apply_chat_template (
12 messages , add_generation_prompt = True , return_tensors = "pt"
13 ) . to ( model . device )
14
15 outputs = model . generate ( inputs , max_new_tokens = 512 , temperature = 0.1 , top_p = 0.7 , do_sample = True )
16 print ( tokenizer . decode ( outputs [ 0 ] [ inputs . shape [ 1 ] : ] , skip_special_tokens = True ) )
Через vLLM (рекомендуется для продакшена)
Запуск OpenAI-совместимого сервера:
1 vllm serve melsmm/Spell-Corrector-RU-4B \
2 --gpu-memory-utilization 0.95 \
3 --host 0.0 .0.0 \
4 --port 9900 \
5 --served-model-name spell_correction \
6 --max-model-len 4096
Обращение к серверу:
1 from openai import OpenAI
2
3 client = OpenAI ( base_url = "http://localhost:9900/v1" , api_key = "EMPTY" )
4
5 text = "привет как дила"
6 resp = client . chat . completions . create (
7 model = "spell_correction" ,
8 messages = [ { "role" : "user" , "content" :
9 f"Исходный текст:\n { text } \n\nОтредактируй исходный текст, исправив ошибки." } ] ,
10 temperature = 0.1 ,
11 top_p = 0.7 ,
12 )
13 print ( resp . choices [ 0 ] . message . content )
Качество
Оценка на бенчмарке
ai-forever/spellcheck_punctuation_benchmark (F1 по орфографии / пунктуации / регистру):
RUSpellRU
Model F1 (spell) F1 (punc) F1 (case) Spell-Corrector-RU-4B 64.7 84.5 94.2 sage-fredt5-large 84.5 86.8 94.7 gpt-4 64.0 83.2 90.9 gpt-3.5-turbo 42.7 73.7 79.0
MultidomainGold
Model F1 (spell) F1 (punc) F1 (case) Spell-Corrector-RU-4B 62.6 66.5 80.0 sage-fredt5-large 77.6 67.7 79.3 gpt-4 37.0 56.0 60.0 gpt-3.5-turbo 27.1 36.2 49.1
MedSpellchecker
Model F1 (spell) F1 (punc) F1 (case) Spell-Corrector-RU-4B 42.8 70.4 76.3 sage-fredt5-large 72.3 70.3 82.1 gpt-4 49.6 71.9 67.1 gpt-3.5-turbo 22.3 59.8 32.3
GitHubTypoCorpusRu
Model F1 (spell) F1 (punc) F1 (case) Spell-Corrector-RU-4B 49.7 34.8 45.8 sage-fredt5-large 59.5 42.6 42.7 gpt-4 35.7 38.2 30.2 gpt-3.5-turbo 29.4 28.7 25.3
Полные таблицы (Precision / Recall / F1 + сравнение со Stage 1) — в
репозитории проекта .
Скорость инференса
На RUSpellRU (2008 примеров) через vLLM: 45 с (0.022 с/пример) против 284 с (0.141 с/пример) у sage-fredt5-large — ~в 6 раз быстрее .
Ограничения
Модель уступает SAGE по орфографии на ряде доменов, но конкурентна по пунктуации и регистру.
Качество может снижаться на узкоспециализированных доменах (например, медицина) — там рекомендуется дообучение под домен с помощью LoRA.
Модель работает с русским языком; для других языков не предназначена.
Ссылки