[core] privacy: scrub() и pseudo_id() + тесты #2
Notifications
Due Date
No due date set.
Blocks
Depends on
#7 [bot] LLM-шлюз: GigaChat + mock, extract / risk_classify / phrase / summarize
MedITron/PTSRaiAgent
#1 [devops] Каркас: uv-проект, docker-compose, Makefile, CI
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#2
Reference in New Issue
Block a user
Описание
Guardrail №1: в LLM уходит только обезличенный текст. SPEC §2, §3.
Желаемый результат
app/core/privacy.py:scrub(text) -> strзаменяет на плейсхолдеры: телефоны РФ, email, СНИЛС, паспорт, ИНН, даты рождения, адреса (улица/дом), ФИО по словарю частых имён/фамилий + капитализированные пары, номера карт, ссылки на соцсети.pseudo_id(snils) -> str— HMAC-SHA256(PSEUDO_KEY), 32 hex-символа.tests/test_privacy.py: ≥ 20 кейсов, включая ложные срабатывания (обычные слова не портятся).Как проверить
make test—test_privacy.pyзелёный.Лог выполнения
2026-10-03
2026-10-03
scrub(text) -> ScrubbedTextиpseudo_id(snils, key=None) -> strвapp/core/privacy.py; словарь имён вынесен вconfig/privacy/names_ru.yaml(имена + уменьшительные, неоднозначные имена/формы, стоп-слова для фамилий); тестыtests/test_privacy.py.[PHONE] [EMAIL] [SNILS] [PASSPORT] [INN] [CARD] [DATE] [ADDRESS] [NAME] [URL] [HANDLE]; 101 тест вtest_privacy.py(идентификаторы, ФИО, ложные срабатывания на клиническом тексте, идемпотентность,pseudo_id),make lint testзелёный.[NAME](может перезакрыть город — сознательный компромисс). -ин/-ын — только рядом с именем (названия препаратов: Феварин, Глицин).pseudo_id: нормализация до 11 цифр, иначеValueError; контрольная сумма СНИЛС не проверяется (синтетика). Ключ —PSEUDO_KEYкак UTF-8 байты.