File size: 8,198 Bytes
d28c36c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
"""
Test de diagnostic pour évaluer les capacités MCP de Qwen2.5 0.5B
Approche simplifiée pour éviter les problèmes de chargement
"""

import sys
import os
import json
import time

# Ajouter le chemin pour les imports
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

def test_model_loading():
    """Test simple de chargement du modèle"""
    
    print("🔍 TEST DE CHARGEMENT DU MODÈLE")
    print("=" * 50)
    
    # Vérifier que le modèle existe
    model_path = "qwen2.5-0.5b-instruct-q4_0.gguf"
    if not os.path.exists(model_path):
        print("❌ Modèle non trouvé")
        return False
    
    print(f"✅ Modèle trouvé: {model_path}")
    print(f"📏 Taille: {os.path.getsize(model_path) / (1024*1024):.1f} MB")
    
    # Essayer d'importer et d'initialiser
    try:
        from ai_analysis import AIAnalyzer
        print("✅ Module AIAnalyzer importé")
        
        analyzer = AIAnalyzer(model_path)
        print("✅ AIAnalyzer initialisé")
        
        if analyzer.model_available:
            print("✅ Modèle disponible selon AIAnalyzer")
            return True
        else:
            print("❌ Modèle non disponible selon AIAnalyzer")
            return False
            
    except Exception as e:
        print(f"❌ Erreur lors de l'initialisation: {e}")
        return False

def test_simple_inference():
    """Test d'inférence simple avec le modèle"""
    
    print("\n🧪 TEST D'INFÉRENCE SIMPLE")
    print("=" * 50)
    
    try:
        # Importer directement llama-cpp-python
        from llama_cpp import Llama
        
        model_path = "qwen2.5-0.5b-instruct-q4_0.gguf"
        
        print("🔄 Chargement du modèle avec Llama...")
        
        # Essayer différentes configurations
        for n_threads in [1, 2, 4]:
            try:
                llm = Llama(
                    model_path=model_path,
                    n_ctx=2048,
                    n_threads=n_threads,
                    verbose=False
                )
                
                print(f"✅ Modèle chargé avec {n_threads} threads")
                
                # Test simple
                prompt = "Réponds simplement avec 'TEST_RÉUSSI'"
                
                start_time = time.time()
                response = llm(
                    prompt,
                    max_tokens=10,
                    temperature=0.1
                )
                response_time = time.time() - start_time
                
                text = response['choices'][0]['text'].strip()
                
                print(f"⏱️  Temps de réponse: {response_time:.2f}s")
                print(f"📝 Réponse: {text}")
                
                if "TEST_RÉUSSI" in text:
                    print("✅ Test d'inférence réussi")
                    return True
                else:
                    print("⚠️  Réponse inattendue")
                    
            except Exception as e:
                print(f"❌ Erreur avec {n_threads} threads: {e}")
                continue
        
        return False
        
    except Exception as e:
        print(f"❌ Erreur lors de l'import de llama_cpp: {e}")
        return False

def test_mcp_capability_simulation():
    """Test simulé des capacités MCP (sans vrai modèle)"""
    
    print("\n🧠 TEST SIMULÉ DES CAPACITÉS MCP")
    print("=" * 50)
    
    # Basé sur la documentation et les spécifications de Qwen2.5 0.5B
    # Évaluation théorique des capacités
    
    capabilities = {
        "compréhension_instructions_simples": {
            "score": 8,
            "description": "Bon pour les commandes simples comme 'montre l'état du jeu'",
            "exemple": "User: 'get game state' → AI: {'tool': 'get_game_state'}"
        },
        "extraction_paramètres_basiques": {
            "score": 6,
            "description": "Capable d'extraire des paramètres simples comme des coordonnées",
            "exemple": "User: 'move to 100,200' → AI: {'tool': 'move_units', 'args': {'target_x': 100, 'target_y': 200}}"
        },
        "planification_multi_étapes": {
            "score": 4,
            "description": "Limité pour les stratégies complexes nécessitant plusieurs étapes",
            "exemple": "User: 'build base and defend' → Peut avoir du mal à décomposer"
        },
        "gestion_ambiguïté": {
            "score": 5,
            "description": "Capacité modérée à gérer les instructions ambiguës",
            "exemple": "User: 'move to enemy base' → Peut demander des coordonnées"
        },
        "compréhension_contexte_jeu": {
            "score": 7,
            "description": "Bon pour comprendre le contexte RTS de base",
            "exemple": "Comprend les concepts comme 'unités', 'bâtiments', 'ressources'"
        }
    }
    
    total_score = sum(cap["score"] for cap in capabilities.values())
    avg_score = total_score / len(capabilities)
    
    print("📊 ÉVALUATION THÉORIQUE BASÉE SUR LES SPÉCIFICATIONS:")
    
    for name, cap in capabilities.items():
        print(f"\n🔹 {name.replace('_', ' ').title()}:")
        print(f"   Score: {cap['score']}/10")
        print(f"   {cap['description']}")
        print(f"   Exemple: {cap['exemple']}")
    
    print(f"\n🎯 SCORE MOYEN THÉORIQUE: {avg_score:.1f}/10")
    
    return avg_score

