1324 lines
36 KiB
Markdown
1324 lines
36 KiB
Markdown
# Architecture Vision Complète - RPA Vision V2
|
|
|
|
**Date de création** : 22 novembre 2024
|
|
**Version** : 1.0
|
|
**Statut** : 📐 Document de Référence Architecturale
|
|
|
|
---
|
|
|
|
## 🎯 Vue d'Ensemble
|
|
|
|
Ce document décrit l'architecture complète du système RPA Vision V2, depuis la capture brute des événements utilisateur jusqu'à l'exécution automatique de workflows appris.
|
|
|
|
### Philosophie : "Observer → Comprendre → Apprendre → Agir"
|
|
|
|
Le système transforme progressivement des **captures brutes** en **connaissances actionnables** à travers 5 couches d'abstraction :
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Couche 0 : RawSession │
|
|
│ Capture brute des événements (clics, touches, screenshots) │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Couche 1 : ScreenState │
|
|
│ Analyse multi-modale (image, texte, éléments UI, contexte) │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Couche 2 : UIElement Detection │
|
|
│ Détection sémantique des éléments d'interface │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Couche 3 : State Embedding │
|
|
│ Fusion multi-modale en vecteur unique (fingerprint) │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Couche 4 : Workflow Graph │
|
|
│ Modélisation en graphe (Nodes, Edges, Learning States) │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Couche 0 : RawSession - Capture Brute
|
|
|
|
### Objectif
|
|
|
|
Enregistrer fidèlement toutes les interactions utilisateur avec horodatage précis et contexte complet.
|
|
|
|
### Structure JSON
|
|
|
|
**Format** : `rawsession_v1`
|
|
|
|
```json
|
|
{
|
|
"schema_version": "rawsession_v1",
|
|
"session_id": "sess_2025-11-21T10-15-00_formateurX",
|
|
"agent_version": "0.1.0",
|
|
|
|
"environment": {
|
|
"platform": "windows",
|
|
"hostname": "PC-FORMATEUR-X",
|
|
"screen": {
|
|
"primary_resolution": [1920, 1080],
|
|
"display_scale": 1.25
|
|
}
|
|
},
|
|
|
|
"user": {
|
|
"id": "formateurX",
|
|
"label": "Formateur X démo clinique"
|
|
},
|
|
|
|
"context": {
|
|
"customer": "Clinique Demo",
|
|
"training_label": "Facturation_T2A_demo",
|
|
"notes": "Session de formation interne"
|
|
},
|
|
|
|
"started_at": "2025-11-21T10:15:00Z",
|
|
"ended_at": "2025-11-21T10:32:45Z",
|
|
|
|
"events": [
|
|
{
|
|
"t": 0.523,
|
|
"type": "mouse_click",
|
|
"button": "left",
|
|
"pos": [1620, 920],
|
|
"window": {
|
|
"title": "Factures - Clinique Demo",
|
|
"app_name": "logiciel_facturation.exe"
|
|
},
|
|
"screenshot_id": "shot_0001"
|
|
},
|
|
{
|
|
"t": 1.850,
|
|
"type": "key_press",
|
|
"keys": ["CTRL", "F"],
|
|
"window": {
|
|
"title": "Factures - Clinique Demo",
|
|
"app_name": "logiciel_facturation.exe"
|
|
},
|
|
"screenshot_id": "shot_0002"
|
|
},
|
|
{
|
|
"t": 3.200,
|
|
"type": "mouse_scroll",
|
|
"delta": -120,
|
|
"pos": [800, 600],
|
|
"window": {
|
|
"title": "Factures - Clinique Demo",
|
|
"app_name": "logiciel_facturation.exe"
|
|
},
|
|
"screenshot_id": null
|
|
}
|
|
],
|
|
|
|
"screenshots": [
|
|
{
|
|
"screenshot_id": "shot_0001",
|
|
"relative_path": "shots/shot_0001.png",
|
|
"captured_at": "2025-11-21T10:15:00.523Z"
|
|
},
|
|
{
|
|
"screenshot_id": "shot_0002",
|
|
"relative_path": "shots/shot_0002.png",
|
|
"captured_at": "2025-11-21T10:15:01.850Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Types d'Événements Supportés
|
|
|
|
| Type | Description | Champs spécifiques |
|
|
|------|-------------|-------------------|
|
|
| `mouse_click` | Clic souris | `button`, `pos`, `window` |
|
|
| `mouse_move` | Déplacement souris | `pos`, `window` |
|
|
| `mouse_scroll` | Scroll souris | `delta`, `pos`, `window` |
|
|
| `key_press` | Touche(s) clavier | `keys`, `window` |
|
|
| `key_release` | Relâchement touche | `keys`, `window` |
|
|
| `text_input` | Saisie de texte | `text`, `window` |
|
|
| `window_change` | Changement de fenêtre | `from_window`, `to_window` |
|
|
| `screen_change` | Changement d'écran détecté | `similarity_score` |
|
|
|
|
### 💡 Propositions d'Amélioration
|
|
|
|
**1. Ajout de métadonnées de performance**
|
|
```json
|
|
"performance": {
|
|
"cpu_usage_percent": 45.2,
|
|
"memory_usage_mb": 2048,
|
|
"capture_latency_ms": 12
|
|
}
|
|
```
|
|
|
|
**2. Support multi-écrans**
|
|
```json
|
|
"environment": {
|
|
"screens": [
|
|
{"id": 0, "resolution": [1920, 1080], "is_primary": true},
|
|
{"id": 1, "resolution": [1920, 1080], "is_primary": false}
|
|
]
|
|
}
|
|
```
|
|
|
|
**3. Versioning des événements**
|
|
```json
|
|
"events": [
|
|
{
|
|
"event_version": "1.0",
|
|
"t": 0.523,
|
|
...
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Couche 1 : ScreenState - Analyse Multi-Modale
|
|
|
|
### Objectif
|
|
|
|
Transformer un screenshot brut en une représentation structurée à 4 niveaux d'abstraction.
|
|
|
|
### Les 4 Niveaux
|
|
|
|
#### Niveau 1 : Raw (Ce que la machine voit)
|
|
- Screenshot brut (image)
|
|
- Résolution, ratio d'écran
|
|
- Métadonnées de capture
|
|
|
|
#### Niveau 2 : Perception (Ce que la vision déduit)
|
|
- Embeddings multi-modaux (CLIP, Pix2Struct, VLM)
|
|
- Texte détecté (OCR/VLM)
|
|
- Zones d'intérêt identifiées
|
|
|
|
#### Niveau 3 : Sémantique UI (Ce que le système comprend)
|
|
- Liste d'UIElements structurés
|
|
- Types, rôles, labels
|
|
- Embeddings locaux par élément
|
|
|
|
#### Niveau 4 : Contexte Métier (Session/Application)
|
|
- Application et fenêtre active
|
|
- Workflow en cours (si identifié)
|
|
- Variables métier
|
|
|
|
### Structure JSON
|
|
|
|
```json
|
|
{
|
|
"screen_state_id": "screen_2025-11-21T10-15-32.123Z",
|
|
"timestamp": "2025-11-21T10:15:32.123Z",
|
|
"session_id": "session_abc123",
|
|
|
|
"window": {
|
|
"app_name": "logiciel_facturation",
|
|
"window_title": "Factures - Clinique Demo",
|
|
"screen_resolution": [1920, 1080],
|
|
"workspace": "main"
|
|
},
|
|
|
|
"raw": {
|
|
"screenshot_path": "data/screens/2025-11-21/10-15-32_factures.png",
|
|
"capture_method": "mss",
|
|
"file_size_bytes": 245678
|
|
},
|
|
|
|
"perception": {
|
|
"embedding": {
|
|
"provider": "openclip_ViT-B-32",
|
|
"vector_id": "data/embeddings/screens/screen_2025-11-21T10-15-32.123Z.npy",
|
|
"dimensions": 512
|
|
},
|
|
"detected_text": [
|
|
"Factures",
|
|
"Patient",
|
|
"Montant",
|
|
"Statut",
|
|
"À valider",
|
|
"Validée"
|
|
],
|
|
"text_detection_method": "qwen_vl",
|
|
"confidence_avg": 0.92
|
|
},
|
|
|
|
"ui_elements": [
|
|
{
|
|
"element_id": "el_row_001",
|
|
"type": "table_row",
|
|
"role": "invoice_row",
|
|
"bbox": [100, 250, 1800, 280],
|
|
"label": "DUPONT Jean - 120,00 € - À valider",
|
|
"embedding": {
|
|
"provider": "openclip_ViT-B-32",
|
|
"vector_id": "data/embeddings/elements/screen_..._el_row_001.npy"
|
|
},
|
|
"tags": ["invoice", "pending"],
|
|
"confidence": 0.94
|
|
},
|
|
{
|
|
"element_id": "el_btn_open",
|
|
"type": "button",
|
|
"role": "open_invoice",
|
|
"bbox": [1750, 250, 1850, 280],
|
|
"label": "Ouvrir",
|
|
"embedding": null,
|
|
"tags": ["action", "primary"],
|
|
"confidence": 0.98
|
|
}
|
|
],
|
|
|
|
"context": {
|
|
"current_workflow_candidate": null,
|
|
"workflow_step": null,
|
|
"user_id": "dom",
|
|
"tags": ["facturation"],
|
|
"business_variables": {}
|
|
},
|
|
|
|
"metadata": {
|
|
"processing_time_ms": 245,
|
|
"ui_elements_count": 12,
|
|
"text_regions_count": 45
|
|
}
|
|
}
|
|
```
|
|
|
|
### 💡 Propositions d'Amélioration
|
|
|
|
**1. Ajout de zones d'intérêt (ROI)**
|
|
```json
|
|
"perception": {
|
|
"regions_of_interest": [
|
|
{
|
|
"roi_id": "roi_001",
|
|
"bbox": [100, 200, 1800, 800],
|
|
"type": "content_area",
|
|
"importance": 0.9
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**2. Historique de changements**
|
|
```json
|
|
"change_detection": {
|
|
"previous_state_id": "screen_2025-11-21T10-15-30.123Z",
|
|
"similarity_score": 0.87,
|
|
"changed_regions": [
|
|
{"bbox": [1500, 900, 1600, 940], "change_type": "new_element"}
|
|
]
|
|
}
|
|
```
|
|
|
|
**3. Métriques de qualité**
|
|
```json
|
|
"quality_metrics": {
|
|
"image_sharpness": 0.92,
|
|
"text_readability": 0.88,
|
|
"ui_element_detection_confidence": 0.91
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Couche 2 : UIElement Detection - Détection Sémantique
|
|
|
|
### Objectif
|
|
|
|
Transformer un screenshot en liste d'objets UI sémantiques exploitables (boutons, champs, etc.).
|
|
|
|
### Pipeline de Détection
|
|
|
|
```
|
|
Screenshot
|
|
↓
|
|
┌─────────────────────────────────────┐
|
|
│ Étape 1 : Proposer Régions d'Intérêt│
|
|
│ - Heuristiques (zones de texte) │
|
|
│ - VLM (zones cliquables) │
|
|
│ - Détection de patterns UI │
|
|
└─────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────┐
|
|
│ Étape 2 : Caractériser Éléments │
|
|
│ - Crop image → embedding image │
|
|
│ - OCR/VLM → texte + embedding texte │
|
|
│ - Position + dimensions │
|
|
└─────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────┐
|
|
│ Étape 3 : Classifier Type + Rôle │
|
|
│ - Type : button, input, checkbox... │
|
|
│ - Rôle : primary_action, cancel... │
|
|
│ - ID stable (hash) │
|
|
└─────────────────────────────────────┘
|
|
↓
|
|
Liste d'UIElements
|
|
```
|
|
|
|
### Structure UIElement
|
|
|
|
```json
|
|
{
|
|
"element_id": "el_btn_valider_001",
|
|
"type": "button",
|
|
"role": "validate_invoice",
|
|
"bbox": [1500, 900, 1600, 940],
|
|
"center": [1550, 920],
|
|
|
|
"label": "Valider la facture",
|
|
"label_confidence": 0.96,
|
|
|
|
"embeddings": {
|
|
"image": {
|
|
"provider": "openclip_ViT-B-32",
|
|
"vector_id": "data/embeddings/elements/el_btn_valider_001_img.npy",
|
|
"dimensions": 512
|
|
},
|
|
"text": {
|
|
"provider": "openclip_ViT-B-32",
|
|
"vector_id": "data/embeddings/elements/el_btn_valider_001_txt.npy",
|
|
"dimensions": 512
|
|
}
|
|
},
|
|
|
|
"visual_features": {
|
|
"dominant_color": "#4CAF50",
|
|
"has_icon": false,
|
|
"shape": "rectangle",
|
|
"size_category": "medium"
|
|
},
|
|
|
|
"tags": ["primary_action", "billing", "validation"],
|
|
"confidence": 0.94,
|
|
|
|
"metadata": {
|
|
"detection_method": "qwen_vl",
|
|
"detection_time_ms": 45
|
|
}
|
|
}
|
|
```
|
|
|
|
### Types d'Éléments Supportés
|
|
|
|
| Type | Description | Rôles typiques |
|
|
|------|-------------|----------------|
|
|
| `button` | Bouton cliquable | `primary_action`, `cancel`, `submit` |
|
|
| `text_input` | Champ de saisie | `search_field`, `form_input` |
|
|
| `checkbox` | Case à cocher | `verification`, `selection` |
|
|
| `radio` | Bouton radio | `option_selection` |
|
|
| `dropdown` | Menu déroulant | `category_selector` |
|
|
| `tab` | Onglet | `navigation` |
|
|
| `link` | Lien hypertexte | `navigation`, `external_link` |
|
|
| `icon` | Icône | `action_trigger`, `status_indicator` |
|
|
| `table_row` | Ligne de tableau | `data_row`, `selectable_item` |
|
|
| `menu_item` | Élément de menu | `action`, `submenu` |
|
|
|
|
### 💡 Propositions d'Amélioration
|
|
|
|
**1. Hiérarchie d'éléments**
|
|
```json
|
|
{
|
|
"element_id": "el_form_001",
|
|
"type": "form",
|
|
"children": [
|
|
{"element_id": "el_input_001", "type": "text_input"},
|
|
{"element_id": "el_btn_submit", "type": "button"}
|
|
]
|
|
}
|
|
```
|
|
|
|
**2. États d'éléments**
|
|
```json
|
|
{
|
|
"state": {
|
|
"enabled": true,
|
|
"visible": true,
|
|
"focused": false,
|
|
"selected": false,
|
|
"value": "DUPONT Jean"
|
|
}
|
|
}
|
|
```
|
|
|
|
**3. Relations entre éléments**
|
|
```json
|
|
{
|
|
"relationships": [
|
|
{
|
|
"type": "label_for",
|
|
"target_element_id": "el_input_001"
|
|
},
|
|
{
|
|
"type": "part_of_group",
|
|
"group_id": "form_patient"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Couche 3 : State Embedding - Fusion Multi-Modale
|
|
|
|
### Objectif
|
|
|
|
Créer un "fingerprint" unique de l'écran en fusionnant toutes les modalités (image, texte, UI, contexte).
|
|
|
|
### Composantes du State Embedding
|
|
|
|
```python
|
|
state_emb = fusion(
|
|
img_emb, # Embedding CLIP du screenshot entier
|
|
text_emb, # Embedding du texte détecté concaténé
|
|
title_emb, # Embedding du titre de fenêtre
|
|
ui_emb, # Moyenne des embeddings des éléments UI
|
|
ctx_emb # Contexte workflow/métier encodé
|
|
)
|
|
```
|
|
|
|
### Méthodes de Fusion
|
|
|
|
#### Option A : Fusion Pondérée (Recommandée pour démarrer)
|
|
|
|
```python
|
|
state_emb = normalize(
|
|
0.5 * img_emb + # Visuel global (50%)
|
|
0.3 * text_emb + # Texte détecté (30%)
|
|
0.1 * title_emb + # Titre fenêtre (10%)
|
|
0.1 * ui_emb # Éléments UI (10%)
|
|
)
|
|
```
|
|
|
|
**Avantages** :
|
|
- Simple à implémenter
|
|
- Pas de training nécessaire
|
|
- Poids ajustables manuellement
|
|
|
|
#### Option B : Concaténation + Projection
|
|
|
|
```python
|
|
z = concat([
|
|
normalize(img_emb),
|
|
normalize(text_emb),
|
|
normalize(title_emb),
|
|
normalize(ui_emb),
|
|
normalize(ctx_emb)
|
|
])
|
|
|
|
state_emb = projection_layer(z) # MLP ou PCA
|
|
```
|
|
|
|
**Avantages** :
|
|
- Préserve toute l'information
|
|
- Peut être affiné avec du training
|
|
- Plus expressif
|
|
|
|
### Structure JSON
|
|
|
|
```json
|
|
{
|
|
"state_embedding": {
|
|
"embedding_id": "state_emb_2025-11-21T10-15-32.123Z",
|
|
"vector_id": "data/embeddings/states/state_2025-11-21T10-15-32.123Z.npy",
|
|
"dimensions": 512,
|
|
"fusion_method": "weighted",
|
|
|
|
"components": {
|
|
"image": {
|
|
"weight": 0.5,
|
|
"vector_id": "data/embeddings/screens/screen_..._img.npy"
|
|
},
|
|
"text": {
|
|
"weight": 0.3,
|
|
"vector_id": "data/embeddings/screens/screen_..._text.npy",
|
|
"source_text": "Factures | Patient | Montant | Statut | ..."
|
|
},
|
|
"title": {
|
|
"weight": 0.1,
|
|
"vector_id": "data/embeddings/screens/screen_..._title.npy",
|
|
"source_text": "Factures - Clinique Demo"
|
|
},
|
|
"ui_elements": {
|
|
"weight": 0.1,
|
|
"aggregation": "mean",
|
|
"element_count": 12
|
|
}
|
|
},
|
|
|
|
"metadata": {
|
|
"computation_time_ms": 78,
|
|
"provider": "openclip_ViT-B-32"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Utilisations du State Embedding
|
|
|
|
| Usage | Description | Seuil typique |
|
|
|-------|-------------|---------------|
|
|
| **Node Matching** | Reconnaître dans quel node on se trouve | > 0.85 |
|
|
| **UI Change Detection** | Détecter changements significatifs | < 0.70 |
|
|
| **Workflow Similarity** | Trouver workflows similaires | > 0.75 |
|
|
| **Historical Search** | Chercher états passés similaires | > 0.80 |
|
|
|
|
### 💡 Propositions d'Amélioration
|
|
|
|
**1. Embeddings contextuels adaptatifs**
|
|
```python
|
|
# Ajuster les poids selon le contexte
|
|
if workflow_type == "form_filling":
|
|
weights = {"text": 0.5, "ui": 0.3, "image": 0.2}
|
|
elif workflow_type == "visual_inspection":
|
|
weights = {"image": 0.7, "ui": 0.2, "text": 0.1}
|
|
```
|
|
|
|
**2. Embeddings temporels**
|
|
```json
|
|
{
|
|
"temporal_context": {
|
|
"previous_states": [
|
|
{"state_id": "...", "time_delta_s": -2.5, "similarity": 0.92}
|
|
],
|
|
"trajectory_embedding": "data/embeddings/trajectories/traj_001.npy"
|
|
}
|
|
}
|
|
```
|
|
|
|
**3. Métriques de qualité**
|
|
```json
|
|
{
|
|
"quality_metrics": {
|
|
"component_alignment": 0.89,
|
|
"information_preservation": 0.94,
|
|
"discriminative_power": 0.87
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Couche 4 : Workflow Graph - Modélisation en Graphe
|
|
|
|
### Objectif
|
|
|
|
Modéliser les workflows comme des graphes explicites (Nodes + Edges) avec progression d'apprentissage formalisée.
|
|
|
|
### Concepts Clés
|
|
|
|
**WorkflowNode** = Template d'état d'écran
|
|
**WorkflowEdge** = Transition (action) entre deux nodes
|
|
**Workflow** = Graphe complet avec learning state
|
|
|
|
### Structure WorkflowNode
|
|
|
|
```json
|
|
{
|
|
"node_id": "N1_liste_factures",
|
|
"label": "Liste des factures",
|
|
"description": "Écran principal listant les factures avec statut à valider / validée.",
|
|
|
|
"screen_template": {
|
|
"window": {
|
|
"app_name_any_of": ["logiciel_facturation"],
|
|
"title_contains_any_of": ["Factures", "Liste des factures"]
|
|
},
|
|
|
|
"required_text_any": [
|
|
"Factures",
|
|
"Patient",
|
|
"Montant",
|
|
"Statut"
|
|
],
|
|
|
|
"required_ui_elements": [
|
|
{
|
|
"role": "invoice_row",
|
|
"type_any_of": ["table_row", "list_item"],
|
|
"min_count": 1
|
|
},
|
|
{
|
|
"role": "open_invoice",
|
|
"type_any_of": ["button"],
|
|
"label_contains_any_of": ["Ouvrir", "Détail"]
|
|
}
|
|
],
|
|
|
|
"embedding_prototype": {
|
|
"provider": "openclip_ViT-B-32",
|
|
"vector_id": "data/embeddings/workflows/WF_validation_facture/N1_prototype.npy",
|
|
"min_cosine_similarity": 0.85,
|
|
"sample_count": 15
|
|
},
|
|
|
|
"optional_elements": [
|
|
{
|
|
"role": "search_field",
|
|
"type": "text_input"
|
|
}
|
|
]
|
|
},
|
|
|
|
"metadata": {
|
|
"created_at": "2025-11-21T10:30:00Z",
|
|
"updated_at": "2025-11-21T10:30:00Z",
|
|
"observation_count": 15,
|
|
"tags": ["facturation", "liste"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Structure WorkflowEdge
|
|
|
|
```json
|
|
{
|
|
"edge_id": "E1_ouvrir_facture",
|
|
"from_node": "N1_liste_factures",
|
|
"to_node": "N2_detail_facture",
|
|
|
|
"action": {
|
|
"type": "mouse_click",
|
|
"strategy": "row_then_button",
|
|
|
|
"target": {
|
|
"role": "invoice_row",
|
|
"selection_policy": "first_pending",
|
|
"fallback_strategy": "visual_similarity"
|
|
},
|
|
|
|
"secondary_target": {
|
|
"role": "open_invoice",
|
|
"optional": true
|
|
},
|
|
|
|
"parameters": {
|
|
"click_offset": [0, 0],
|
|
"double_click": false,
|
|
"wait_after_ms": 500
|
|
}
|
|
},
|
|
|
|
"constraints": {
|
|
"max_delay_seconds": 5,
|
|
"pre_conditions": [
|
|
"element:invoice_row_visible",
|
|
"element:invoice_row_status=pending"
|
|
],
|
|
"post_conditions": [
|
|
"window_title_changed",
|
|
"new_ui_elements_detected"
|
|
]
|
|
},
|
|
|
|
"post_conditions": {
|
|
"expected_node": "N2_detail_facture",
|
|
"min_similarity": 0.85,
|
|
"timeout_seconds": 5
|
|
},
|
|
|
|
"stats": {
|
|
"manual_executions": 12,
|
|
"assist_executions": 0,
|
|
"auto_executions": 0,
|
|
"success_count": 12,
|
|
"failure_count": 0,
|
|
"avg_execution_time_ms": 1250,
|
|
"last_executed_at": "2025-11-21T10:30:00Z"
|
|
},
|
|
|
|
"metadata": {
|
|
"created_at": "2025-11-21T10:30:00Z",
|
|
"updated_at": "2025-11-21T10:30:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Structure Workflow Complète
|
|
|
|
```json
|
|
{
|
|
"workflow_id": "WF_validation_facture",
|
|
"name": "Validation facture consultation",
|
|
"description": "Ouvrir une facture en attente, la contrôler et la valider.",
|
|
"version": 1,
|
|
|
|
"learning_state": "OBSERVATION",
|
|
|
|
"created_at": "2025-11-21T10:45:00Z",
|
|
"updated_at": "2025-11-21T10:45:00Z",
|
|
|
|
"entry_nodes": ["N1_liste_factures"],
|
|
"end_nodes": ["N5_liste_factures_maj"],
|
|
|
|
"nodes": [
|
|
{
|
|
"node_id": "N1_liste_factures",
|
|
"label": "Liste des factures",
|
|
"description": "Écran principal listant les factures.",
|
|
"screen_template": { /* ... */ }
|
|
},
|
|
{
|
|
"node_id": "N2_detail_facture",
|
|
"label": "Détail facture",
|
|
"description": "Écran détaillé d'une facture unique.",
|
|
"screen_template": { /* ... */ }
|
|
},
|
|
{
|
|
"node_id": "N3_controle_facture",
|
|
"label": "Contrôle facture",
|
|
"description": "Écran de contrôle / vérification avant validation.",
|
|
"screen_template": { /* ... */ }
|
|
},
|
|
{
|
|
"node_id": "N4_popup_confirmation",
|
|
"label": "Popup confirmation",
|
|
"description": "Fenêtre modale de confirmation définitive.",
|
|
"screen_template": { /* ... */ }
|
|
},
|
|
{
|
|
"node_id": "N5_liste_factures_maj",
|
|
"label": "Liste factures mise à jour",
|
|
"description": "Retour à la liste, facture marquée 'Validée'.",
|
|
"screen_template": {
|
|
"similar_to_node": "N1_liste_factures",
|
|
"additional_constraints": {
|
|
"must_have_row_with_status": "Validée"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
|
|
"edges": [
|
|
{
|
|
"edge_id": "E1_ouvrir_facture",
|
|
"from_node": "N1_liste_factures",
|
|
"to_node": "N2_detail_facture",
|
|
"action": { /* ... */ }
|
|
},
|
|
{
|
|
"edge_id": "E2_valider_depuis_detail",
|
|
"from_node": "N2_detail_facture",
|
|
"to_node_candidates": ["N3_controle_facture", "N4_popup_confirmation"],
|
|
"action": {
|
|
"type": "mouse_click",
|
|
"target": {
|
|
"role": "validate_button"
|
|
}
|
|
},
|
|
"branching": {
|
|
"type": "conditional",
|
|
"detection_method": "screen_similarity",
|
|
"learned_probability": {
|
|
"N3_controle_facture": 0.7,
|
|
"N4_popup_confirmation": 0.3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"edge_id": "E3_confirmer_controle",
|
|
"from_node": "N3_controle_facture",
|
|
"to_node": "N4_popup_confirmation",
|
|
"action": {
|
|
"type": "compound",
|
|
"steps": [
|
|
{
|
|
"type": "mouse_click",
|
|
"target": {
|
|
"role": "checkbox_verification"
|
|
},
|
|
"repeat": "all"
|
|
},
|
|
{
|
|
"type": "mouse_click",
|
|
"target": {
|
|
"role": "confirm_validation"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"edge_id": "E4_confirmer_definitivement",
|
|
"from_node": "N4_popup_confirmation",
|
|
"to_node": "N5_liste_factures_maj",
|
|
"action": {
|
|
"type": "mouse_click",
|
|
"target": {
|
|
"role": "confirm_yes"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
|
|
"safety_rules": {
|
|
"forbidden_text_clicks": [
|
|
"Supprimer",
|
|
"Annuler la facture",
|
|
"Effacer"
|
|
],
|
|
"forbidden_roles": [
|
|
"delete_action",
|
|
"dangerous_action"
|
|
],
|
|
"max_amount_without_manual_check": 1000.0,
|
|
"require_confirmation_for": [
|
|
"delete",
|
|
"irreversible_action"
|
|
]
|
|
},
|
|
|
|
"stats": {
|
|
"observed_runs": 15,
|
|
"assist_runs": 0,
|
|
"auto_candidate_runs": 0,
|
|
"auto_confirmed_runs": 0,
|
|
"success_rate_overall": 1.0,
|
|
"avg_duration_seconds": 45.2,
|
|
"total_executions": 15
|
|
},
|
|
|
|
"learning": {
|
|
"state": "OBSERVATION",
|
|
|
|
"thresholds": {
|
|
"min_observed_runs_for_assist": 5,
|
|
"min_assist_runs_for_auto_candidate": 10,
|
|
"min_assist_success_rate_for_auto_candidate": 0.90,
|
|
"min_auto_candidate_runs_for_auto_confirmed": 20,
|
|
"min_auto_candidate_success_rate_for_auto_confirmed": 0.95
|
|
},
|
|
|
|
"progression": {
|
|
"current_phase": "OBSERVATION",
|
|
"progress_percent": 100.0,
|
|
"next_phase": "COACHING",
|
|
"requirements_met": true,
|
|
"user_approval_required": true
|
|
}
|
|
},
|
|
|
|
"metadata": {
|
|
"created_by": "system",
|
|
"customer": "Clinique Demo",
|
|
"application": "logiciel_facturation",
|
|
"tags": ["facturation", "T2A", "validation"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### États d'Apprentissage (Learning States)
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ OBSERVATION (Shadow) │
|
|
│ - Enregistre ScreenStates + actions │
|
|
│ - Détecte séquences répétées │
|
|
│ - Construit le graphe │
|
|
│ Critères: ≥5 exécutions similaires │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ COACHING (Assist) │
|
|
│ - Reconnaît le début du workflow │
|
|
│ - Suggère les étapes à l'avance │
|
|
│ - Utilisateur exécute, système observe │
|
|
│ Critères: ≥10 exécutions assistées, succès >90% │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ AUTO_CANDIDATE (Semi-auto supervisé) │
|
|
│ - Exécute automatiquement │
|
|
│ - Demande confirmation à chaque étape │
|
|
│ - Pause si écran inattendu │
|
|
│ Critères: ≥20 exécutions, succès >95%, validation user │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ AUTO_CONFIRMÉ (Pilote automatique) │
|
|
│ - Exécute sans demander │
|
|
│ - Whitelist activée │
|
|
│ - Rétrogradation si UI change ou confiance baisse │
|
|
│ Critères: Validation explicite utilisateur │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 💡 Propositions d'Amélioration
|
|
|
|
**1. Graphes avec boucles et conditions**
|
|
```json
|
|
{
|
|
"edge_id": "E_loop_search",
|
|
"from_node": "N_search_results",
|
|
"to_node": "N_search_results",
|
|
"condition": {
|
|
"type": "while",
|
|
"expression": "not found_target_invoice",
|
|
"max_iterations": 10
|
|
}
|
|
}
|
|
```
|
|
|
|
**2. Sous-workflows réutilisables**
|
|
```json
|
|
{
|
|
"workflow_id": "WF_validation_facture",
|
|
"sub_workflows": [
|
|
{
|
|
"sub_workflow_id": "SUB_login",
|
|
"entry_edge": "E0_start",
|
|
"exit_edge": "E1_after_login"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**3. Métriques de confiance par node**
|
|
```json
|
|
{
|
|
"node_id": "N2_detail_facture",
|
|
"confidence_metrics": {
|
|
"recognition_accuracy": 0.96,
|
|
"false_positive_rate": 0.02,
|
|
"avg_matching_time_ms": 45
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Pipeline de Traitement Complet
|
|
|
|
### De RawSession à Workflow Appris
|
|
|
|
```
|
|
1. CAPTURE
|
|
RawSession enregistrée
|
|
↓
|
|
2. ANALYSE
|
|
Pour chaque screenshot_id:
|
|
- Créer ScreenState (4 niveaux)
|
|
- Détecter UIElements
|
|
- Calculer state_embedding
|
|
↓
|
|
3. DÉTECTION DE PATTERNS
|
|
Analyser séquence d'événements:
|
|
- Grouper par fenêtre
|
|
- Détecter répétitions
|
|
- Identifier transitions récurrentes
|
|
↓
|
|
4. CONSTRUCTION DU GRAPHE
|
|
Créer Workflow:
|
|
- Nodes = ScreenStates similaires groupés
|
|
- Edges = Actions entre nodes
|
|
- Stats = Compteurs d'exécution
|
|
↓
|
|
5. APPRENTISSAGE
|
|
Mettre à jour learning_state:
|
|
- OBSERVATION → COACHING (si critères atteints)
|
|
- Calculer embeddings prototypes
|
|
- Affiner seuils de similarité
|
|
↓
|
|
6. EXÉCUTION
|
|
Rejouer workflow:
|
|
- Matcher state_emb → node
|
|
- Trouver UIElement par rôle
|
|
- Exécuter action
|
|
- Vérifier post-conditions
|
|
```
|
|
|
|
### Exemple Concret : "Validation Facture T2A"
|
|
|
|
#### Étape 1 : Capture (RawSession)
|
|
```
|
|
Session: 15 minutes
|
|
Events: 45 événements
|
|
Screenshots: 12 captures
|
|
```
|
|
|
|
#### Étape 2 : Analyse (ScreenStates)
|
|
```
|
|
12 ScreenStates créés
|
|
Moyenne 8 UIElements par état
|
|
State embeddings calculés
|
|
```
|
|
|
|
#### Étape 3 : Détection
|
|
```
|
|
Pattern détecté: N1 → N2 → N3 → N4 → N5
|
|
Répétitions: 3 fois
|
|
Similarité moyenne: 0.92
|
|
```
|
|
|
|
#### Étape 4 : Construction
|
|
```
|
|
Workflow créé: WF_validation_facture
|
|
Nodes: 5 (N1 à N5)
|
|
Edges: 4 (E1 à E4)
|
|
Learning state: OBSERVATION
|
|
```
|
|
|
|
#### Étape 5 : Apprentissage
|
|
```
|
|
Après 5 exécutions:
|
|
→ Passage en COACHING
|
|
→ Embeddings prototypes calculés
|
|
→ Seuils affinés
|
|
|
|
Après 15 exécutions assistées:
|
|
→ Passage en AUTO_CANDIDATE
|
|
→ Confiance: 96%
|
|
```
|
|
|
|
#### Étape 6 : Exécution
|
|
```
|
|
Détection: "Je suis dans N1"
|
|
Action: Clic sur role=invoice_row
|
|
Vérification: Transition vers N2 (similarité 0.94)
|
|
Succès: ✓
|
|
```
|
|
|
|
---
|
|
|
|
## 📐 Mapping avec Code Existant
|
|
|
|
### Fichiers Actuels vs Architecture Cible
|
|
|
|
| Composant Actuel | Fichier | Architecture Cible |
|
|
|------------------|---------|-------------------|
|
|
| Event Capture | `event_capture.py` | → RawSession |
|
|
| Screen Capture | `enriched_screen_capture.py` | → ScreenState (raw) |
|
|
| UI Detection | `ui_element_detector.py` | → UIElement Detection |
|
|
| Embeddings | `multimodal_embedding_manager.py` | → State Embedding |
|
|
| Workflow Detection | `workflow_detector.py` | → Workflow Graph |
|
|
| Matching | `enhanced_workflow_matcher.py` | → Node Matching |
|
|
|
|
### Évolutions Nécessaires
|
|
|
|
**1. RawSession**
|
|
- ✅ Déjà partiellement implémenté (SessionManager)
|
|
- 🔧 À enrichir : métadonnées environnement, performance
|
|
|
|
**2. ScreenState**
|
|
- ✅ Bases existantes (EnrichedScreenState)
|
|
- 🔧 À structurer : 4 niveaux explicites
|
|
- 🔧 À ajouter : contexte métier
|
|
|
|
**3. UIElement**
|
|
- ✅ Modèles existants (UIElement, ui_element_models.py)
|
|
- 🔧 À enrichir : rôles sémantiques, embeddings duaux
|
|
|
|
**4. State Embedding**
|
|
- ✅ Embeddings existants (MultiModalEmbeddingManager)
|
|
- 🔧 À implémenter : fusion multi-modale
|
|
|
|
**5. Workflow Graph**
|
|
- 🔧 À créer : structure Nodes/Edges
|
|
- 🔧 À migrer : workflows actuels (liste de steps)
|
|
- 🔧 À implémenter : learning states
|
|
|
|
---
|
|
|
|
## 🚀 Plan de Migration Progressif
|
|
|
|
### Phase 1 : Fondations (Semaines 1-2)
|
|
|
|
**Objectif** : Structures de données et formats JSON
|
|
|
|
- [ ] Définir schémas JSON complets
|
|
- [ ] Créer classes Python (ScreenState, UIElement, WorkflowNode, etc.)
|
|
- [ ] Implémenter sérialisation/désérialisation
|
|
- [ ] Tests unitaires sur structures
|
|
|
|
**Livrables** :
|
|
- `geniusia2/core/models/screen_state.py`
|
|
- `geniusia2/core/models/workflow_graph.py`
|
|
- Schémas JSON dans `docs/schemas/`
|
|
|
|
### Phase 2 : UIElement Detection (Semaines 3-4)
|
|
|
|
**Objectif** : Pipeline de détection robuste
|
|
|
|
- [ ] Implémenter détection de régions d'intérêt
|
|
- [ ] Intégrer VLM pour zones cliquables
|
|
- [ ] Calculer embeddings duaux (image + texte)
|
|
- [ ] Classifier types et rôles
|
|
|
|
**Livrables** :
|
|
- `geniusia2/core/ui_element_pipeline.py`
|
|
- Tests avec screenshots réels
|
|
|
|
### Phase 3 : State Embedding (Semaines 5-6)
|
|
|
|
**Objectif** : Fusion multi-modale
|
|
|
|
- [ ] Implémenter fusion pondérée
|
|
- [ ] Calculer embeddings de titre/texte
|
|
- [ ] Agréger embeddings UI
|
|
- [ ] Benchmarker qualité (similarité, discrimination)
|
|
|
|
**Livrables** :
|
|
- `geniusia2/core/state_embedding_fusion.py`
|
|
- Métriques de qualité
|
|
|
|
### Phase 4 : Workflow Graph (Semaines 7-9)
|
|
|
|
**Objectif** : Modélisation en graphe
|
|
|
|
- [ ] Créer WorkflowNode avec templates
|
|
- [ ] Créer WorkflowEdge avec actions
|
|
- [ ] Implémenter matching node (state_emb → node)
|
|
- [ ] Migrer workflows existants
|
|
|
|
**Livrables** :
|
|
- `geniusia2/core/workflow_graph_builder.py`
|
|
- Script de migration
|
|
|
|
### Phase 5 : Learning States (Semaines 10-12)
|
|
|
|
**Objectif** : Progression d'apprentissage
|
|
|
|
- [ ] Implémenter machine à états
|
|
- [ ] Calculer métriques de progression
|
|
- [ ] Intégrer dans GUI (indicateurs)
|
|
- [ ] Tests end-to-end
|
|
|
|
**Livrables** :
|
|
- `geniusia2/core/learning_state_manager.py`
|
|
- GUI mise à jour
|
|
|
|
### Phase 6 : Production (Semaines 13-14)
|
|
|
|
**Objectif** : Déploiement et monitoring
|
|
|
|
- [ ] Tests utilisateurs
|
|
- [ ] Optimisations performance
|
|
- [ ] Documentation utilisateur
|
|
- [ ] Monitoring et métriques
|
|
|
|
---
|
|
|
|
## 📊 Métriques de Succès
|
|
|
|
### Qualité de Détection
|
|
|
|
| Métrique | Cible | Mesure |
|
|
|----------|-------|--------|
|
|
| Précision UIElement | >90% | TP / (TP + FP) |
|
|
| Rappel UIElement | >85% | TP / (TP + FN) |
|
|
| Précision Node Matching | >95% | Nodes correctement identifiés |
|
|
| Temps de traitement | <500ms | Par ScreenState |
|
|
|
|
### Qualité d'Apprentissage
|
|
|
|
| Métrique | Cible | Mesure |
|
|
|----------|-------|--------|
|
|
| Workflows détectés | >80% | Patterns réels détectés |
|
|
| Faux positifs | <5% | Workflows incorrects |
|
|
| Temps d'apprentissage | <10 exéc | Pour passer en COACHING |
|
|
| Taux de succès AUTO | >95% | Exécutions réussies |
|
|
|
|
### Performance Système
|
|
|
|
| Métrique | Cible | Mesure |
|
|
|----------|-------|--------|
|
|
| Latence capture | <50ms | Temps event → screenshot |
|
|
| Latence analyse | <300ms | Screenshot → ScreenState |
|
|
| Latence matching | <100ms | State → Node |
|
|
| Mémoire | <2GB | RAM utilisée |
|
|
|
|
---
|
|
|
|
## 🔒 Considérations de Sécurité
|
|
|
|
### Protection des Données
|
|
|
|
**1. Chiffrement des captures**
|
|
```json
|
|
{
|
|
"raw": {
|
|
"screenshot_path": "encrypted://data/screens/...",
|
|
"encryption_method": "AES-256-GCM",
|
|
"key_id": "key_2025_11"
|
|
}
|
|
}
|
|
```
|
|
|
|
**2. Anonymisation des données sensibles**
|
|
```json
|
|
{
|
|
"privacy": {
|
|
"pii_detected": true,
|
|
"anonymized_fields": ["patient_name", "ssn"],
|
|
"anonymization_method": "hash_sha256"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Safety Rules
|
|
|
|
**1. Validation des actions**
|
|
- Whitelist d'applications autorisées
|
|
- Blacklist de rôles dangereux
|
|
- Confirmation pour actions irréversibles
|
|
|
|
**2. Rollback automatique**
|
|
- Sauvegarde état avant action
|
|
- Détection d'échec
|
|
- Restauration automatique
|
|
|
|
**3. Audit trail**
|
|
- Logs immuables de toutes les actions
|
|
- Traçabilité complète
|
|
- Conformité RGPD
|
|
|
|
---
|
|
|
|
## 📚 Références et Ressources
|
|
|
|
### Modèles de Vision
|
|
|
|
- **CLIP** : Contrastive Language-Image Pre-training
|
|
- **Pix2Struct** : Screenshot parsing as pretraining
|
|
- **Qwen-VL** : Vision-Language Model
|
|
- **OWL-v2** : Open-vocabulary object detection
|
|
|
|
### Techniques d'Embedding
|
|
|
|
- **Cosine Similarity** : Mesure de similarité
|
|
- **FAISS** : Indexation et recherche rapide
|
|
- **PCA** : Réduction dimensionnelle
|
|
- **t-SNE** : Visualisation
|
|
|
|
### Architectures de Graphes
|
|
|
|
- **State Machines** : Machines à états finis
|
|
- **Petri Nets** : Modélisation de workflows
|
|
- **DAG** : Directed Acyclic Graphs
|
|
|
|
---
|
|
|
|
## 📝 Conclusion
|
|
|
|
Cette architecture fournit une base solide pour transformer RPA Vision V2 d'un système de capture/rejeu simple en un **système d'apprentissage cognitif** capable de :
|
|
|
|
✅ **Comprendre** les interfaces à un niveau sémantique
|
|
✅ **Apprendre** des workflows de manière progressive
|
|
✅ **S'adapter** aux changements d'UI
|
|
✅ **Exécuter** de manière robuste et sécurisée
|
|
|
|
La migration peut se faire de manière **incrémentale** sans casser l'existant, en ajoutant progressivement les couches d'abstraction.
|
|
|
|
---
|
|
|
|
**Document créé le** : 22 novembre 2024
|
|
**Auteur** : Architecture collaborative
|
|
**Version** : 1.0
|
|
**Statut** : ✅ Référence Architecturale Complète
|
|
|