From 522fb7717ee90b8240f676835b437a10784eb6de Mon Sep 17 00:00:00 2001 From: ed0ss Date: Sat, 20 Jun 2026 20:10:28 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B2=20Qdrant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена функция sanitize_pii() в chunking.py - Удаляются номера телефонов, email-адреса, русские имена в обращениях - Фикс NON_SOLUTION убраны ложные срабатывания на штатные фразы закрытия --- backend/app/services/chunking.py | 28 ++++++++++++++++++++++++++-- backend/app/services/vector_store.py | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/backend/app/services/chunking.py b/backend/app/services/chunking.py index 2c4388f..e98eaf6 100644 --- a/backend/app/services/chunking.py +++ b/backend/app/services/chunking.py @@ -3,17 +3,41 @@ from typing import Optional NON_SOLUTION = re.compile( r"(уточнит|приложите скрин|какая ошибка|с какой проблемой" - r"|нет обратной связи|запрос завершу|открыть его снова" - r"|откройте новый|обратиться в службу поддержки" + r"|нет обратной связи" + r"|обратиться в службу поддержки" r"|свяжитесь с технической" r"|напишите нам|позвоните нам)", re.I ) +PHONE = re.compile(r"\+?7\d{10}|8\d{10}") +EMAIL = re.compile(r"[\w.+-]+@[\w-]+\.[\w.]+") + +# Common Russian first names (vocative/именительный падеж) +# followed by comma, dot, exclamation or question mark +RUSSIAN_NAME = re.compile( + r"\b(Анастасия|Татьяна|Михаил|Кристина|Александр|Елена" + r"|Ольга|Мария|Иван|Дмитрий|Андрей|Юлия|Анна|Наталья" + r"|Ирина|Екатерина|Владимир|Николай|Алексей|Сергей" + r"|Максим|Роман|Виктор|Павел|Артем|Денис|Константин" + r"|Галина|Людмила|Надежда|София|Вероника|Полина" + r"|Алёна|Светлана|Вера|Маргарита|Лариса|Василий" + r"|Виталий|Артур|Эдуард|Валентина|Зоя|Лидия)[,\.!?]", + re.I +) + + +def sanitize_pii(text: str) -> str: + text = PHONE.sub("[ТЕЛЕФОН]", text) + text = EMAIL.sub("[EMAIL]", text) + text = RUSSIAN_NAME.sub("[ИМЯ]", text) + return text + def clean_text(text: str) -> str: text = re.sub(r'\[/?q\].*?\[/q\]', '', text, flags=re.DOTALL | re.IGNORECASE) text = re.sub(r'https?://\S+', '', text) text = re.sub(r'\s+', ' ', text).strip() + text = sanitize_pii(text) return text diff --git a/backend/app/services/vector_store.py b/backend/app/services/vector_store.py index 816fc12..bf93956 100644 --- a/backend/app/services/vector_store.py +++ b/backend/app/services/vector_store.py @@ -59,7 +59,7 @@ def get_existing_ticket_ids(tenant_id: str, collection_id: str) -> set[str]: points, _ = client.scroll( collection_name=COLLECTION_NAME, limit=10000, - filter=scroll_filter, + scroll_filter=scroll_filter, with_payload=True, with_vectors=False, )