57 lines
2.5 KiB
Python
57 lines
2.5 KiB
Python
import os
|
|
import json
|
|
from modules.database import add_rule_to_db
|
|
|
|
try:
|
|
from modules.knowledge_base import save_rule
|
|
except ImportError:
|
|
try:
|
|
from modules.knowledge_base import add_rule as save_rule
|
|
except ImportError:
|
|
save_rule = None
|
|
|
|
|
|
def review_ai_decisions(report_text, suspicious_cases):
|
|
"""
|
|
Интерактивный консольный модуль обучения (Human-in-the-Loop).
|
|
Запрашивает подтверждение оператора ТОЛЬКО по нетипичным/сложным случаям.
|
|
"""
|
|
if not suspicious_cases:
|
|
print("\n[✓] Все аномалии валидированы автоматически. Спорных вопросов для оператора нет.")
|
|
return
|
|
|
|
print("\n" + "=" * 60)
|
|
print("РЕЖИМ ОБУЧЕНИЯ И ПРОВЕРКИ РЕШЕНИЙ ИИ (HUMAN-IN-THE-LOOP)")
|
|
print("=" * 60)
|
|
|
|
for idx, case in enumerate(suspicious_cases, 1):
|
|
fio_target = case.get('fio_target', 'Неизвестно')
|
|
reason = case.get('reason', 'Нет описания')
|
|
|
|
print(f"\n[?] Спорный случай {idx}/{len(suspicious_cases)}: {fio_target}")
|
|
print(f" Детали: {reason}")
|
|
|
|
user_input = input("Подтверждаете аномалию? (д / да / н / нет / или введите текст правила): ").strip()
|
|
user_input_clean = user_input.lower()
|
|
|
|
# Расширенный список вариантов "ДА"
|
|
if user_input_clean in ['д', 'да', 'da', 'yes', 'y', 'ок', 'ага', '+']:
|
|
print(" [✓] Решение подтверждено оператором.")
|
|
elif user_input_clean in ['н', 'нет', 'no', 'n', '-']:
|
|
print(" [ℹ️] Решение отклонено оператором.")
|
|
elif user_input:
|
|
# Если оператор ввел действительно новое текстовое правило
|
|
new_rule = f"Правило по {fio_target}: {user_input}"
|
|
|
|
add_rule_to_db(new_rule, added_by="Human_Admin")
|
|
if save_rule:
|
|
try:
|
|
save_rule(new_rule)
|
|
except Exception:
|
|
pass
|
|
|
|
print(f" [✓] Новое правило записано в Базу Знаний: {new_rule}")
|
|
else:
|
|
print(" [ℹ️] Запись пропущена.")
|
|
|
|
print("\n[✓] ЭТАП ОБУЧЕНИЯ ЗАВЕРШЕН.") |