Alex-Watchman commited on
Commit
18368b5
·
verified ·
1 Parent(s): 7d9276b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +133 -0
app.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ Главный скрипт для определения намерений пользователя.
6
+ Использует двухступенчатую систему: сначала быстрый парсер на правилах,
7
+ при его неудаче — ML-классификатор (DistilBERT).
8
+ """
9
+
10
+ import logging
11
+ import sys
12
+ import time
13
+ from typing import Dict, Any
14
+
15
+ from fast_parser import create_fast_parser, ParsedIntent
16
+ from ml_classifier import create_ml_classifier, MLClassificationResult
17
+
18
+
19
+ def setup_logging(level: int = logging.INFO) -> None:
20
+ """Настройка логирования."""
21
+ logging.basicConfig(
22
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
23
+ level=level,
24
+ handlers=[logging.StreamHandler(sys.stdout)]
25
+ )
26
+
27
+
28
+ def parse_intent(
29
+ text: str,
30
+ fast_parser,
31
+ ml_classifier
32
+ ) -> Dict[str, Any]:
33
+ # Шаг 1: быстрый парсер на правилах
34
+ fast_result: ParsedIntent = fast_parser.parse(text)
35
+ if fast_result is not None:
36
+ logging.info(f"Fast parser сработал: intent={fast_result.intent}, "
37
+ f"confidence={fast_result.confidence:.2f}")
38
+ return {
39
+ "source": "fast_parser",
40
+ "intent": fast_result.intent,
41
+ "confidence": fast_result.confidence,
42
+ "parameters": fast_result.parameters,
43
+ "original_text": fast_result.original_text,
44
+ "normalized_text": fast_result.normalized_text,
45
+ }
46
+
47
+ # Шаг 2: ML-классификатор (если доступен)
48
+ if ml_classifier.is_initialized:
49
+ ml_result: MLClassificationResult = ml_classifier.predict(text)
50
+ logging.info(f"ML классификатор сработал: intent={ml_result.intent}, "
51
+ f"confidence={ml_result.confidence:.2f}")
52
+ return {
53
+ "source": "ml_classifier",
54
+ "intent": ml_result.intent,
55
+ "confidence": ml_result.confidence,
56
+ "all_predictions": ml_result.all_predictions,
57
+ "multi_label_predictions": ml_result.multi_label_predictions,
58
+ }
59
+ else:
60
+ logging.warning("ML классификатор недоступен, возвращаем unknown")
61
+ return {
62
+ "source": "none",
63
+ "intent": "unknown",
64
+ "confidence": 0.0,
65
+ "error": "Ни один парсер не смог обработать запрос",
66
+ }
67
+
68
+
69
+ def main() -> None:
70
+ """Основная функция: инициализация парсеров и интерактивный цикл."""
71
+ setup_logging(logging.INFO)
72
+ # Для более детальной трассировки можно включить DEBUG:
73
+ # logging.getLogger().setLevel(logging.DEBUG)
74
+
75
+ logging.info("Инициализация парсеров...")
76
+
77
+ # FastParser всегда доступен
78
+ fast_parser = create_fast_parser()
79
+ logging.info("Fast parser готов.")
80
+
81
+ # MLClassifier с замером времени загрузки
82
+ logging.info("Начинаю загрузку ML модели...")
83
+ ml_start = time.time()
84
+ ml_classifier = create_ml_classifier() # путь к модели берётся по умолчанию
85
+ ml_end = time.time()
86
+ load_time = ml_end - ml_start
87
+
88
+ if ml_classifier.is_initialized:
89
+ logging.info(f"ML классификатор успешно загружен за {load_time:.2f} сек.")
90
+ model_info = ml_classifier.get_model_info()
91
+ logging.info(f"Модель: устройство {model_info['device']}, "
92
+ f"интентов: {model_info['num_intents']}")
93
+ else:
94
+ logging.warning(f"ML классификатор не загружен (потрачено {load_time:.2f} сек). "
95
+ "Будет использован только fast parser.")
96
+
97
+ print("Введите ваш запрос (или 'выход' / 'exit' / 'quit' для завершения):")
98
+
99
+ while True:
100
+ try:
101
+ user_input = input("\n> ").strip()
102
+ if not user_input:
103
+ continue
104
+ if user_input.lower() in ("выход", "exit", "quit"):
105
+ print("До свидания!")
106
+ break
107
+
108
+ result = parse_intent(user_input, fast_parser, ml_classifier)
109
+
110
+ # Вывод результатов
111
+ print("\nРезультат разбора:")
112
+ print(f" Источник: {result['source']}")
113
+ print(f" Интент: {result['intent']}")
114
+ print(f" Уверенность: {result['confidence']:.2%}")
115
+
116
+ if "parameters" in result and result["parameters"]:
117
+ print(f" Параметры: {result['parameters']}")
118
+
119
+ if "all_predictions" in result and result["all_predictions"]:
120
+ print(" Все предсказания ML (top-5):")
121
+ for intent, conf in result["all_predictions"][:5]:
122
+ print(f" - {intent}: {conf:.2%}")
123
+
124
+ except KeyboardInterrupt:
125
+ print("\nЗавершение работы по Ctrl+C.")
126
+ break
127
+ except Exception as e:
128
+ logging.exception("Необработанная ошибка в цикле обработки")
129
+ print(f"Произошла ошибка: {e}")
130
+
131
+
132
+ if __name__ == "__main__":
133
+ main()