[core] privacy: scrub() и pseudo_id() + тесты #2

Closed
opened 2026-10-03 14:38:52 +03:00 by Eleboba · 0 comments
Owner

Описание

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 зелёный.
  • Заметки/решения:
    • Детерминированный пайплайн regex → токенный проход по именам; порядок от длинных форматов к коротким (карта → СНИЛС → телефон → паспорт → ИНН).
    • Идемпотентность: латинские плейсхолдеры + итерация до неподвижной точки.
    • Имена: словарь с генерацией падежных форм; неоднозначные (Вера, Надежда, Роман, Слава…) — только в контексте (середина предложения, рядом отчество/фамилия, после «меня зовут»). Фамилии на -ов/-ская в середине предложения и пары капитализированных слов → [NAME] (может перезакрыть город — сознательный компромисс). -ин/-ын — только рядом с именем (названия препаратов: Феварин, Глицин).
    • 11 цифр, начинающиеся с 8: СНИЛС, если сходится контрольная сумма, иначе телефон.
    • pseudo_id: нормализация до 11 цифр, иначе ValueError; контрольная сумма СНИЛС не проверяется (синтетика). Ключ — PSEUDO_KEY как UTF-8 байты.
## Описание 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` зелёный. - **Заметки/решения:** - Детерминированный пайплайн regex → токенный проход по именам; порядок от длинных форматов к коротким (карта → СНИЛС → телефон → паспорт → ИНН). - Идемпотентность: латинские плейсхолдеры + итерация до неподвижной точки. - Имена: словарь с генерацией падежных форм; неоднозначные (Вера, Надежда, Роман, Слава…) — только в контексте (середина предложения, рядом отчество/фамилия, после «меня зовут»). Фамилии на -ов/-ская в середине предложения и пары капитализированных слов → `[NAME]` (может перезакрыть город — сознательный компромисс). -ин/-ын — только рядом с именем (названия препаратов: Феварин, Глицин). - 11 цифр, начинающиеся с 8: СНИЛС, если сходится контрольная сумма, иначе телефон. - `pseudo_id`: нормализация до 11 цифр, иначе `ValueError`; контрольная сумма СНИЛС не проверяется (синтетика). Ключ — `PSEUDO_KEY` как UTF-8 байты.
Eleboba added this to the M1 Каркас milestone 2026-10-03 14:38:52 +03:00
Eleboba added the safetyP0corefeaturesize/0.5 labels 2026-10-03 14:38:52 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#2