OWL Сервис классификации и поиска документовβ
🏠 Как это работает
📤 Загрузка
🧠 Классификация документа
📊 История классификации
📖 Справочники
🗄️ Коллекция
⚙️ Настройки
🔌 API
👤 Учётная запись
Логотип

🤖 Как это работает?

Пять простых сценариев — от выбора коллекции до поиска. Нажми, чтобы развернуть.

📂 Выбор коллекции — рабочее пространство документов
📂 Как выбирается коллекция
Переключатель — в шапке сервиса (справа, рядом с кнопкой темы): Выберите коллекцию: [test_docs ▾]. В списке — только рабочие коллекции сервиса (служебные npa/tech/default скрыты). Переключение мгновенное: весь сервис перестраивается под выбранную коллекцию без перезагрузки страницы. Если доступна одна коллекция — переключатель скрывается (она и так активна).
  • 🔄 Переключение валидируется: коллекция должна существовать в Qdrant, а у пользователя — быть назначенной (права проверяются и в UI, и на сервере);
  • 🧩 У каждой коллекции — своё наполнение, свои настройки, справочники, промпты и история;
  • 🆕 Для нового проекта — просто создайте коллекцию в Qdrant и назначьте её пользователю — она появится в списке.
🔗 Что завязано на коллекцию
  • 📥 Загрузка документов — новые документы попадают в активную коллекцию;
  • 🔍 Поиск по смыслу — ищет только внутри активной коллекции (+ порог точности — свой у каждой);
  • 🧠 Классификация — соседи и тематики берутся из активной коллекции;
  • 📸 Снапшоты — резервные копии активной коллекции;
  • 📖 Справочники (тематики/отправители/получатели/типы) — свои на коллекцию;
  • ⚙️ Настройки (контраст, порог, лимиты, теги) — свои на коллекцию;
  • 📝 Промпты — свои на коллекцию;
  • 📊 История классификаций и статистика — свои на коллекцию.
🗂️ Особенность: задачи работают локально
Очередь задач (загрузка → распознавание → анализ → загрузка в Qdrant) хранится локально у каждой копии сервиса и не синхронизируется между сервисами. Это сделано намеренно:
  • 🖥️ Каждая копия сервиса обрабатывает только свои загруженные документы;
  • 🚦 Не возникает «войны за очередь» — две копии не пытаются обработать одну задачу;
  • 💾 Конфигурация (справочники, настройки, промпты, история) — общая через MySQL, а задачи — локальные;
  • ℹ️ При переключении коллекции очередь задач не меняется — это технический журнал обработки, не данные коллекции.
⚙️ Настройка — один раз, чтобы система говорила на вашем языке
📖 Справочники
(вкладка «Справочники») — замкнутые списки, из которых система обязана выбирать. Нейросети запрещено сочинять свои значения:
  • 🏷️ Тематики — перечень тем для классификации («МРГ 1279», «ФСТЭК», «ГИС ГМП»...). Чем точнее список, тем чётче разделение документов;
  • 🏢 Отправители — организации, от которых приходят письма. Реквизиты стандартизированы: «Минэк», а не «Министерство экономического развития РФ»;
  • 📬 Получатели — организации-адресаты;
  • 📥 Типы документов — письма, приказы, протоколы, соглашения...
⚙️ Параметры загрузки
(Настройки → «📤 Загрузка»)
  • 📄 Лимит страниц загрузки (max_pages_load) — сколько первых страниц PDF обрабатывать при загрузке в хранилище. 0 = весь документ. Если документ длиннее лимита — сервис предупредит «в хранилище попадёт только начало». Полезно для больших файлов: экономит время распознавания;
  • 🏷️ Автотеги при загрузке (auto_tags) — записывать ли предложенные нейросетью теги сразу в хранилище, или вы решаете сами при проверке карточки.
🧠 Параметры классификации
(Настройки → «Классификация»)
  • 🏷️ Предложения тегов (tag_suggestions) — показывать ли нейросетевые теги при классификации (бейджи в карточке результата);
  • 🎚️ Контраст (contrast) — 1..100, насколько резко «выпячивать» главную тематику: высокий контраст делает разницу между основной темой и остальными более драматичной (100 = почти всегда 100% у лидера), низкий — распределение вероятностей более ровное, когда темы похожи;
  • ⚖️ Поправка на частоту темы (IDF) — всегда глобальная — защита от перекоса базы. Если одной темы в коллекции много, а другой мало — без поправки частая тема почти всегда выигрывает. Поправка делит вес темы на √log(1 + число её документов по всей коллекции): редкие темы не тонут, частые не доминируют. Насыщение — темы с числом документов ≥ порога штрафуются одинаково (настраивается, кэшируется при выборе коллекции);
  • 👥 Бонус поддержки (support_boost) — вклад каждого дополнительного документа темы в топ-10 соседей: тема «большинства» становится увереннее одиночной;
  • 🔑 Бонус ключевых слов (kw_boost / dir_kw_boost) — мягкий бонус (по умолчанию 0.05) за каждое найденное в тексте ключевое слово из справочника (кап 4 слова). Раздельные слайдеры: для тем и для направлений (направления используют свои ключевые слова на этапе каскада);
  • 📄 Лимит страниц классификации (max_pages) — 1..10: сколько страниц текста «видит» классификатор (объём текста и число чанков растут вместе). Больше — точнее, но дольше.
