File size: 8,600 Bytes
c8fa2d3
c388d55
 
 
 
 
a5dc4e1
 
c388d55
 
 
a5dc4e1
 
c388d55
 
 
a5dc4e1
c388d55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
---
license: apache-2.0
language:
- ru
base_model:
- RefalMachine/RuadaptQwen3-4B-Instruct
datasets:
- melsmm/spell-correction-ru
- ai-forever/spellcheck_punctuation_benchmark
pipeline_tag: text-generation
library_name: transformers
tags:
- spell-correction
- spelling-correction
- punctuation-restoration
- grammatical-error-correction
- russian
- qwen3
- lora
---

# Spell-Corrector-RU-4B

**Spell-Corrector-RU-4B** — языковая модель для **автоматического исправления орфографических, пунктуационных и регистровых ошибок** в русскоязычных текстах.

Модель дообучена на базе [`RefalMachine/RuadaptQwen3-4B-Instruct`](https://huggingface.co/RefalMachine/RuadaptQwen3-4B-Instruct) (адаптированная под русский язык версия [`Qwen/Qwen3-4B-Instruct-2507`](https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507)) методом **LoRA** в фреймворке [LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory). LoRA-адаптер уже **смержен** с базовой моделью — её можно использовать напрямую.

📦 **Код, ноутбуки и полное описание проекта:** [github.com/melsmm/llm-spell-corrector](https://github.com/melsmm/llm-spell-corrector)
📚 **Датасеты для обучения:** [`melsmm/spell-correction-ru`](https://huggingface.co/datasets/melsmm/spell-correction-ru)

## Для чего модель

Модель принимает текст с ошибками и возвращает его исправленную версию. Она умеет:

- 🔤 исправлять **орфографические** ошибки и опечатки;
- ❓ восстанавливать и исправлять **пунктуацию**;
- 🔠 восстанавливать **регистр** букв (заглавные/строчные) и букву «ё».

Основное преимущество перед существующими решениями (например, [SAGE](https://github.com/ai-forever/sage) на архитектуре T5) — **высокая скорость инференса** (через [vLLM](https://github.com/vllm-project/vllm), ~в 6 раз быстрее), простота внедрения в продакшен через OpenAI-совместимый API и лёгкость дообучения под новые домены с помощью LoRA.

## На чём обучалась

Обучение проходило в **две стадии**:

| Стадия | Датасет | Объём | Описание |
| --- | --- | --- | --- |
| **Stage 1** | `synth_spell_correction_1m` | ~1 млн | Синтетические ошибки, внесённые в чистые корпусы (`nerus`, `gazeta`, `wikipedia`) с помощью [SAGE](https://github.com/ai-forever/sage) (`SBSC`, `CharAug`, `WordAug`) и собственного алгоритма пунктуационной порчи. |
| **Stage 2** | `spell_correction_30k` | ~30 тыс. | Объединение готовых пар «ошибка → исправление» из открытых датасетов (RUSpellRU, MultidomainGold, GEC). |

Сначала модель учится на большом объёме разнообразных синтетических ошибок, затем «дошлифовывается» на меньшем, но более качественном наборе реальных пар. Оба датасета доступны в репозитории [`melsmm/spell-correction-ru`](https://huggingface.co/datasets/melsmm/spell-correction-ru).

**Гиперпараметры LoRA:** rank=32, alpha=64, dropout=0, bf16, cutoff length=4000.

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

### Промпт

Модель ожидает следующий формат запроса:

```
Исходный текст:
{текст с ошибками}

Отредактируй исходный текст, исправив ошибки.
```

Рекомендуемые параметры генерации: `temperature=0.1`, `top_p=0.7`.

### Через `transformers`

```python
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-совместимого сервера:

```bash
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
```

Обращение к серверу:

```python
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`](https://huggingface.co/datasets/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) — в [репозитории проекта](https://github.com/melsmm/llm-spell-corrector#-результаты).

### Скорость инференса

На 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