🤖 Как это работает?
Четыре простых сценария — от настройки до поиска. Нажми, чтобы развернуть.
⚙️ Настройка — один раз, чтобы система говорила на вашем языке
📖 Справочники (вкладка «Справочники») — замкнутые списки, из которых система обязана выбирать. Нейросети запрещено сочинять свои значения:
- 🏷️ Тематики — перечень тем для классификации («МРГ 1279», «ФСТЭК», «ГИС ГМП»...). Чем точнее список, тем чётче разделение документов;
- 🏢 Отправители — организации, от которых приходят письма. Реквизиты стандартизированы: «Минэк», а не «Министерство экономического развития РФ»;
- 📬 Получатели — организации-адресаты;
- 📥 Типы документов — письма, приказы, протоколы, соглашения...
⚙️ Параметры загрузки (Настройки → «📤 Загрузка»)
- 📄 Лимит страниц загрузки (max_pages_load) — сколько первых страниц PDF обрабатывать при загрузке в хранилище. 0 = весь документ. Если документ длиннее лимита — сервис предупредит «в хранилище попадёт только начало». Полезно для больших файлов: экономит время распознавания;
- 🏷️ Автотеги при загрузке (auto_tags) — записывать ли предложенные нейросетью теги сразу в хранилище, или вы решаете сами при проверке карточки.
🧠 Параметры классификации (Настройки → «Классификация»)
- 🏷️ Предложения тегов (tag_suggestions) — показывать ли нейросетевые теги при классификации (бейджи в карточке результата);
- 🎚️ Контраст (contrast) — 1..100, насколько резко «выпячивать» главную тематику: высокий контраст делает разницу между основной темой и остальными более драматичной (100 = почти всегда 100% у лидера), низкий — распределение вероятностей более ровное, когда темы похожи;
- 🏷️ Учёт тегов (use_tags) — учитывать ли пересечение тегов документа с тегами похожих документов при расчёте сходства. Включите — если документы одной темы обычно помечены одинаковыми тегами;
- 📈 Сила бонуса тегов (tag_boost) — 0..0.3, насколько сильно теги влияют на score: 0 = не влияют, 0.3 = существенно усиливают совпадение по тегам;
- 📄 Лимит страниц классификации (max_pages) — сколько первых страниц распознавать для классификации нового документа (быстрее; 0 = все).
📝 Промпты (Настройки → «Промты») — тексты заданий для нейросети:
- 📝 Реквизиты и содержание — извлечение даты, номера, отправителя, получателя, темы + краткое содержание (при загрузке);
- 💡 Обоснование тематики — почему выбрана именно эта тема;
- 📝 Краткое содержание (классификация) — summary для вкладки классификации;
- 🏷️ Автотеги — генерация тегов-предложений.
🗄️ Коллекция (Настройки → «Коллекция») — резервные копии и точность поиска:
- 📸 Создать снапшот — мгновенная резервная копия коллекции (≈1 сек, ~600 МБ). Рекомендуется после каждого массового наполнения;
- ⬆️ Загрузить снапшот — восстановить коллекцию из копии (заменяет текущую! подтверждение перед запуском). Восстановление занимает 2–3 секунды;
- 🗑 Удалить снапшот — освободить место (каждый ~600 МБ);
- 💡 Зачем снапшоты: защищают от потери данных — например, при сбое или случайном удалении документов. Храните 2–3 последних;
- 🎯 Порог точности поиска (0–100%) — фильтр для поиска по смыслу в коллекции: показываются только документы со сходством не ниже порога. 0% = без отсечки (показывать всё). Чем выше порог — тем меньше «мусора», но можно потерять погранично похожие документы. Рекомендация: 60–80%.
💡 Важно: к промптам «Реквизиты» и «Обоснование» сервис автоматически дописывает блок «ДОСТУПНЫЕ ЗНАЧЕНИЯ» из справочников — нейросеть обязана выбирать отправителя/получателя/тематику только из ваших списков. В редактируемый текст промпта этот блок не попадает.
📥 Наполнение коллекции — загрузите PDF, дальше всё само
Коллекция — семантическое хранилище: документы лежат «по смыслу» (векторами), у каждого — структурированная карточка. Каждый документ проходит цепочку статусов:
🕐
В очереди
Документ принят, ждёт распознавания
→
⏳
Распознавание
GPU читает PDF; если длиннее лимита — предупреждение
→
🧠
Анализ
Реквизиты + тематика по похожим документам
→
✅
Готово
Карточка открыта для проверки и правок
→
📤
Загрузка в Qdrant
Эмбеддинг + запись в хранилище (виден прогресс %)
→
🚀
В хранилище
Терминальный ✅ — готов к поиску
❌
Ошибка
Терминальный — с причиной; можно повторить
⛔
Отменено
Терминальный — остановлено вручную
🔴 Терминальные статусы — конечные точки жизненного цикла: документ больше не обрабатывается автоматически (🚀 в хранилище / ❌ ошибка / ⛔ отменено).
✏️ Редактирование метаданных — два уровня:
- Карточка при загрузке (статус «✅ Готово»): открывается форма с полями — тематика, дата, номер, тип, отправитель, получатель, ссылка на документ, теги, краткое содержание. Правки сохраняются кнопкой «💾 Сохранить мету» до отправки в хранилище. Там же — кнопка «🚀 В Qdrant» (с проверкой дубликатов) и «🔁 Перезапустить воркер» при сбоях;
- Прямо в коллекции (вкладка «Коллекция», статус «🚀 В хранилище»): у любого документа справа — карандашик ✏️. Открывается режим редактирования: те же поля (ссылка, тема, тип, дата, номер, отправитель, получатель) + теги (✕ удалить / «+» добавить) + 🗑 удалить документ. Изменения мгновенно пишутся во все фрагменты документа (даже если их 2500) и сразу доступны для поиска и классификации. Число чанков не редактируется — это факт хранения.
🧠 Классификация — для новых документов, которых ещё нет в хранилище
Процесс (автоматически, ~1–2 минуты):
- PDF распознаётся теми же OCR-мощностями;
- Текст превращается в векторы — числовые «отпечатки смысла»;
- Система ищет в хранилище документы с похожим смыслом;
- Тематика определяется статистически по соседям (теги усиливают сходство);
- Нейросеть пишет обоснование — почему выбрана именно эта тема;
- Готовится краткое содержание.
- 📄 Информация о документе — превью первой страницы (живёт 2 минуты — защита от несанкционированного просмотра), ID задачи, имя, размер, краткое содержание, теги;
- 📊 Результат классификации — 🎯 основная тематика с процентом уверенности, 💡 обоснование, 📈 возможные тематики, 🔍 похожие документы;
- ✅ Оценка — вы оцениваете правильность, накапливается статистика качества.
POST /api/v1/classify — классификация PDF: тематика + обоснование + теги + соседи; возвращает task_id
POST /api/v1/eval — оценка результата по task_id (1 = верна, 2 = среди предлагаемых, 3 = нет верной)
GET /api/v1/health — проверка доступности
POST /api/v1/eval — оценка результата по task_id (1 = верна, 2 = среди предлагаемых, 3 = нет верной)
GET /api/v1/health — проверка доступности
💡 Каждая классификация (и из UI, и из API) попадает в «Историю классификации» с пометкой источника — оценки можно выставлять и там, и через API.
🔍 Поиск — три способа найти документ
| Способ | Как работает | Пример |
|---|---|---|
| 🎯 По смыслу | Фраза или вопрос превращаются в вектор — находятся документы с похожим содержанием, даже если слова не совпадают | «продление лицензии на ветеринарную деятельность» найдёт письма об этом другими словами |
| 🏷️ По тегам | Точное совпадение меток | всё с тегом «срочно» |
| 📋 По реквизитам | Фильтры по структурированным полям | тематика = «ФСТЭК» + отправитель = «Минэк» + дата за период |
💡 Фильтры комбинируются. А блок «Похожие документы» в классификации — тот же поиск по смыслу, применённый автоматически.
📊 Статистика сервиса
—
🏷️ Тематик в базе
—
📄 Документов в коллекции
—
🧠 Проведено классификаций
1️⃣ Загрузи PDF
Перетащи PDF сюда или нажми для выбора
распознавание через Marker OCR
распознавание через Marker OCR
🧠 Классификация документа
Загрузи PDF — он будет распознан через Marker, найдены похожие документы в Qdrant, и по ним определена наиболее вероятная тематика.
Перетащи PDF сюда или нажми для выбора
📊 История классификации
📈 Распределение оценок
🗒️ Оценки
| Дата | Файл | Основная тема | Score | Источник | Оценка | task_id |
|---|
📖 Справочники
Табличное управление: добавление, переименование, удаление значений. Сохраняется в SQLite.
🏷️ Тематики
| Значение |
|---|
🏢 Отправители
| Значение |
|---|
📬 Получатели
| Значение |
|---|
📥 Типы документов
| Значение |
|---|
📊 Распределение по темам
🗄️ Документы в хранилище
| Сходство | Ссылка | Тема | Тип | Дата | Номер | Отправитель | Получатель | Чанков | Теги |
|---|
🩺 Статус сервисов
Состояние зависимых сервисов на ПК.
| Сервис | Статус |
|---|
🗄️ Коллекция
Активная коллекция, снапшоты и точность поиска. Переключение коллекции меняет, куда грузятся документы и где идёт поиск.
Загрузка, поиск, классификация и снапшоты работают с этой коллекцией.
В коллекции показываются только документы со сходством не ниже порога. 0% — показывать всё.
| Снапшот | Размер | Создан | Действия |
|---|---|---|---|
| Загрузка... | |||
Снапшотов пока нет. Нажмите «Создать снапшот», чтобы сделать резервную копию коллекции.
📤 Загрузка
Поведение при загрузке документов.
Qwen предлагает теги при распознавании — кликабельные бейджи в форме. Подсказки не пишутся в Qdrant сами по себе.
При включении автотеги (предложенные Qwen) автоматически записываются в Qdrant вместе с пользовательскими. Пользовательские теги записываются всегда.
В Qdrant загружаются только первые N страниц документа. 0 = весь документ.
🧠 Классификация
Тематика по соседям + обоснование выбора (Qwen).
Чем выше — тем резче разница между темами: лидер усиливается, аутсайдеры гаснут. 1 — без контраста.
При поиске похожих документов учитываются теги: соседи с пересечением тегов получают бонус к score.
0 — без бонуса (только векторы). 0.3 — максимальный бонус за совпавшие теги.
Распознаются только первые N страниц — классификация быстрее. 0 = весь документ.
🗑️ Очистка истории оценок классификации:
📝 Промты
Редактирование промтов LLM. Применяются сразу при следующем вызове.
👤 Учётная запись
Смена логина и пароля, выход из системы.
🔌 API классификации
Публичный REST API для классификации PDF-документов. Отдельная авторизация — не путать с логином админа.
🌐 Базовый URL
https://owl.seganim.ru
🔑 Авторизация
| Тип | Логин | Пароль |
|---|---|---|
| Basic Auth | api | ApiKey2026! |
Заголовок:
Authorization: Basic base64(api:ApiKey2026!)📄 Метод: POST /api/v1/classify
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
file | file (multipart/form-data) | ✅ | PDF-файл для классификации |
Время ответа: 1-5 мин (Marker OCR + эмбеддинги + Qwen).
📦 Ответ (JSON)
{
"file": "письмо.pdf",
"task_id": "cls_1786879199882",
"main_topic": "ГИС ГМП",
"main_topic_score": 0.72,
"rationale": "Документ упоминает ГИС ГМП и заседание рабочей группы — тематика совпадает с соседями в базе",
"tags": ["ГИС ГМП", "заседание"],
"summary": "Письмо приглашает на заседание рабочей группы по вопросам внедрения ГИС ГМП, назначенное на 15 марта. Указаны повестка дня и список участников.",
"topics": [
{"topic": "ГИС ГМП", "score": 0.72},
{"topic": "МРГ 1279", "score": 0.18}
],
"neighbors": [
{"date": "2026-08-10", "doc_number": "12-45/2026", "sender": "Минэк", "topic": "ГИС ГМП", "score": 0.99}
]
}
task_id — уникальный ID задания: верните его в /api/v1/eval при оценке результата (запись обновится, не продублируется).✅ Метод: POST /api/v1/eval
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
task_id | string | ✅ | ID задания из ответа classify — файл, тема и score берутся из истории автоматически |
correctness | int | — | 1 = основная верна, 2 = верна среди предлагаемых, 3 = нет верной |
Ответ:
{"ok": true, "id": 58, "task_id": "cls_...", "correctness": 1, "updated": true} · если task_id не найден — 404🩺 Метод: GET /api/v1/health
Проверка доступности API.
{"status": "ok", "service": "doc-manager-classify", "version": "1.0"}
🧪 Тест-кейс (curl)
# Проверка здоровья
curl -u api:ApiKey2026! https://owl.seganim.ru/api/v1/health
# Классификация PDF
curl -u api:ApiKey2026! -X POST \
https://owl.seganim.ru/api/v1/classify \
-F "file=@/путь/к/документу.pdf"
# Оценка результата (task_id — из ответа classify)
curl -u api:ApiKey2026! -X POST \
https://owl.seganim.ru/api/v1/eval \
-H "Content-Type: application/json" \
-d '{"task_id":"cls_...","correctness":1}'
Python:
import requests
r = requests.post(
"https://owl.seganim.ru/api/v1/classify",
auth=("api", "ApiKey2026!"),
files={"file": open("документ.pdf", "rb")},
timeout=600,
)
print(r.json())