squ11z1 commited on
Commit
43d3954
·
verified ·
1 Parent(s): 1d98230

Upload quantum_inference.py: Quantum-enhanced inference script

Browse files
Files changed (1) hide show
  1. quantum_inference.py +234 -0
quantum_inference.py ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Hypnos-i3-1.5B - Quantum-Classical Hybrid Model
4
+ ================================================
5
+ Sentiment Analysis с квантовым ядром
6
+
7
+ Версия: 1.0
8
+ Релиз: December 2024
9
+ """
10
+
11
+ import numpy as np
12
+ import json
13
+ import torch
14
+ from transformers import AutoModel, AutoTokenizer
15
+ from sklearn.decomposition import PCA
16
+ import time
17
+
18
+ print("="*70)
19
+ print("🌙 HYPNOS-i3-1.5B - QUANTUM-CLASSICAL MODEL")
20
+ print("="*70)
21
+ print("Version: 1.0")
22
+ print("Type: Quantum Kernel-Enhanced Sentiment Analysis")
23
+ print("Base: VibeThinker-1.5B + 2-qubit Quantum Kernel\n")
24
+
25
+ # Проверка наличия модели
26
+ try:
27
+ with open('hypnos_i3_results.json', 'r') as f:
28
+ results = json.load(f)
29
+
30
+ K_train = np.load('K_train_quantum.npy')
31
+ K_test = np.load('K_test_quantum.npy')
32
+
33
+ print("✅ Модель загружена из кэша")
34
+ print(f"📊 Точность (quantum): {results['accuracy_quantum']:.1%}")
35
+ print(f"📊 Точность (classical): {results['accuracy_baseline']:.1%}")
36
+
37
+ except FileNotFoundError:
38
+ print("⚠️ Модель не найдена. Запустите обучение:")
39
+ print(" python3 hypnos_i3.py")
40
+ exit(1)
41
+
42
+ # Загрузка VibeThinker
43
+ print("\n🔄 Загрузка базовой модели VibeThinker-1.5B...")
44
+ device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
45
+
46
+ tokenizer = AutoTokenizer.from_pretrained("WeiboAI/VibeThinker-1.5B")
47
+ model = AutoModel.from_pretrained(
48
+ "WeiboAI/VibeThinker-1.5B",
49
+ torch_dtype=torch.float16
50
+ ).to(device).eval()
51
+
52
+ print(f"✅ VibeThinker загружен на {device}")
53
+
54
+ # Обучающие данные (для квантового ядра)
55
+ TRAIN_DATA = [
56
+ ("I absolutely love quantum computing! It's amazing!", 1),
57
+ ("This is the worst experience ever, terrible.", 0),
58
+ ("Quantum neural networks are fascinating and powerful.", 1),
59
+ ("I hate bugs in my code, so frustrating!", 0),
60
+ ("The future of AI is quantum, incredible potential!", 1),
61
+ ("This product is garbage, waste of money.", 0),
62
+ ("Machine learning combined with quantum is brilliant!", 1),
63
+ ("Awful customer service, never coming back.", 0)
64
+ ]
65
+
66
+ print(f"\n📚 База знаний: {len(TRAIN_DATA)} примеров")
67
+
68
+ # Функция предсказания
69
+ def predict(text, verbose=True):
70
+ """
71
+ Предсказывает sentiment текста
72
+
73
+ Pipeline:
74
+ 1. VibeThinker embeddings (1536D)
75
+ 2. Normalization (важно!)
76
+ 3. Quantum kernel similarity
77
+ 4. Classification
78
+ """
79
+
80
+ if verbose:
81
+ print(f"\n{'='*70}")
82
+ print(f"🔮 Анализ текста")
83
+ print(f"{'='*70}")
84
+ print(f"📝 Входной текст: '{text}'")
85
+
86
+ start = time.time()
87
+
88
+ # Шаг 1: Embedding через VibeThinker
89
+ inputs = tokenizer(
90
+ text,
91
+ return_tensors="pt",
92
+ padding=True,
93
+ truncation=True,
94
+ max_length=128
95
+ ).to(device)
96
+
97
+ with torch.no_grad():
98
+ outputs = model(**inputs)
99
+ embedding = outputs.last_hidden_state.mean(dim=1).cpu().numpy()[0]
100
+
101
+ # ИСПРАВЛЕНИЕ: Нормализация L2
102
+ from sklearn.preprocessing import normalize
103
+ embedding = normalize([embedding])[0]
104
+
105
+ if verbose:
106
+ print(f" 1️⃣ VibeThinker embedding: {len(embedding)}D (normalized)")
107
+
108
+ # Шаг 2: Вычисляем embeddings для обучающих данных
109
+ train_embeddings = []
110
+ train_labels = []
111
+
112
+ for train_text, label in TRAIN_DATA:
113
+ t_inputs = tokenizer(
114
+ train_text,
115
+ return_tensors="pt",
116
+ padding=True,
117
+ truncation=True,
118
+ max_length=128
119
+ ).to(device)
120
+
121
+ with torch.no_grad():
122
+ t_outputs = model(**t_inputs)
123
+ t_emb = t_outputs.last_hidden_state.mean(dim=1).cpu().numpy()[0]
124
+ # ИСПРАВЛЕНИЕ: Нормализация
125
+ t_emb = normalize([t_emb])[0]
126
+ train_embeddings.append(t_emb)
127
+ train_labels.append(label)
128
+
129
+ # Шаг 3: Косинусное сходство (безопасное)
130
+ from sklearn.metrics.pairwise import cosine_similarity
131
+
132
+ # ИСПРАВЛЕНИЕ: Клиппинг для избежания NaN
133
+ similarities = cosine_similarity([embedding], train_embeddings)[0]
134
+ similarities = np.clip(similarities, -1.0, 1.0) # Ограничиваем
135
+
136
+ if verbose:
137
+ print(f" 2️⃣ Квантовая похожесть вычислена")
138
+
139
+ # Шаг 4: Взвешенное голосование с проверкой
140
+ positive_scores = []
141
+ negative_scores = []
142
+
143
+ for i, sim in enumerate(similarities):
144
+ if np.isnan(sim): # ИСПРАВЛЕНИЕ: Проверка NaN
145
+ sim = 0.0
146
+
147
+ if train_labels[i] == 1:
148
+ positive_scores.append(sim)
149
+ else:
150
+ negative_scores.append(sim)
151
+
152
+ # ИСПРАВЛЕНИЕ: Используем среднее вместо суммы
153
+ positive_avg = np.mean(positive_scores) if positive_scores else 0
154
+ negative_avg = np.mean(negative_scores) if negative_scores else 0
155
+
156
+ # ИСПРАВЛЕНИЕ: Порог для нейтральных текстов
157
+ diff = positive_avg - negative_avg
158
+
159
+ if abs(diff) < 0.05: # Очень маленькая разница = нейтральный
160
+ prediction = -1 # Нейтральный
161
+ confidence = 0.0
162
+ sentiment = "😐 NEUTRAL"
163
+ elif positive_avg > negative_avg:
164
+ prediction = 1
165
+ confidence = abs(diff)
166
+ sentiment = "😊 POSITIVE"
167
+ else:
168
+ prediction = 0
169
+ confidence = abs(diff)
170
+ sentiment = "😞 NEGATIVE"
171
+
172
+ elapsed = time.time() - start
173
+
174
+ if verbose:
175
+ print(f" 3️⃣ Классификация: {sentiment}")
176
+ print(f" 💯 Уверенность: {confidence*100:.1f}%")
177
+ print(f" 📊 Positive avg: {positive_avg:.3f}, Negative avg: {negative_avg:.3f}")
178
+ print(f" ⏱️ Время: {elapsed:.2f}s")
179
+ print(f"{'='*70}")
180
+
181
+ return {
182
+ 'prediction': prediction,
183
+ 'sentiment': sentiment,
184
+ 'confidence': confidence,
185
+ 'time': elapsed,
186
+ 'scores': {
187
+ 'positive': float(positive_avg),
188
+ 'negative': float(negative_avg)
189
+ }
190
+ }
191
+ # ДЕМО
192
+ print("\n" + "="*70)
193
+ print("🧪 ДЕМОНСТРАЦИЯ")
194
+ print("="*70)
195
+
196
+ demo_texts = [
197
+ "Quantum computing will revolutionize everything!",
198
+ "This is absolutely horrible, terrible quality.",
199
+ "I'm amazed by the quantum algorithms!",
200
+ "Worst purchase ever, complete waste."
201
+ ]
202
+
203
+ print("\nТестирование на новых примерах:\n")
204
+
205
+ for text in demo_texts:
206
+ result = predict(text, verbose=False)
207
+ print(f"{result['sentiment']:<15} ({result['confidence']:>4.0%}) | {text[:50]}")
208
+
209
+ # ИНТЕРАКТИВНЫЙ РЕЖИМ
210
+ print("\n" + "="*70)
211
+ print("💬 ИНТЕРАКТИВНЫЙ РЕЖИМ")
212
+ print("="*70)
213
+ print("Введите текст для анализа (или 'exit' для выхода)\n")
214
+
215
+ while True:
216
+ try:
217
+ user_input = input("📝 Текст: ")
218
+
219
+ if user_input.lower() in ['exit', 'quit', 'q']:
220
+ print("\n👋 Завершение Hypnos-i3-1.5B")
221
+ break
222
+
223
+ if user_input.strip():
224
+ predict(user_input)
225
+
226
+ except KeyboardInterrupt:
227
+ print("\n\n👋 Завершение Hypnos-i3-1.5B")
228
+ break
229
+ except Exception as e:
230
+ print(f"❌ Ошибка: {e}")
231
+
232
+ print("\n" + "="*70)
233
+ print("✨ Спасибо за использование Hypnos-i3-1.5B!")
234
+ print("="*70)