# Implementation Plan - Amélioration du Système d'Embeddings et Fine-tuning

## Phase 1: Fix FAISS et Abstraction de Base

- [x] 1. Créer l'abstraction EmbedderBase
  - Créer `geniusia2/core/embedders/__init__.py`
  - Créer `geniusia2/core/embedders/base.py` avec classe abstraite `EmbedderBase`
  - Définir méthodes: `embed()`, `get_dimension()`, `get_model_name()`, `supports_batch()`, `embed_batch()`
  - Ajouter docstrings complètes
  - _Requirements: 2.1, 2.2_

- [x] 2. Implémenter CLIPEmbedder
  - Créer `geniusia2/core/embedders/clip_embedder.py`
  - Wrapper autour du code CLIP existant dans `vision_analysis.py`
  - Implémenter toutes les méthodes de `EmbedderBase`
  - Gérer GPU/CPU automatiquement
  - Normaliser les embeddings (L2 norm)
  - _Requirements: 2.1, 2.2, 2.5, 6.4_

- [x] 3. Créer FAISSIndex corrigé
  - Créer `geniusia2/core/embedders/faiss_index.py`
  - Implémenter `add()` avec validation de dimension
  - Implémenter `search()` avec conversion distance→similarity
  - Implémenter `save()` et `load()` avec metadata
  - Implémenter `rebuild_if_needed()` pour changement de dimension
  - Gérer les cas d'erreur (dimension mismatch, fichier corrompu)
  - _Requirements: 1.1, 1.2, 1.3, 1.4, 1.5_

- [ ]* 3.1 Écrire tests unitaires pour FAISSIndex
  - Test add/search avec différentes dimensions
  - Test save/load round-trip
  - Test rebuild sur changement de dimension
  - Test gestion d'erreurs
  - _Requirements: 1.1, 1.2, 1.3, 1.4, 1.5_

- [ ]* 3.2 Écrire test de propriété pour FAISS round-trip
  - **Property 2: FAISS Index Persistence Round-trip**
  - **Validates: Requirements 1.3, 1.4**
  - Générer embeddings aléatoires, sauvegarder, charger, vérifier résultats identiques

- [x] 4. Créer EmbeddingManager
  - Créer `geniusia2/core/embedders/embedding_manager.py`
  - Implémenter sélection de modèle avec fallback
  - Implémenter cache LRU manuel (1000 entrées)
  - Utiliser hash MD5 de l'image comme clé de cache
  - Logger le modèle chargé au démarrage
  - _Requirements: 2.3, 2.4, 6.1, 6.2, 7.1, 7.3_

- [ ]* 4.1 Écrire tests pour EmbeddingManager
  - Test sélection de modèle
  - Test fallback sur erreur
  - Test cache hit/miss
  - Test éviction LRU
  - _Requirements: 2.4, 6.1, 6.2_

- [ ]* 4.2 Écrire test de propriété pour cache consistency
  - **Property 4: Cache Hit Consistency**
  - **Validates: Requirements 6.1**
  - Générer images aléatoires, embedder 2x, vérifier résultats identiques

- [x] 5. Intégrer dans vision_analysis.py
  - Remplacer le code CLIP direct par `EmbeddingManager`
  - Ajouter paramètre de config pour choisir le modèle (clip/pix2struct)
  - Migrer les embeddings existants si nécessaire
  - Maintenir backward compatibility
  - _Requirements: 2.3, 2.4_

- [x] 6. Intégrer dans workflow_matcher.py
  - Utiliser `EmbeddingManager` au lieu de CLIP direct
  - Utiliser `FAISSIndex` pour les recherches de similarité
  - Gérer le cas où l'index n'existe pas encore
  - _Requirements: 1.1, 1.2_

- [x] 7. Checkpoint - Tester le système de base
  - Lancer l'application en mode Assist
  - Vérifier que les embeddings sont générés correctement
  - Vérifier que FAISS fonctionne sans erreurs de dimension
  - Vérifier que le cache fonctionne
  - Tester save/load de l'index FAISS
  - Ensure all tests pass, ask the user if questions arise.

## Phase 2: Ajouter Pix2Struct

- [x] 8. Installer dépendances Pix2Struct
  - Ajouter `transformers>=4.35.0` à requirements
  - Ajouter `sentencepiece` à requirements
  - Créer script d'installation `install_pix2struct.sh`
  - Tester l'installation sur la machine cible
  - _Requirements: 3.1_

- [x] 9. Implémenter Pix2StructEmbedder
  - Créer `geniusia2/core/embedders/pix2struct_embedder.py`
  - Charger le modèle `google/pix2struct-base`
  - Extraire les hidden states de l'encoder comme embeddings
  - Normaliser les embeddings (L2 norm)
  - Gérer GPU/CPU automatiquement
  - Implémenter toutes les méthodes de `EmbedderBase`
  - _Requirements: 3.1, 3.2, 3.3, 3.5_

