Перейти к содержанию

Как проходит проверка

Этот раздел описывает путь одной вычитки из интерфейса: от кнопки «Начать вычитку» до карточек в «Очереди решений». Настройка модели здесь не разбирается.

Источник становится документом

Файл читается целиком, не больше 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.