Files
Geniusia_v2/archive/old_docs/REFONTE_DETECTION_WORKFLOWS.md
2026-03-05 00:20:25 +01:00

9.3 KiB

🔄 Refonte : Détection de Workflows Complets

🎯 Objectif

Transformer le système d'un détecteur de micro-patterns (3 clics identiques) en un détecteur de macro-workflows (séquences d'actions répétées).

Problème Actuel

Ce qui est implémenté

# EventCapture détecte :
Clic A, Clic A, Clic A  Pattern détecté 

Problème : Personne ne clique 3 fois sur le même bouton dans la vraie vie !

Ce qu'il faut

# Détecter des workflows :
Jour 1: [Ouvre App  Clic Menu  Type Texte  Sauvegarde]
Jour 2: [Ouvre App  Clic Menu  Type Texte  Sauvegarde]
Jour 3: [Ouvre App  Clic Menu  Type Texte  Sauvegarde]
 Workflow détecté 

Solution : Workflow Pattern Detector

1. Nouvelle Architecture

EventCapture (capture toutes les actions)
    ↓
WorkflowBuffer (garde les N dernières actions)
    ↓
WorkflowDetector (détecte les séquences répétées)
    ↓
WorkflowManager (crée et gère les workflows)
    ↓
SuggestionManager (suggère le workflow suivant)

2. Algorithme de Détection

Étape 1 : Segmentation Temporelle

# Diviser les actions en "sessions"
# Une session = actions dans une fenêtre de temps (ex: 5 minutes)

Session 1: [Action1, Action2, Action3, Action4]  # 10h00-10h05
Session 2: [Action5, Action6, Action7]           # 10h30-10h35
Session 3: [Action8, Action9, Action10, Action11] # 11h00-11h05

Étape 2 : Comparaison de Séquences

# Comparer les sessions pour trouver des similarités

def compare_sessions(session1, session2):
    # Utiliser la distance de Levenshtein sur les embeddings
    # Ou DTW (Dynamic Time Warping)
    # Ou similarité cosinus entre séquences
    
    similarity = calculate_sequence_similarity(session1, session2)
    return similarity > threshold  # ex: 0.75

Étape 3 : Détection de Répétition

# Si 3 sessions similaires → Workflow détecté

if count_similar_sessions() >= 3:
    workflow = create_workflow(sessions)
    save_workflow(workflow)
    notify_user("Workflow détecté !")

3. Structure de Données

Workflow

@dataclass
class Workflow:
    workflow_id: str
    name: str  # "Ouvrir OnlyOffice et créer document"
    steps: List[WorkflowStep]
    repetitions: int  # Nombre de fois observé
    confidence: float
    last_seen: datetime
    
@dataclass
class WorkflowStep:
    step_id: int
    action_type: str  # "click", "type", "scroll"
    target_description: str  # "Bouton Nouveau Document"
    screenshot: np.ndarray
    embedding: np.ndarray
    position: Tuple[int, int]
    window: str

4. Détection en Temps Réel

class WorkflowDetector:
    def __init__(self):
        self.action_buffer = deque(maxlen=100)  # 100 dernières actions
        self.sessions = []
        self.known_workflows = []
    
    def on_action(self, action):
        # Ajouter l'action au buffer
        self.action_buffer.append(action)
        
        # Vérifier si on doit créer une nouvelle session
        if self.should_start_new_session(action):
            self.finalize_current_session()
            self.start_new_session()
        
        # Ajouter l'action à la session courante
        self.current_session.append(action)
        
        # Vérifier si on détecte un workflow
        if len(self.sessions) >= 3:
            workflow = self.detect_workflow()
            if workflow:
                self.on_workflow_detected(workflow)
    
    def should_start_new_session(self, action):
        # Nouvelle session si :
        # - Plus de 5 minutes depuis la dernière action
        # - Changement de fenêtre majeur
        # - Action de "fin" (fermeture, sauvegarde)
        
        if not self.current_session:
            return True
        
        last_action = self.current_session[-1]
        time_gap = action.timestamp - last_action.timestamp
        
        return (
            time_gap > timedelta(minutes=5) or
            action.window != last_action.window or
            action.action_type in ["close", "save"]
        )
    
    def detect_workflow(self):
        # Comparer les 3 dernières sessions
        recent_sessions = self.sessions[-3:]
        
        # Calculer la similarité entre elles
        sim_01 = self.compare_sessions(recent_sessions[0], recent_sessions[1])
        sim_12 = self.compare_sessions(recent_sessions[1], recent_sessions[2])
        sim_02 = self.compare_sessions(recent_sessions[0], recent_sessions[2])
        
        avg_similarity = (sim_01 + sim_12 + sim_02) / 3
        
        if avg_similarity > 0.75:
            # Créer le workflow
            return self.create_workflow_from_sessions(recent_sessions)
        
        return None
    
    def compare_sessions(self, session1, session2):
        # Utiliser DTW (Dynamic Time Warping) pour comparer
        # les séquences d'embeddings
        
        embeddings1 = [action.embedding for action in session1]
        embeddings2 = [action.embedding for action in session2]
        
        distance = dtw_distance(embeddings1, embeddings2)
        similarity = 1 / (1 + distance)
        
        return similarity