- [ ]* 9.1 Écrire tests pour Pix2StructEmbedder
  - Test chargement du modèle
  - Test génération d'embeddings
  - Test dimension consistency
  - Test GPU/CPU switching
  - _Requirements: 3.1, 3.2, 3.3_

- [ ]* 9.2 Écrire test de propriété pour interface compatibility
  - **Property 3: Embedder Interface Compatibility**
  - **Validates: Requirements 2.1, 2.2, 2.5**
  - Tester CLIP et Pix2Struct avec images PIL aléatoires, vérifier format de sortie

- [x] 10. Tester Pix2Struct vs CLIP
  - Créer script de benchmark `test_pix2struct_vs_clip.py`
  - Comparer la qualité des embeddings sur des screenshots UI
  - Mesurer les performances (temps, mémoire)
  - Documenter les résultats
  - _Requirements: 3.4, 6.5_

- [x] 11. Ajouter configuration pour sélection de modèle
  - Ajouter paramètre `embedding_model` dans config
  - Valeurs possibles: "clip", "pix2struct"
  - Défaut: "clip" (pour compatibilité)
  - Documenter dans README
  - _Requirements: 2.3, 7.1_

- [x] 12. Checkpoint - Tester Pix2Struct
  - Lancer avec `embedding_model=pix2struct`
  - Vérifier que le modèle charge correctement
  - Comparer la précision du matching avec CLIP
  - Vérifier le fallback si Pix2Struct échoue
  - Ensure all tests pass, ask the user if questions arise.

## Phase 3: Fine-tuning Léger

- [x] 13. Créer LightweightFineTuner
  - Créer `geniusia2/core/embedders/fine_tuner.py`
  - Implémenter collection d'exemples positifs/négatifs (deque maxlen=1000)
  - Implémenter trigger automatique tous les 10 exemples
  - Implémenter exécution en thread séparé
  - Implémenter sauvegarde/chargement de checkpoint
  - _Requirements: 4.1, 4.2, 4.3, 5.1, 5.5_

- [ ]* 13.1 Écrire tests pour LightweightFineTuner
  - Test collection d'exemples
  - Test trigger threshold
  - Test thread séparé (non-blocking)
  - Test checkpoint save/load
  - _Requirements: 4.1, 4.2, 4.3, 5.1_

- [ ]* 13.2 Écrire test de propriété pour example collection bounds
  - **Property 7: Example Collection Bounds**
  - **Validates: Requirements 4.1, 4.2**
  - Ajouter N exemples aléatoires (N > 1000), vérifier que len <= 1000

- [ ]* 13.3 Écrire test de propriété pour fine-tuning non-blocking
  - **Property 6: Fine-tuning Non-blocking**
  - **Validates: Requirements 5.1, 5.2**
  - Lancer fine-tuning, vérifier que embed() continue de fonctionner

- [x] 14. Implémenter fine-tuning pour CLIPEmbedder
  - Ajouter méthode `fine_tune()` à `CLIPEmbedder`
  - Utiliser contrastive loss (positifs vs négatifs)
  - Fine-tuner uniquement la dernière couche de projection
  - Utiliser learning rate faible (1e-4)
  - Limiter à 1 epoch pour rapidité
  - Retourner métriques (loss, accuracy)
  - _Requirements: 4.4, 5.2, 5.3, 7.2_

- [x] 15. Implémenter fine-tuning pour Pix2StructEmbedder
  - Ajouter méthode `fine_tune()` à `Pix2StructEmbedder`
  - Utiliser contrastive loss (positifs vs négatifs)
  - Fine-tuner uniquement la dernière couche de l'encoder
  - Utiliser learning rate faible (1e-4)
  - Limiter à 1 epoch pour rapidité
  - Retourner métriques (loss, accuracy)
  - _Requirements: 4.4, 5.2, 5.3, 7.2_

- [x] 16. Intégrer fine-tuning dans Orchestrator
  - Ajouter `LightweightFineTuner` à l'orchestrator
  - Appeler `add_positive_example()` quand workflow accepté et réussi
  - Appeler `add_negative_example()` quand workflow rejeté
  - Sauvegarder checkpoint à l'arrêt
  - Charger checkpoint au démarrage
  - _Requirements: 4.1, 4.2, 5.5_

- [x] 17. Ajouter logging et métriques
  - Logger le début/fin du fine-tuning
  - Logger les métriques (loss, accuracy, durée)
  - Logger le nombre d'exemples collectés
  - Créer fichier de log dédié `fine_tuning.log`
  - _Requirements: 7.2, 7.3_