📝 Промпты
(Настройки → «Промты») — тексты заданий для нейросети:
  • 📝 Реквизиты и содержание — извлечение даты, номера, отправителя, получателя, темы + краткое содержание (при загрузке);
  • 💡 Обоснование тематики — почему выбрана именно эта тема;
  • 📝 Краткое содержание (классификация) — summary для вкладки классификации;
  • 🏷️ Автотеги — генерация тегов-предложений.
🗄️ Коллекция
(Настройки → «Коллекция»; переключатель коллекций — в шапке) — резервные копии и точность поиска:
  • 📸 Создать снапшот — мгновенная резервная копия коллекции (≈1 сек, ~600 МБ). Рекомендуется после каждого массового наполнения;
  • ⬆️ Загрузить снапшот — восстановить коллекцию из копии (заменяет текущую! подтверждение перед запуском). Восстановление занимает 2–3 секунды;
  • 🗑 Удалить снапшот — освободить место (каждый ~600 МБ);
  • 💡 Зачем снапшоты: защищают от потери данных — например, при сбое или случайном удалении документов. Храните 2–3 последних;
  • 🎯 Порог точности поиска (0–100%) — фильтр для поиска по смыслу в коллекции: показываются только документы со сходством не ниже порога. 0% = без отсечки (показывать всё). Чем выше порог — тем меньше «мусора», но можно потерять погранично похожие документы. Рекомендация: 60–80%.
💡 Важно: к промптам «Реквизиты» и «Обоснование» сервис автоматически дописывает блок «ДОСТУПНЫЕ ЗНАЧЕНИЯ» из справочников — нейросеть обязана выбирать отправителя/получателя/тематику только из ваших списков. В редактируемый текст промпта этот блок не попадает.
📥 Наполнение коллекции — загрузите PDF, дальше всё само
Коллекция — семантическое хранилище: документы лежат «по смыслу» (векторами), у каждого — структурированная карточка. Каждый документ проходит цепочку статусов:
🕐
В очереди
Документ принят, ждёт распознавания
→
⏳
Распознавание
GPU читает PDF; если длиннее лимита — предупреждение
→
🧠
Анализ
Реквизиты + тематика по похожим документам
→
✅
Готово
Карточка открыта для проверки и правок
→
📤
Загрузка в Qdrant
Эмбеддинг + запись в хранилище (виден прогресс %)
→
🚀
В хранилище
Терминальный ✅ — готов к поиску
❌
Ошибка
Терминальный — с причиной; можно повторить
⛔
Отменено
Терминальный — остановлено вручную
🔴 Терминальные статусы — конечные точки жизненного цикла: документ больше не обрабатывается автоматически (🚀 в хранилище / ❌ ошибка / ⛔ отменено).
⚙️ Всю цепочку выполняет единый воркер (одна очередь, FIFO): распознавание, анализ, а загрузку в Qdrant кнопка просто ставит в очередь — ответ приходит мгновенно, прогресс виден в таблице задач. Анализ (реквизиты + теги + тематика) идёт параллельно через пул из 2 конкурентных LLM-исполнителей. При рестарте сервиса обработка продолжается с контрольных точек (распознанный текст и реквизиты сохраняются) — ничего не пересчитывается и не теряется.
✏️ Редактирование метаданных — два уровня
  • Карточка при загрузке (статус «✅ Готово»): открывается форма с полями — тематика, дата, номер, тип, отправитель, получатель, ссылка на документ, теги, краткое содержание. Правки сохраняются кнопкой «💾 Сохранить мету» до отправки в хранилище. Там же — кнопка «🚀 В Qdrant» (с проверкой дубликатов) и «🔁 Перезапустить воркер» при сбоях;
  • Прямо в коллекции (вкладка «Коллекция», статус «🚀 В хранилище»): у любого документа справа — карандашик ✏️. Открывается режим редактирования: те же поля (ссылка, тема, тип, дата, номер, отправитель, получатель) + теги (✕ удалить / «+» добавить) + 🗑 удалить документ. Изменения мгновенно пишутся во все фрагменты документа (даже если их 2500) и сразу доступны для поиска и классификации. Число чанков не редактируется — это факт хранения.
🧠 Классификация — для новых документов, которых ещё нет в хранилище
⚙️ Процесс
Автоматически, ~0.5–2 минуты. На вкладке — 3 плитки прогресса:
  • 🖼️ OCR (жёлтая — идёт, зелёная — готово) — распознавание текста через Marker. Классификация имеет приоритет: при старте она сбрасывает Marker — задачи очереди отменяются (их можно перезапустить «Повторить»), а ваш документ распознаётся первым;
  • 🔍 VECTOR — эмбеддинг текста (e5-large, 1024) и поиск соседей в Qdrant;
  • 🧠 LLM — нейросеть пишет обоснование и краткое содержание (параллельно с другими LLM-задачами через пул из 2 конкурентных исполнителей).