def generate_assessment():
    """Générer une évaluation complète"""
    
    print("🔍 ÉVALUATION DES CAPACITÉS MCP DE QWEN2.5 0.5B")
    print("=" * 70)
    
    # Test de chargement
    model_loaded = test_model_loading()
    
    # Test d'inférence
    if model_loaded:
        inference_working = test_simple_inference()
    else:
        inference_working = False
    
    # Évaluation théorique
    theoretical_score = test_mcp_capability_simulation()
    
    # Rapport final
    print("\n" + "="*70)
    print("📊 RAPPORT FINAL D'ÉVALUATION")
    print("="*70)
    
    print(f"\n🔧 ÉTAT TECHNIQUE:")
    print(f"   Modèle chargé: {'✅' if model_loaded else '❌'}")
    print(f"   Inférence fonctionnelle: {'✅' if inference_working else '❌'}")
    
    print(f"\n🧠 CAPACITÉS MCP ESTIMÉES:")
    print(f"   Score théorique: {theoretical_score:.1f}/10")
    
    if theoretical_score >= 7:
        print("💪 TRÈS CAPABLE - Bon pour la plupart des tâches MCP")
    elif theoretical_score >= 5:
        print("👍 CAPABLE - Adapté pour les commandes simples à modérées")
    else:
        print("⚠️  LIMITÉ - Recommandé uniquement pour les tâches très simples")
    
    print(f"\n💡 RECOMMANDATIONS PRATIQUES:")
    
    if not model_loaded or not inference_working:
        print("1. 🔧 Résoudre d'abord les problèmes techniques de chargement")
        print("2. 📦 Vérifier l'installation de llama-cpp-python")
        print("3. 🔄 Tester avec différentes configurations")
    
    print("4. 🎯 Commencer par des commandes MCP très simples")
    print("5. 🔍 Tester progressivement la complexité")
    print("6. ✅ Ajouter une validation robuste")
    print("7. 🔄 Utiliser des prompts structurés")
    
    print(f"\n📈 STRATÉGIE D'IMPLÉMENTATION:")
    
    if theoretical_score >= 6:
        print("• Implémenter la traduction MCP avec confiance")
        print("• Commencer par: get_game_state, move_units simples")
        print("• Ajouter progressivement: paramètres complexes, séquences")
    else:
        print("• Utiliser des règles fixes pour les commandes simples")
        print("• Réserver Qwen2.5 pour l'analyse plutôt que la traduction")
        print("• Envisager un modèle plus grand pour les tâches complexes")
    
    # Résumé technique
    print(f"\n🔬 INFORMATIONS TECHNIQUES:")
    print("• Modèle: Qwen2.5-0.5B (0.5 milliard de paramètres)")
    print("• Type: Instruct (optimisé pour suivre des instructions)")
    print("• Format: GGUF (quantisé 4-bit)")
    print("• Taille: ~409 MB")
    print("• Capacité: Bon pour les tâches simples, limité pour les complexes")

if __name__ == "__main__":
    generate_assessment()