5. Suggestion de Workflow

class WorkflowSuggestionManager:
    def check_for_workflow_suggestion(self, current_actions):
        # Vérifier si les actions actuelles correspondent
        # au début d'un workflow connu
        
        for workflow in self.known_workflows:
            match_score = self.match_workflow_start(
                current_actions,
                workflow.steps
            )
            
            if match_score > 0.75:
                # On est probablement au début du workflow !
                return {
                    "workflow": workflow,
                    "confidence": match_score,
                    "next_steps": workflow.steps[len(current_actions):]
                }
        
        return None
    
    def match_workflow_start(self, current_actions, workflow_steps):
        # Comparer les N premières actions avec le début du workflow
        
        if len(current_actions) > len(workflow_steps):
            return 0.0
        
        similarities = []
        for i, action in enumerate(current_actions):
            step = workflow_steps[i]
            sim = cosine_similarity(action.embedding, step.embedding)
            similarities.append(sim)
        
        return np.mean(similarities)

📊 Exemple Concret

Scénario : OnlyOffice

# Jour 1 - 10h00
Session 1:
  1. Clic sur lanceur (embedding_1)
  2. Type "office" (embedding_2)
  3. Clic sur OnlyOffice (embedding_3)
  4. Clic "Nouveau document" (embedding_4)
  5. Type "Bonjour" (embedding_5)
  6. Clic "Fermer" (embedding_6)
  7. Clic "Non" (embedding_7)

# Jour 2 - 14h30
Session 2:
  1. Clic sur lanceur (embedding_1')  # Similaire à embedding_1
  2. Type "office" (embedding_2')
  3. Clic sur OnlyOffice (embedding_3')
  4. Clic "Nouveau document" (embedding_4')
  5. Type "Hello" (embedding_5')  # Différent mais même type d'action
  6. Clic "Fermer" (embedding_6')
  7. Clic "Non" (embedding_7')

# Jour 3 - 16h00
Session 3:
  1. Clic sur lanceur (embedding_1'')
  2. Type "office" (embedding_2'')
  3. Clic sur OnlyOffice (embedding_3'')
  4. Clic "Nouveau document" (embedding_4'')
  5. Type "Test" (embedding_5'')
  6. Clic "Fermer" (embedding_6'')
  7. Clic "Non" (embedding_7'')

# Détection
compare_sessions(Session1, Session2) = 0.89
compare_sessions(Session2, Session3) = 0.91
compare_sessions(Session1, Session3) = 0.87

avg_similarity = 0.89 > 0.75 

 Workflow "Ouvrir OnlyOffice et créer document" détecté !

Jour 4 - Suggestion

# L'utilisateur commence
Action 1: Clic sur lanceur
Action 2: Type "office"

# Le système détecte
match_score = match_workflow_start([Action1, Action2], Workflow.steps)
match_score = 0.92 > 0.75 

# Suggestion !
"Je peux continuer ce workflow pour toi ?"
[Oui] [Non] [Corriger]

🔧 Implémentation

Fichiers à Créer

  1. geniusia2/core/workflow_detector.py - Détection de workflows
  2. geniusia2/core/workflow_manager.py - Gestion des workflows
  3. geniusia2/core/session_manager.py - Segmentation en sessions

Fichiers à Modifier

  1. geniusia2/core/event_capture.py - Intégrer WorkflowDetector
  2. geniusia2/core/orchestrator.py - Utiliser workflows au lieu de patterns
  3. geniusia2/core/suggestion_manager.py - Suggérer workflows complets

📈 Avantages

Avant (Micro-Patterns)

  • Détecte seulement les clics répétés
  • Inutilisable en pratique
  • Ne correspond pas à l'usage réel

Après (Macro-Workflows)

  • Détecte les workflows complets
  • Utilisable en pratique
  • Correspond à l'usage réel
  • Vrai RPA Vision !

🎯 Prochaines Étapes

  1. Implémenter WorkflowDetector (3-4h)
  2. Implémenter SessionManager (2h)
  3. Modifier EventCapture (1h)
  4. Tester avec ton workflow OnlyOffice (1h)
  5. Ajuster les seuils (1h)

Total : ~8-10 heures de développement

💡 Note Importante

C'est un changement majeur mais nécessaire pour que le système soit vraiment utilisable !

Le système actuel est un MVP qui ne fonctionne que pour des cas d'usage artificiels.

Avec cette refonte, on aura un vrai RPA Vision qui apprend des workflows réels ! 🚀


Veux-tu qu'on commence l'implémentation ? 💪