Как проходит проверка¶
Этот раздел описывает путь одной вычитки из интерфейса: от кнопки «Начать вычитку» до карточек в «Очереди решений». Настройка модели здесь не разбирается.
Источник становится документом¶
Файл читается целиком, не больше 50 МБ. PDF нет.
| Формат | Как извлекается текст |
|---|---|
| DOCX | python-docx, абзацы и таблицы |
| TXT, MD | как есть |
| HTML | BeautifulSoup, без script/nav/footer |
| URL | один GET с проверкой SSRF, HTML в текст |
Документ режется на блоки (абзац, заголовок, ячейка). Дальше пайплайн работает с блоками, а не со сырым файлом.
Вкладка «Ссылка» в «Вычитке» загружает одну страницу. Обход сайта до 200 страниц - это отдельный маршрут /api/check-url, экран его не вызывает.
Задача¶
POST /api/jobs создаёт задачу, сразу возвращает job_id. Пока задача идёт, статус в jobs.db и в памяти. Браузер читает живой вывод воркеров по SSE.
Таймаут задачи: LLM_JOB_TIMEOUT, по умолчанию 900 с. Незавершённая задача после рестарта backend помечается ошибкой.
Галочки на форме соответствуют опциям задачи: язык, Style Guide, термины. Хотя бы одна должна быть включена. Дополнительная инструкция (до 4000 знаков) дописывается к выбранному гайду только на этот прогон.
Слой без модели¶
Пайплайн по умолчанию v2. Первым делом он собирает детерминированные сигналы: Vale, морфология (pymorphy3 + razdel), LanguageTool. Они работают внутри контейнера backend и в контейнере LanguageTool. Исходный текст на адрес модели на этом шаге не уходит.
Три движка запускаются параллельно и сливаются в один список. Совпадение по строке и колонке убирается. Находка LanguageTool на том же фрагменте, что уже пометил гайд, отбрасывается.
Сигнал попадает в отчёт, если правило есть в эффективном наборе выбранного гайда. LanguageTool для этой привязки отображается на правило «Базовая.Орфография».
Этот слой заполняет очередь замечаний и без модели. Пустой список при живом LanguageTool чаще значит, что JVM ещё не прошла healthcheck.
Состав движков: откуда берутся замечания.
Слой модели¶
Если в «Настройках» или в LLM_BASE_URL задан корень API с протоколом OpenAI, включаются проходы v2. Их список задаёт PIPELINE_V2_STAGES:
evidence, language, guide, structure, terminology, consistency, lexicon, verifier
| Стадия | Что делает |
|---|---|
| evidence | уже собранные сигналы движков |
| language | язык и ясность по чанкам |
| guide | правила Style Guide по чанкам |
| structure | заголовки, списки, разметка |
| terminology | термины на весь документ |
| consistency | единообразие формулировок |
| lexicon | словарь гайда |
| verifier | сверка кандидатов с исходным блоком |
Чанк - несколько соседних блоков плюс короткое окно соседей. Полный документ в каждый промпт не кладётся: терминология и согласованность получают свой индекс (заголовки и повторяющиеся слова).
Повтор при сбое или таймауте прохода: PIPELINE_V2_PASS_RETRIES (по умолчанию 2), таймаут прохода PIPELINE_V2_PASS_TIMEOUT (360 с).
PIPELINE_VERSION=v1 включает старый набор воркеров. PIPELINE_SHADOW=true гоняет второй вариант рядом для сравнения, в интерфейс уходит основной.
Без адреса модели эти стадии не вызываются. Галочки на форме по-прежнему включают и выключают соответствующие группы замечаний в отчёте.
Отчёт¶
Готовый JSON: список замечаний (фрагмент, важность, правило, источник, замена если есть), метаданные источника, расход токенов. Интерфейс рисует «Очередь решений». Тот же объект пишется в историю пользователя.
Экспорт xlsx собирается из замечаний, которые в этот момент не скрыты на экране: POST /api/report-issues. Повторно текст не проверяется.
Что видит администратор после прогона¶
История и аналитика читают stats.db: кто запускал, какие rule_id сработали, сколько токенов. Раздел «Система» показывает диск тома, доступность модели и эмбеддингов, дату резервной копии, журнал audit.jsonl.