проект теперь работает с использованием локальной базы данных SQLite. Все данные аккумулируются и хранятся в ней. Впереди - разработка веб интерфейса.
This commit is contained in:
+50
-26
@@ -1,33 +1,57 @@
|
||||
from modules.knowledge_base import add_rule_to_kb
|
||||
import os
|
||||
import json
|
||||
from modules.database import add_rule_to_db
|
||||
|
||||
def review_ai_decisions(ai_report, suspicious_cases):
|
||||
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).
|
||||
Запрашивает подтверждение оператора ТОЛЬКО по нетипичным/сложным случаям.
|
||||
"""
|
||||
print("\n" + "="*60)
|
||||
print("РЕЖИМ ОБУЧЕНИЯ И ПРОВЕРКИ РЕШЕНИЙ ИИ (HUMAN-IN-THE-LOOP)")
|
||||
print("="*60)
|
||||
|
||||
if not suspicious_cases:
|
||||
print("Спорных случаев для обучения сегодня не обнаружено.")
|
||||
print("\n[✓] Все аномалии валидированы автоматически. Спорных вопросов для оператора нет.")
|
||||
return
|
||||
|
||||
for case in suspicious_cases:
|
||||
fio = case.get('fio_target')
|
||||
reason = case.get('reason')
|
||||
print(f"\n[?] Спорный случай: {fio}")
|
||||
print(f" Причина аномалии: {reason}")
|
||||
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()
|
||||
|
||||
if user_input.lower() == 'н' or len(user_input) > 5:
|
||||
if user_input.lower() == 'н':
|
||||
rule_text = input(f"Опишите правило для {fio} (например: 'Считать совместителем'): ")
|
||||
else:
|
||||
rule_text = user_input
|
||||
|
||||
# Записываем правило в Базу Знаний
|
||||
full_rule = f"Сотрудник {fio}: {rule_text}"
|
||||
add_rule_to_kb(full_rule)
|
||||
print(f"[+] ИИ 'запомнил' это правило и учитывает его со следующего запуска!")
|
||||
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[✓] ЭТАП ОБУЧЕНИЯ ЗАВЕРШЕН.")
|
||||
Reference in New Issue
Block a user