- [x] 18. Checkpoint Final - Tester le système complet
  - Lancer l'application en mode Assist
  - Accepter plusieurs workflows → vérifier collection d'exemples positifs
  - Rejeter plusieurs workflows → vérifier collection d'exemples négatifs
  - Attendre le trigger (10 exemples) → vérifier que fine-tuning démarre
  - Vérifier que l'application continue de fonctionner pendant le fine-tuning
  - Vérifier que les métriques sont loggées
  - Vérifier que le modèle s'améliore après fine-tuning
  - Ensure all tests pass, ask the user if questions arise.

## Phase 4: Optimisations et Outils

- [x] 19. Optimiser les performances
  - Implémenter batch processing pour embed_batch()
  - Optimiser le cache (utiliser hash plus rapide si nécessaire)
  - Profiler les performances (temps, mémoire)
  - Ajuster les paramètres si nécessaire
  - _Requirements: 6.3, 6.4, 6.5_

- [ ]* 19.1 Écrire tests de performance
  - Mesurer temps d'embedding (GPU vs CPU)
  - Mesurer temps de recherche FAISS
  - Mesurer temps de fine-tuning
  - Vérifier que les seuils sont respectés
  - _Requirements: 6.5_

- [x] 20. Créer outils de visualisation
  - Créer script `visualize_embeddings.py`
  - Utiliser t-SNE ou UMAP pour visualiser les embeddings
  - Afficher les clusters de workflows similaires
  - Comparer CLIP vs Pix2Struct visuellement
  - _Requirements: 7.5_

- [x] 21. Créer outils de debugging
  - Créer script `debug_embeddings.py`
  - Afficher les embeddings pour une image donnée
  - Afficher les résultats de recherche FAISS
  - Afficher l'historique de fine-tuning
  - _Requirements: 7.4, 7.5_

- [x] 22. Documentation finale
  - Documenter l'architecture dans README
  - Documenter comment choisir entre CLIP et Pix2Struct
  - Documenter le système de fine-tuning
  - Créer guide de troubleshooting
  - _Requirements: All_

## Phase 5: Intégration dans l'Orchestrator

- [x] 23. Intégrer le système d'embeddings dans l'Orchestrator
  - Créer méthode `_init_new_embedding_system()`
  - Initialiser EmbeddingManager, FAISSIndex, LightweightFineTuner
  - Charger les checkpoints au démarrage
  - Gérer les erreurs d'initialisation
  - _Requirements: All_

- [x] 24. Implémenter l'indexation automatique des workflows
  - Créer méthode `_index_workflow_in_faiss()`
  - Convertir screenshots en embeddings
  - Indexer dans FAISS avec metadata
  - Logger les opérations
  - _Requirements: 1.1, 1.2, 1.3_

- [x] 25. Implémenter la collection d'exemples pour fine-tuning
  - Créer méthode `_add_positive_example_for_finetuning()`
  - Créer méthode `_add_negative_example_for_finetuning()`
  - Connecter aux callbacks de suggestions
  - Gérer la conversion d'images
  - _Requirements: 4.1, 4.2, 5.1_

- [x] 26. Implémenter la sauvegarde à l'arrêt
  - Créer méthode `_save_embedding_system_on_shutdown()`
  - Attendre la fin du fine-tuning en cours
  - Sauvegarder l'index FAISS
  - Sauvegarder le checkpoint du fine-tuner
  - Logger les statistiques
  - _Requirements: 1.3, 5.5_

- [x] 27. Créer tests d'intégration
  - Test d'initialisation du système
  - Test d'indexation de workflows
  - Test de collection d'exemples positifs/négatifs
  - Test du cache
  - Test de sauvegarde/chargement
  - _Requirements: All_

- [x] 28. Créer script de vérification
  - Vérifier l'installation de FAISS
  - Vérifier l'import des modules
  - Lancer les tests d'intégration
  - Vérifier les fichiers créés
  - Vérifier la documentation
  - _Requirements: All_

- [x] 29. Documentation de l'intégration
  - Créer EMBEDDING_SYSTEM_INTEGRATED.md
  - Documenter l'architecture complète
  - Documenter l'utilisation
  - Documenter le monitoring
  - Créer guide de troubleshooting
  - _Requirements: All_

## Statut Final

✅ **INTÉGRATION COMPLÈTE**

Le système d'embeddings est maintenant complètement intégré dans GeniusIA v2 :
- ✅ Tous les composants sont implémentés
- ✅ Tous les tests passent
- ✅ La documentation est complète
- ✅ Le système est prêt pour la production

**Date de complétion** : 20 novembre 2024

