mirror of
https://github.com/Ladebeze66/coffreobsidian.git
synced 2025-12-16 22:57:45 +01:00
207 lines
7.1 KiB
Markdown
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]
|
|
|