coffreobsidian/inbox/Pipeline de mon programme.md
2025-04-18 17:28:58 +02:00

207 lines
7.1 KiB
Markdown

## 1. Schéma de mon pipeline
```scss
Ticket brut (JSON / Markdown) + images
[TicketDataLoader]
[ticket_agent] Analyse texte du ticket
[image_sorter] Trie les images pertinentes
[image_analyser] Analyse chaque image pertinente avec contexte
[report_generator] Génère un rapport JSON + Markdown
Output final (JSON + .md dans /output et /reports)
```
## 2. Rôle de AgentImageSorter dans le pipeline
#### Mission: déterminer si une image jointe est pertinent
- Analyse de type binaire ("oui" ou "non") avec une explication succincte.
- Utilise le modèle PixtralLarge, qui lui-même encode l'image en base64.
L'encodage base64 est fait uniquement dans la classe PixtralLarge(voir pour supprimer cette fonctionnalité dans l'agent)
- Entrée : image_path: str
- Traitement principal:
1. Vérifier si l'image existe et est lisible
2. Génère um prompt
3. Apelle PixtralLarge.interroger_avec_image(image_path, prompt)
1. Ce LLM encode lui_même en base64
2. Envoie une requête vers l'API MIstral
4. Analyse la réponse:
1. Explicite ? ("oui", "non")
2. Sinon, heuristique par mots-clés
5. Produit une sortie détaillée
```python
{
"is_relevant": True / False,
"reason": "Explication du modèle",
"raw_response": "...",
"error": False,
"metadata": {...}
}
```
#### Utilisation par l'orchestrateur
Dans orchestratoe.triter_ticket():
1. Pour chaque image dans attchments/:
2. Appelle image_sorter.executer(image_path)
3. Si is_relevant == True, ajoute à la liste des images pertinentes
4. Ces images seront analysées plus tard dans image_analyser avec contexte texte
#### Localisation du résultat du tri d'image
Dans orchestrator.traiter_ticket() -> bloc principal du tri d'images:
Passage clé:
```python
sorting_result = self.image_sorter.executer(img_path)
```
Ce sorting_result correspond exactement à la sortie de AgentImageSorter.executer(...), qui contien:
```python
{
"is_relevant": True/False,
"reason": "Explication du LLM",
"raw_response": "...",
"error": False,
"metadata": {
"image_path": "...",
...
}
}
```
Ensuite il est stocké dans cette ligne:
```python
images_analyses[img_path] = {
"sorting": sorting_result,
"analysis": None # sera complété plus tard
}
```
images_analyses est un dictionnaire qui regroupe toutes les images traitées dans un ticket, qu'elles soient pertinentes ou non.
Il est ensuite injecté dans la structure de rapport que l'orchestrateut transmet à l'agent de génération de rapport(report_generator):
```python
rapport_data = {
"ticket_data": ticket_data,
"ticket_id": ticket_id,
"ticket_analyse": ticket_analysis,
"analyse_images": images_analyses, # ← ici
"metadata": {
...
}
}
```
Et ce rapport est transmis ici:
```python
json_path, md_path = self.report_generator.executer(rapport_data, model_reports_dir)
```
**Résumé flux de l'information**
```text
AgentImageSorter.executer(image_path)
→ renvoie sorting_result = { is_relevant, reason, ... }
Orchestrator.traiter_ticket()
Stocke le résultat dans images_analyses[image_path] = { sorting: ..., analysis: None }
Ajoute à rapport_data["analyse_images"]
Transmis à report_generator.executer(rapport_data)
```
## 3. Agent d'analyse de ticket
#### Objectif:
Analyser les tickets de support (au format JSON) pour:
- Reconstituer le contexte tecnique du tcket
- Nettoyer et structurer le fil de discussion
- Identifier les éléments visuels clés (pour aider analyse des images pertinentes)
- Injecter les données nettoyées dans le pipeline
##### Entrée:
- Un dictionnaire python extrait du fichier TXXXX_rapport.json
- Ce rapport contient les champs "name", "description", "messages", etc ...
##### Sortie:
- Une chaîne de texte contenant un résumé structuré du ticket (avec consignes pour rester fidèle au texte original)
- Cette réponse est transmise:
- Au prochain agent analyse image sous forme de contexte et analyse à l'agetn report
- Sauvegarde le résultat en JSON avec sauvegarder_donnees(...)
#### Fonctionnement dans le pipeline (orchestrator.py)
Méthode:
```python
ticket_analysis = self.ticket_agent.executer(ticket_data)
```
transmission à l'agent analyse d'image:
```python
contexte_ticket = ticket_analysis
analysis_result = self.image_analyser.executer(image_path, contexte=contexte_ticket)
```
transmission à l'agent report generator:
Tout est rassemblé dans un dictionnaire rapport_data:
```python
rapport_data = {
"ticket_data": ticket_data,
"ticket_id": ticket_id,
"ticket_analyse": ticket_analysis,
"analyse_images": images_analyses,
"metadata": {
"timestamp_debut": self._get_timestamp(),
"ticket_id": ticket_id,
"images_analysees": images_count,
"images_pertinentes": len(relevant_images)
}
}
```
Puis transmis à report_generator:
```python
if self.report_generator:
json_path, md_path = self.report_generator.executer(rapport_data, model_reports_dir)
```
## 4. Agent analyser d'image (AgentImageAnalyser)
#### Objectifs:
Cet agent a pour but d'analyser chaque image jugée pertinente, en s'appuyant sur:
- Le contexte textuel du ticket produit par AgentTicketAnalyser
- L'accès à l'image (via chemin fichier) analysée visuellement via un LLM multimodal
Il ne fournit pas de de diagnostic, ne propose aucune solutiol, et se limite à des observations factuelles et tehcniques issues des captures.
#### Fonctionnement gnéral
- __init__
- Initialise le prompt système à envoyer au LLM.
- Définit les instructions factuelles pour analyser une image (menus visibles, éléments grisés, erreurs affichées, etc).
- Applique la configuration au LLM: température, top_p,...
- _verifier_image(image_path)
- Vérifie que l'image existe, est lisible, et a des dimensions valides.
- Important pour éviter les erreurs en aval
- _generer_prompt_analyse(contexte, prefix)
- Génère un prompt personnalisé pour le LLM.
- Combine un préfix("Analyse cette image...") avec le contexte textuel du ticket, puis les instructions factuelles.
- Sert à encadrer et orienter la génération du modèle.
- executer(image_path, contexte)
C'est la fonction principale de l'agent. Elle:
- Vérifie l'image
- Génère le prompt avec le contexte du ticket
- Appelle le modèle multimodal(interroger_avec_image) ou fallback avec base64 si nécessaire
- Vérifie les erreurs de réponse (si le modèle dit qu'il ne peut pas analyser l'image)
- Structure un dictionnaire result avec:
- L'analyse textuelle(analyse)
- La réponse brut(raw_response)
- Des métadonnées (modèle utilisé, timestamp, nom image, etc...)
- Appelle sauvegarder_donnees() pour enregistrer l'analyse dans reports/
- Ajoute l'analyse à l'historique avec ajouter_historique(...)
#### Intégration dans le pipeline (orchestrator.py)
Dans le fichier orchestrateur:
- L'agent est appelé une fois que les images pertinentes ont éé détectées (ImageSorter)
- Pour chaque image pertinente :
- Le chemin de l'image est passé à AgentTicketAnalyser
- Le contexte du ticket est récupéré depuis AgentTicketAnalyser
- Le résultat est stocké dans images_analyses[image_path]["analysis]