Ошибка любого этапа — плитка краснеет, ответ не поступит.
🎯 Как выбирается тема
  1. Текст (первые N страниц, настройка «Страниц для классификации» 1–10) режется на чанки по 1200 символов — чем больше страниц, тем больше чанков (10 страниц ≈ 17 чанков) — и превращается в векторы (модель e5-large, 1024 измерения);
  2. Для каждого чанка ищутся 25 ближайших соседей в активной коллекции (параллельно, до 6 потоков);
  3. Нормализация: от одного документа берётся не более 3 чанков — «Гиганты» (документы на сотни страниц) не заглушают остальные;
  4. Остаётся топ-10 уникальных документов; у каждой темы берётся лучший score соседа (тема с 10 посредственными соседями не побеждает тему с одним отличным);
  5. Поправка на частоту (IDF) — всегда глобальная: вес темы делится на √log(1 + число её документов в коллекции), знаменатель не бывает меньше 1 (одиночная тема не усиливается); насыщение — темы с числом документов ≥ порога штрафуются одинаково. Порог и бонус поддержки — настраиваемые, есть кнопка «🧮 Рассчитать автоматически» (по распределению частотности тем и направлений);
  6. Поддержка (kNN-голосование): каждый дополнительный документ темы в топ-10 добавляет бонус к весу (настраивается) — тема «большинства» увереннее одиночной;
  7. Ключевые слова (из справочника): слова-основы из «ключевых слов» темы, найденные в тексте (например, «уязвимост» ловит уязвимости/уязвимостей), дают мягкий бонус (по умолчанию 0.05 за слово, кап 4 слова) — доводка там, где эмбеддинги слабы, но маркерные слова совпадают. Направления и темы имеют раздельные ключевые слова и бонусы;
  8. Каскад «направление → тема»: направление определяется тем же принципом на уровне направлений — лучший score соседа направления (не сумма!) + своя поправка IDF (по числу файлов направления, своё насыщение), своя поддержка и свои ключевые слова направления. Затем основная тема выбирается только среди тематик этого направления, вероятности нормируются по направлению;
  9. Веса проходят через контраст (настройка) → вероятности тематик;
  10. Нейросеть пишет обоснование, сверяясь со справочниками отправителей/получателей.
📦 Результат — три карточки
  • 📄 Информация о документе — превью первой страницы (живёт 2 минуты — защита от несанкционированного просмотра), ID задачи, имя, размер, краткое содержание, теги;
  • 📊 Результат классификации — 🎯 основная тематика с процентом уверенности, 💡 обоснование, 📈 возможные тематики, 🔍 похожие документы;
  • ✅ Оценка — вы оцениваете правильность, накапливается статистика качества. Если верной темы нет в предложенных — выберите «Нет правильной темы» и укажите правильную из справочника: она сохранится в историю (колонка «Правильная тема») и поможет точнее оценивать качество классификации;
🔌 API для разработчиков
Вкладка «🔌 API», авторизация — Basic Auth реквизитами учётной записи
POST /api/v1/classify — классификация PDF (multipart, поле file), синхронно (1–5 мин): направление + тематика + вероятности + обоснование + «возможные тематики направления» + «иные возможные тематики» + похожие документы; требует collection (обязательный параметр)
POST /api/v1/eval    — оценка результата по task_id (1 = верна, 2 = среди предлагаемых, 3 = нет верной)
GET  /api/v1/health   — проверка доступности
💡 Каждая классификация (и из UI, и из API) попадает в «Историю классификации» с пометкой источника — оценки можно выставлять и там, и через API.
🔍 Поиск — три способа найти документ
🔍 Три способа найти документ
СпособКак работаетПример
🎯 По смыслуФраза или вопрос превращаются в вектор — находятся документы с похожим содержанием, даже если слова не совпадают. В таблице результатов — колонка «Сходство»: зелёное ≥80% — почти наверняка то, что искали«продление лицензии на ветеринарную деятельность» найдёт письма об этом другими словами
🏷️ По тегамТочное совпадение метоквсё с тегом «срочно»
📋 По реквизитамФильтры по структурированным полямтематика = «ФСТЭК» + отправитель = «Минэк» + дата за период
💡 Фильтры комбинируются. А блок «Похожие документы» в классификации — тот же поиск по смыслу, применённый автоматически.

📊 Статистика сервиса

—
🧭 Направлений в базе
—
🏷️ Тематик в базе
—
📄 Документов в коллекции
—
🧠 Проведено классификаций

1️⃣ Загрузи PDF

Перетащи PDF сюда или нажми для выбора
распознавание через Marker OCR