7.7 KiB
Запрос для Opus — План: группировка, прогресс, промежуточные результаты
Что сказал заказчик (дословно)
Не распознано (8 файлов) [supplement] допник-1-XXX002-01200_3.docx ... — нет базового договора №01219_3 ... зачем нам базовый договор? Вся информация есть в допниках и спеках
Было бы хорошо пояснить или показать процесс, что в каком порядке происходит. Так видно только текущую операцию
наверно я захочу иметь возможность посмотреть любые промежуточные результаты
Что нужно
Заказчик хочет три улучшения (без фанатизма, главное — устойчивость и понятный UI):
#1 — Группировка без базовых договоров
Проблема: сейчас group_documents() требует contract-файл как якорь группы. Без него допники/спеки попадают в unresolved с текстом «нет базового договора №X». Заказчик: «зачем нам базовый договор? Вся информация есть в допниках и спеках».
Нужно: группировать документы по parent_number / own_number, даже если contract-файл отсутствует в загрузке. Создавать «виртуальную» группу без contract-файла.
Вопросы:
- Алгоритм: что приоритетнее —
parent_numberот допника илиown_numberот спеки? Если оба ссылаются на один нормализованный номер — это одна группа? - Если два допника с одним
parent_number, но разнымиcounterparty— одна группа или разные? - Как назвать группу без contract-файла:
"№01300_2 — ЗАО XXX003"из данных классификации? Достаточно? - Минимальный diff в
group_documents()— чтобы не сломать текущую логику с contract-файлами?
#2 — Прогресс пайплайна
Проблема: юзер видит только статус текущей операции. Непонятно что уже сделано, что предстоит.
Нужно: визуальная шкала этапов с иконками статуса.
Вопросы:
- Достаточно 4 этапов: Загрузка → Классификация → Группировка → Сравнение? (Парсинг — подэтап загрузки, не показывать отдельно)
- Где разместить: в топбаре (всегда видно, не скроллится) или в карточке с результатами?
- При переклассификации после удаления/добавления файла — сбрасывать всю шкалу или только затрагиваемые этапы?
#3 — Промежуточные результаты
Проблема: юзер хочет видеть что LLM вернула на каждом шаге: сырой ответ, как определился номер/тип/дата.
Нужно: раскрывающийся блок с деталями для каждого файла.
Вопросы:
- Что хранить: сырой ответ LLM + распарсенный JSON? Достаточно двух новых полей в
documents? - Где показывать: раскрывающийся блок под строкой файла в таблице? Или модалка при клике на статус?
- Нужно ли для сравнения (process-v2 SSE) или только для классификации?
#4 — Общие ограничения
Что из трёх самое трудозатратное и что можно упростить без потери юзабилити?
Релевантные файлы (читать)
Группировка (#1)
contractor/deploy/services/grouping.py—group_documents(),normalize_number(),apply_groups()contractor/deploy/db/documents.py— поляdoc_type,own_number,parent_number,counterparty,classify_statuscontractor/deploy/db/contracts.py—insert(), поляnumber,clientcontractor/deploy/db/supplements.py—insert(),list_by_contract()
Прогресс-бар (#2) + Промежуточные результаты (#3)
contractor/index.cfm— HTML-оболочка, топбар (.topbar,position: sticky), карточки, модалкиcontractor/deploy/app.js— весь фронтенд: загрузка,runClassify(),loadGroups(),runCompareForGroup(),showClassifyBtn(), рендеринг таблицы и группcontractor/deploy/app_utils.js— утилиты:removeFile(),renderTable()contractor/deploy/convert_server.py— роутер (do_GET,do_POST,do_DELETE), SSE (_handle_process_v2), эндпоинты/api/classify-batch,/api/groups,/api/batch-progress,/api/sync
Общий контекст
contractor/deploy/services/classify.py—classify_batch(),_smart_extract(),_call_llm_classify(),_safe_json_parse()contractor/deploy/services/process.py—run_pipeline()(SSE для сравнения: extract/diff)contractor/deploy/services/grouping.py—group_documents(),apply_groups()contractor/deploy/llm_prompt.py—build_prompt(),build_classify_prompt()contractor/deploy/db/connection.py—query(),execute(),execute_returning()
Игнорировать (не относится к делу)
contracts-app/— старый Python-бэкенд (Flask), не используетсяcontracts-vm/— старые конфиги ВМDOC/,FILES/— документация, заметкиdogovora/— тестовые файлы договоровhistory/,History/— старые сессионные заметки (кроме этого файла)contractor/*.cfmкромеindex.cfm— старый Lucee-код, не используетсяcontractor/deploy/nginx-contracts.conf— конфиг nginxcontractor/deploy/convert_doc.py— конвертер .doc → .docxcontractor/deploy/sync.sh— скрипт деплояcontractor/upload.cfm,contractor/process.cfm,contractor/parser.cfmи т.д. — старый Lucee-код
Архитектура (кратко)
- Фронт:
index.cfm(Lucee, только HTML-оболочка) → грузитapp.js+app_utils.jsс ВМ (https://contracts.kube5s.ru/static/) - Бэкенд: Python 3.12
http.server+ThreadingMixInна ВМ (5.172.178.213), порт 8766, systemd-сервисcontracts - Все endpoint'ы: в
convert_server.py(один файл-роутер, ~400 строк) - БД: PostgreSQL 16, прямой доступ через
psycopg2, connection pool - Таблицы:
documents,supplements,contracts,spec_events,spec_current,prompts - LLM: gpt-oss-120b через
api.aillm.ru, httpx с http2,temperature=0.1,max_tokens=8000