8.3 KiB
Задание Opus — сервис обфускации документов «DrHider»
Файл: /home/naeel/nubes/contracts/contracts-flask/History/opus-drhider-request-2026-06-29.md
Дата: 29.06.2026
Контекст
Есть работающий сервис сверки договоров (https://contracts.kube5s.ru/docs/pipeline):
- Загрузка .docx/.pdf/.doc/zip
- Парсинг → классификация → группировка → LLM-сравнение → результат
Пользователь (юрист) загружает реальные документы с чувствительными данными. Даже в закрытом контуре он может не хотеть передавать реальные ФИО/телефоны/адреса/названия компаний.
Задача
Сделать DrHider — сервис обфускации документов перед загрузкой в основной сервис.
URL: https://contractor.pythonk8s.services.ngcloud.ru/DrHider
UI: такая же страница загрузки, как в основном сервисе (выбор файлов, drag&drop, прогресс).
На вход: те же форматы — .docx, .pdf, .doc, .zip (с файлами внутри).
На выходе: ZIP-архив, содержащий:
- Обфусцированные файлы (те же имена, то же форматирование)
mapping.csv— таблица соответствия:тип_данных, оригинал, замена
Требования к обфускации:
-
Согласованность (главное): одна и та же сущность во всех документах заменяется на одно и то же фиктивное значение. «Иванов И.И.» везде → «Смирнов А.Б.». «ООО Ромашка» везде → «ООО Василёк». Иначе группировка и сравнение сломаются.
-
Что заменять:
- ФИО физических лиц
- Названия компаний/контрагентов (ООО, ЗАО, ИП и т.д.)
- Телефоны (+7, 8-800, городские)
- Email-адреса
- Почтовые и юридические адреса
- ИНН, ОГРН, КПП, расчётные счета, БИК
- Паспортные данные (серия/номер)
- Номера договоров? (спорно — они нужны для группировки. Может, заменять с сохранением уникальности?)
-
Что НЕ заменять:
- Названия услуг (colocation, аренда стойки, etc.)
- Цены, количества, суммы (это предмет сверки)
- Даты (важны для порядка допников)
- Единицы измерения (шт., м², кВт·ч)
-
Качество замены:
- Имена → случайные русские ФИО (из словаря имён/фамилий)
- Компании → случайные названия ООО (из словаря или генерированные)
- Телефоны → валидные номера того же формата (+7 9XX ...)
- Email → валидные адреса на фиктивных доменах
- Адреса → правдоподобные (город из словаря + улица + дом)
- ИНН/ОГРН → валидные контрольные суммы
-
Формат .docx: сохранить стили, таблицы, форматирование. Замена — поиск-замена по тексту внутри XML (python-docx).
-
Формат .pdf: сложнее — pdfplumber только читает. Для записи нужно: либо (а) pymupdf/fitz для редактирования текста, либо (б) сгенерировать новый PDF из извлечённого текста с заменами. Какой подход для MVP?
-
ZIP на выходе: запаковать обфусцированные файлы + mapping.csv в один ZIP.
Интеграция с основным сервисом
Обфусцированные файлы должны корректно проходить основной пайплайн:
- Парсинг — ОК (форматы те же)
- Классификация — ОК (обфусцированные названия компаний, но номера договоров узнаваемы)
- Группировка — ОК (parent_number сохраняется)
- LLM-сравнение — ОК (ADD/UPDATE/DELETE по услугам, просто имена компаний заменены)
Архитектурные вопросы
⛔ КРИТИЧЕСКОЕ ТРЕБОВАНИЕ: никаких следов реальных документов.
- Без БД. Вся обработка — в оперативной памяти. Никакого хранения.
- Без временных файлов с реальными данными. Файлы читаются в память, обрабатываются, результат пишется. Промежуточные файлы на диске — только обфусцированные.
- Без логирования реальных данных. Логи — только «обработано N файлов», без содержимого.
- Поток: загрузка → двухпроходная обработка в памяти → ZIP на выходе → HTTP-ответ → очистка памяти.
- mapping.csv — единственное место где реальные данные «сохраняются», и то внутри ZIP, который уходит пользователю. На сервере не остаётся.
- После завершения запроса: вся память освобождается, временная директория (если была) — удаляется.
-
Где исполняется? Варианты:
- На VM (рядом с convert_server.py) — тот же стек, проще интеграция
- Отдельный managed-сервис — отдельный деплой, изоляция
-
Обнаружение сущностей: как находить что заменять?
- Regex-паттерны (телефоны, email, ИНН — однозначно)
- NER через LLM? (найти ФИО, компании, адреса в тексте)
- Гибрид: regex для формальных, LLM для имён/адресов?
-
Согласованность замены: как обеспечить сквозную замену?
- Глобальный словарь mapping в памяти на время обработки
- Сначала просканировать все файлы → собрать все сущности → сгенерировать замены → применить
-
API или отдельная страница?
- Отдельная HTML-страница с upload-формой (как index.html)
- Или API-endpoint
/api/drhiderна VM, вызываемый с Flask-фронтенда
-
PDF-запись: pymupdf (AGPL, лицензия!) или другой способ?
Ожидаемый ответ
- Детальный план: архитектура, компоненты, поток данных
- Способ обнаружения сущностей: regex + NER? только regex на MVP?
- PDF-запись: pymupdf или альтернатива?
- Согласованность: алгоритм двухпроходного сканирования
- Интеграция: где код, как связать с основным сервисом
- MVP — что в первой версии, что потом
- Риски: где может сломаться (например, PDF с текстом в кривых кодировках, docx с колонтитулами)