v3.2.0: новый LLM-промпт (STEP 1/2, фикс. типы, NOT PII, already_found), убран хардкод НУБЕС
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# Запрос к Соннету — анализ результатов DrHider v3 (2026-07-12)
|
||||
|
||||
## Контекст
|
||||
|
||||
DrHider v3 — обфускация документов через LLM + Markdown. Результаты уже есть.
|
||||
Покажи Соннету реальный mapping.csv и фрагмент обфусцированного .md.
|
||||
|
||||
## Промпт для Соннета
|
||||
|
||||
Вот текущий LLM-промпт в scanner.py:
|
||||
|
||||
```
|
||||
You are a PII detector. Find ALL sensitive or private information in the text below.
|
||||
|
||||
Return a JSON array. Each item must have:
|
||||
- "type": short snake_case label describing the entity
|
||||
(e.g. person_name, phone, email, address, inn, company, passport,
|
||||
contract_number, employee_id, bank_account — WHATEVER you see)
|
||||
- "value": the EXACT string from the text (copy verbatim)
|
||||
|
||||
Rules:
|
||||
- Copy value VERBATIM — same spaces, punctuation, case as in text
|
||||
- If same value appears multiple times — include only once
|
||||
- Invent the type label yourself based on what you see
|
||||
- Return ONLY the JSON array, no other text, no markdown wrapping
|
||||
```
|
||||
|
||||
Результат mapping.csv (первые 10 строк):
|
||||
```csv
|
||||
тип_данных,оригинал,замена
|
||||
text,"""****XXX****001****""","""****IPD****084****"""
|
||||
text,"""НУБЕС""","""ФИОЩЦ"""
|
||||
phone,+7 (495) 789-41-35,+7 (343) 986-75-93
|
||||
email,info@nubes.ru,bxkuno@company.local
|
||||
company,"ЗАО ""****XXX****001****""",ООО «Спектр»
|
||||
company,"ЗАО ""XXX001""",ЗАО «Меридиан»
|
||||
inn_ul,ИНН 9706005293,ИНН 9325731296
|
||||
text,Исполнителем Заказчику Сторонами,Морозов М.П.
|
||||
kpp,КПП 772401001,КПП 051543039
|
||||
```
|
||||
|
||||
Фрагмент обфусцированного .md:
|
||||
```markdown
|
||||
**ООО «Спектр»** именуемое в дальнейшем "Заказчик", в лице Генерального директора ФИО,
|
||||
действующего на основании Устава, и **ООО **"**НУБЕС**"**, именуемое в дальнейшем
|
||||
"Исполнитель", в лице Генерального директора Степанов Н.М.
|
||||
```
|
||||
|
||||
## Проблемы
|
||||
|
||||
1. **Контекстная роль Исполнителя** — сервис должен быть УНИВЕРСАЛЬНЫМ, без хардкода конкретных названий. LLM должна из контекста понимать: «вот эта компания — Исполнитель (сторона договора, оказывающая услуги), её НЕ заменяем». Как научить LLM этому без указания конкретных имён?
|
||||
2. **Тип "text" для многих сущностей** — LLM не всегда правильно определяет тип (например, "Исполнителем Заказчику Сторонами" — это не ПДн, а просто текст договора)
|
||||
3. **Regex находит структурированное (ИНН, телефон), LLM — остальное** — есть дублирование
|
||||
|
||||
## Вопросы
|
||||
|
||||
1. Как научить LLM определять Исполнителя из контекста договора (без хардкода имён) и НЕ заменять его данные?
|
||||
2. Как заставить LLM точнее определять тип сущности (не "text" для всего подряд)?
|
||||
3. Нужно ли добавить в промпт примеры того что НЕ является ПДн (юридические термины, роли сторон)?
|
||||
4. Стоит ли передавать LLM уже найденное regex'ом чтобы избежать дублирования?
|
||||
5. Правильно ли что промпт на английском, а документы на русском?
|
||||
|
||||
## Текущий промпт (полностью)
|
||||
|
||||
```
|
||||
You are a PII (Personally Identifiable Information) detector.
|
||||
Find ALL sensitive or private information in the text below.
|
||||
|
||||
Return a JSON array. Each item must have:
|
||||
- "type": short snake_case label describing the entity
|
||||
(e.g. person_name, phone, email, address, inn, company, passport,
|
||||
contract_number, employee_id, bank_account — WHATEVER you see)
|
||||
- "value": the EXACT string from the text (copy verbatim)
|
||||
|
||||
Rules:
|
||||
- Copy value VERBATIM — same spaces, punctuation, case as in text
|
||||
- If same value appears multiple times — include only once
|
||||
- Invent the type label yourself based on what you see
|
||||
- Return ONLY the JSON array, no other text, no markdown wrapping
|
||||
|
||||
Text:
|
||||
{combined[:8000]}
|
||||
```
|
||||
@@ -0,0 +1,47 @@
|
||||
# Ответ Соннета v2 — улучшение LLM-промпта (2026-07-12)
|
||||
|
||||
## Q1. Как научить LLM определять Исполнителя из контекста?
|
||||
|
||||
**Двухфазная инструкция в промпте:**
|
||||
- STEP 1: определи кто «Исполнитель» — его данные НЕ трогать
|
||||
- STEP 2: найди всё остальное ПДн
|
||||
|
||||
Убирает хардкод `НУБЕС` из кода. Работает на любом договоре.
|
||||
|
||||
## Q2. Точная классификация типов
|
||||
|
||||
Вместо `"Invent the type label yourself"` → **фиксированный список:**
|
||||
`person_name, company, phone, email, address, inn, kpp, ogrn, bik, passport, contract_number, bank_account, other_id`
|
||||
|
||||
Если сомневаешься — НЕ включай.
|
||||
|
||||
## Q3. Примеры что НЕ является ПДн
|
||||
|
||||
Обязательно добавить блок:
|
||||
```
|
||||
NOT PII:
|
||||
- Юридические роли: Исполнитель, Заказчик, Стороны
|
||||
- Термины договора: Услуги, Приложение, Договор, НДС
|
||||
- Должности: Генеральный директор
|
||||
- Сама компания-Исполнитель
|
||||
```
|
||||
|
||||
## Q4. Передавать LLM уже найденное regex'ом
|
||||
|
||||
`scan_llm_ner` получает `mapping.keys()` → промпт: "Already captured (skip these): ..."
|
||||
Исключает дублирование, экономит токены.
|
||||
|
||||
## Q5. Язык промпта
|
||||
|
||||
Гибрид: структурные инструкции на английском, NOT PII и роли — на русском.
|
||||
|
||||
---
|
||||
|
||||
## План реализации (scanner.py)
|
||||
|
||||
1. Убрать хардкод `НУБЕС` из `scan_regex`
|
||||
2. `scan_llm_ner` — передавать `mapping.keys()` как "Already captured"
|
||||
3. Новый промпт:
|
||||
- Фиксированный список типов
|
||||
- Блок NOT PII (русский)
|
||||
- Двухфазная инструкция (STEP 1: Исполнитель, STEP 2: остальное)
|
||||
Reference in New Issue
Block a user