diff --git a/.obsidian/app.json b/.obsidian/app.json index d222747..d91acde 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1,5 +1,5 @@ { - "spellcheck": true, + "spellcheck": false, "attachmentFolderPath": "./PJ", "newFileLocation": "folder", "newFileFolderPath": "inbox", diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index f24895e..8ace27d 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,235 +4,123 @@ "type": "split", "children": [ { - "id": "fd396beb68f53aec", + "id": "c3ae94f129fe31f2", "type": "tabs", "children": [ { - "id": "09e01f25377c213c", + "id": "7ae3febbe80b4ed0", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/Notes essentielles Doc RAG + RAGFLOW.md", + "file": "inbox/Questions pour Karim.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Notes essentielles Doc RAG + RAGFLOW" + "title": "Questions pour Karim" } }, { - "id": "a8e304ba57b6250d", + "id": "15afc2cd5e501c0e", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/RAGFlow_KB_Normes_Schemas.md", + "file": "inbox/Prompt recherches approfondis LLM (Pixtral-Large).md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "RAGFlow_KB_Normes_Schemas" + "title": "Prompt recherches approfondis LLM (Pixtral-Large)" } }, { - "id": "26e7057dfae72dcd", + "id": "c29eacf07a0d9d8e", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/Documentation RAG + RAGFLOW.md", - "mode": "preview", - "source": false - }, - "icon": "lucide-file", - "title": "Documentation RAG + RAGFLOW" - } - }, - { - "id": "2ff5e9d979adcdc2", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Ragflow modérée-avancée.md", + "file": "inbox/Prompt recherches approfondis LLM (Pixtral-Large).md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Ragflow modérée-avancée" + "title": "Prompt recherches approfondis LLM (Pixtral-Large)" } }, { - "id": "195ea0ec5d0c2387", + "id": "0913b205429ec3ee", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/Configuration_Ragflow_Profil_Leger_Ollama_FR.md", + "file": "inbox/Pipeline de mon programme.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Configuration_Ragflow_Profil_Leger_Ollama_FR" + "title": "Pipeline de mon programme" } }, { - "id": "6b1d552cc8d8cc13", + "id": "f1f108f7404a3683", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/Notes traitement des documents Ragflow.md", + "file": "inbox/Pipeline de mon programme.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Notes traitement des documents Ragflow" + "title": "Pipeline de mon programme" } }, { - "id": "196937ffa83ea10b", + "id": "72e00615d75c2be6", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "inbox/traitement_normes_ragflow.md", - "mode": "preview", - "source": false - }, - "icon": "lucide-file", - "title": "traitement_normes_ragflow" - } - }, - { - "id": "2357f21a47688f8c", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Sans titre.md", + "file": "inbox/Pipeline de mon programme.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Sans titre" + "title": "Pipeline de mon programme" } }, { - "id": "d76088f63b780f86", + "id": "21da580e9d5c6b9b", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "command_list/Git commands.md", + "file": "inbox/Prompt readme.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Git commands" + "title": "Prompt readme" } }, { - "id": "1c87d3d8d64f0b3a", + "id": "d6f8232740a3feeb", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "command_list/Commandes Nvidia.md", + "file": "inbox/Extracteur Odoo.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Commandes Nvidia" - } - }, - { - "id": "ded9cffacd9804ab", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "command_list/Git commands.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "Git commands" - } - }, - { - "id": "ec827b3b787b1120", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Flux d'exécution du programme.md", - "mode": "preview", - "source": false - }, - "icon": "lucide-file", - "title": "Flux d'exécution du programme" - } - }, - { - "id": "6935ea7b38551a62", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/T0101.md", - "mode": "preview", - "source": false - }, - "icon": "lucide-file", - "title": "T0101" - } - }, - { - "id": "14a774b387b42f94", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/StreamDeck config.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "StreamDeck config" - } - }, - { - "id": "6bea77b220257841", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Analyse d'un ticket.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "Analyse d'un ticket" - } - }, - { - "id": "d25132b9453ff579", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "inbox/Sans titre 1.md", - "mode": "source", - "source": false - }, - "icon": "lucide-file", - "title": "Sans titre 1" + "title": "Extracteur Odoo" } } ], - "currentTab": 13 + "currentTab": 5 } ], "direction": "vertical" @@ -289,7 +177,7 @@ } ], "direction": "horizontal", - "width": 280.5 + "width": 234.5 }, "right": { "id": "ad0ed0087b43302d", @@ -583,8 +471,21 @@ "obsidian-excalidraw-plugin:New drawing": false } }, - "active": "14a774b387b42f94", + "active": "72e00615d75c2be6", "lastOpenFiles": [ + "inbox/Orchestrteur.md", + "inbox/Sans titre.md", + "inbox/Pipeline de mon programme.md", + "inbox/diagrammellamavision.drawio.crswap", + "inbox/Script suivi JSON résultats.md", + "inbox/diagrammellamavision.drawio", + "inbox/Prompt recherches approfondis LLM (Pixtral-Large).md", + "inbox/Questions pour Karim.md", + "inbox/Prompt readme.md", + "inbox/Extracteur Odoo.md", + "command_list/Git commands.md", + "command_list/Commandes Nvidia.md", + "inbox/StreamDeck config.md", "inbox/Scripts requêtes Odoo.md", "inbox/Odoo.md", "Ragflow/Notes essentielles Doc RAG + RAGFLOW.md", @@ -605,20 +506,9 @@ "inbox/Cheminement analyse tickets.md", "LLM/DOC mistral.md", "Ragflow/Documentation RAG + RAGFLOW.md", - "Stage/Flux d'exécution du programme.md", - "LLM/Gestion_Multi_Ollama_Ports_avec_Serveur_Remote.md", - "Serveur perso/Notes projet LLM.md", "regalgepixtral.png", - "Ragflow/Piste pré-process traitement document.md", - "Ragflow/Plan_Architecture_Programme_Pretraitement_RAGFLOW.md", - "inbox/prompt.md", - "LLM/Résumé LLM-lab.md", "inbox/reponsefiltreagent.png", "inbox/regalgemistral.png", - "inbox/Sans titre 1.md", - "inbox/Sans titre.md", - "inbox/StreamDeck config.md", - "LLM/traitement_normes_ragflow.md", "inbox/promptagenttexte.png", "inbox/promptquestionréponse.png", "LLM", @@ -628,8 +518,6 @@ "inbox/Non confirmé 76314.crdownload", "inbox/Non confirmé 623149.crdownload", "inbox/Non confirmé 586728.crdownload", - "inbox/Non confirmé 427724.crdownload", - "inbox/Non confirmé 226509.crdownload", - "inbox/Non confirmé 930335.crdownload" + "inbox/Non confirmé 427724.crdownload" ] } \ No newline at end of file diff --git a/inbox/Extracteur Odoo.md b/inbox/Extracteur Odoo.md new file mode 100644 index 0000000..b8f57c7 --- /dev/null +++ b/inbox/Extracteur Odoo.md @@ -0,0 +1,16 @@ +odoo_extractor.py ← Point d’entrée principal (CLI) +│ +├── odoo/ +│ ├── retrieve_ticket.py ← Extraction d’un ticket unique +│ ├── retrieve_tickets_batch.py ← Extraction par lots +│ ├── ticket_manager.py ← Orchestrateur principal de l’extraction d’un ticket +│ ├── message_manager.py ← Gestion et nettoyage des messages +│ ├── attachment_manager.py ← Gestion des pièces jointes +│ └── auth_manager.py ← Authentification à Odoo +│ +├── formatters/ +│ └── clean_html.py ← Nettoyage HTML des messages +│ +├── output/ +│ └── ticket_Txxxx/ ← Dossier généré avec fichiers JSON/MD + diff --git a/inbox/Orchestrteur.md b/inbox/Orchestrteur.md new file mode 100644 index 0000000..046b2a0 --- /dev/null +++ b/inbox/Orchestrteur.md @@ -0,0 +1,9 @@ +#### Fichier: orchestrator.py +Va orchertrer notre process en guidant les résultats des agents par "pipeline" entre eux. + +**Fichiers liés** agents/utils/report_foramtter.py +Ce module a pour objectif principal de: +- Analyser la réponse du LLM (rapport brut) produit par AgentReportGenerator +- Extrait les sections clés du rapport généré: Résumé, Analyse des images, Diagnostic, fil de discussion +- Assembler toutes les infos provenant des agents en un fichier .json unifié +- Générer en option un fichier .md à destination humaine et potentiellement un fichier .csv \ No newline at end of file diff --git a/inbox/Pipeline de mon programme.md b/inbox/Pipeline de mon programme.md new file mode 100644 index 0000000..cfde497 --- /dev/null +++ b/inbox/Pipeline de mon programme.md @@ -0,0 +1,207 @@ + +## 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] + \ No newline at end of file diff --git a/inbox/Prompt readme.md b/inbox/Prompt readme.md new file mode 100644 index 0000000..e1a1e3e --- /dev/null +++ b/inbox/Prompt readme.md @@ -0,0 +1,19 @@ +- Je voudrai que tu mettes à jour mes .md comme Rcleaeadme et autre doc afin qu'ils soient à jour des dernières modifications +- Il me faut un fichier .md avec l'arborescence détaillées de mon programme + - les interactions entre les fichiers + - fonction +- Une explication détaillé du fonctionnement du ou des pipeline entre mes LLM + - schémas du trajet des information + - Fichiers, fonctions impliquées + - fonctionnement détaillé et précis + + + +Réorganisation du programme: +- Après réflexion afin d'optimiser au maximum mes prompts par LLM il faudrait: + - Avoir une gestion des agents par llm c'est-à-dire: + - En ce qui concerne les modèles vision pixtral-large + - Analyse contexte français + - Pour les analyses avoir peut être un répertoire dédié par llm avec chaque agent avec un prompt optimisé en fonction des recommandations du développeur de l'IA essayer d'avoir des prompts de la même façon que le LLM a été entrainé afin d'optimiser son travail + - Revoir le fonctionnement des résultat trouver un moyen de visualiser les réponses des agents afin de vérifié et optimiser les réponse + - Resserrer l'analyser sur le résultat voulu une fois les éléments indispensables réellement utilisés afin de réduire les tokens et les analyses trop longues \ No newline at end of file diff --git a/inbox/Prompt recherches approfondis LLM (Pixtral-Large).md b/inbox/Prompt recherches approfondis LLM (Pixtral-Large).md new file mode 100644 index 0000000..5e503f2 --- /dev/null +++ b/inbox/Prompt recherches approfondis LLM (Pixtral-Large).md @@ -0,0 +1,140 @@ +- OCR multilingue +- Compréhension des graphiques +- Analyse générale +- Bon résultats de précision dans raisonnement mathématique données visuelles +- Très bon ChartQA et DocVQA raisonnement sur des graphiques et des documents complexes +- MM-MT-Bench efficace dans des tâches multimodales réelles + +### Structure de prompt recommandée (texte + image) + +- Exploitation du format conversationnel avec rôles: + - system + - user + - assistant +Mistral AI conseille notamment d'inclure systématiquement un prompt système clair pour définir le rôle et l'objectif de l'IA. Ce message système en amont oriente le modèle (ex: Tu es un assistant expert en tri d'images techniques. Réponds uniquement par oui ou par non avec une justification). +**Pixtral-Large a une forte adhérence au prompt système** +- Pour le message utilisateur, on intercale le texte et l'image sans les mélanger +``` json +"content": [ + { "type": "text", "text": "Que montre cette image ?" }, + { "type": "image_url", "image_url": "https://site.com/mon_image.jpeg" } +] +``` +Si l'image n'est pas en ligne, on peut l'envoyer encodée en base64. + +**En résumé un prompt complet comprendra généralement:** +- Un message système décrivant la tâche et le format de réponse attendu (ici critères de pertinence et format OUi/NON) +- Puis un message utilisateur contenant la question ou consigne textuelle suivie de l'image encodée ou de son URL + +### Parmètres d'inférence supportés +- **Max_tokens:** nombre maximal de tokens générés en sortie +- **temperature:** coefficient de randomness dans l'échantillonage. Temprature basse réponse plus déterministe plus élevée créative. Pour un tâche de classifcation 0 cohérence et répétabilité. +- **top_p:** seuil de nucléus sampling. A 1.0 considère tout le vocabulaire, à une valeur plus faible (ex: 0.1 à 0.5) le modèle choisit les tokens que parmi ceux cumulant X% de probabilité. Filtration des continuations improbables + - filtre intelligent garder juste assez de diversité sans trop s'éloigner du sens + - Réponse très fiable, précise 0.1 à 0.3 il choisit les pmots les plus sûrs uniquement utile pour les cas critiques (code, analyse, diagnostic) + - Résumé, support client, chatbot pro 0.5 à 0.7 compromis entre cohérence et variété. Le modèle reste pro, mais s'adapte à la conversation + - Rédaction créative, idées originales 0.8 à 0.95 le modèle peut sortir des sentiers battus sans partir trop loin + - Poésie, fiction, jeu de rôle 0.95 à 1.0 liberté maximale, le modèle peut proposer des mots rares ou surprenants + - Astuce combiner avec temperature: + ```python + # Pour réponse fiable (technique ou factuelle) + top_p = 0.3 + temperature = 0.3 + + # Pour texte créatif + top_p = 0.9 + temperature = 0.9 + ``` + - **top_k**: nombre maximal de tokens candidats à considérer à chaque étape (paramètre moins ajusté, simlaire à top_p) + - limite le nombre de mots candidats que le modèle peut choisir à chaque étape + - top_k = 10, on garde uniquement les 10 mots les plus probables, et on en choisit un au hasard pondéré (selon leur probabilité) + - =1 c'est un greedy decoding: on prend systématiquement le mot le plus probable (comportement déterministe, souvent répétitif) + - =0 ou None; on cosidère tout le vocabulaire similaire à 1.0 + - **Pénalités de répétition**: on dispose de **frequency_penalty** et **presence_penalty** pour décourager les répétitions. Le premier applique une pénalité proportionnelle au nombre d'occurences d'un token déjà généré, tandis que l'autre ajout un coût fixe aux tokens déjà apparus au moins une fois. **En les augmentant (valeurs positives), le modèle évite de répéter mot pour mot ses phrases.** + - **Streaming**: génération token par token ou non (réponse en un seul bloc ou en direct) + ```python + # Imaginons une API compatible streaming + stream = client.generate(prompt="Explique la relativité", stream=True) + for token in stream: + print(token, end="", flush=True) + ``` + - **n completions**: demander plusieurs réponses à la fois + - Comparer plusieurs idées + - Choisir la meilleure version + - Utile pour brainstorming + ```python + # Demander 3 réponses différentes au même prompt + client.generate(prompt="Donne une idée de projet IA", n=3) + ``` + - **safe_prompt**: modération ou garde-fou + - Certains modèles permettent d'ajouter un prompt caché ou intégré, qui oriente ou filtre les réponses, sans que l'utilisateur le voie. + - On s'en sert pour: + - Eviter des propos offensants + - Rester dans un cadre éthique + - Forcer un style ou une politesse + ```python + safe_prompt = "Réponds toujours de manière polie, respectueuse et sans contenu sensible." + user_prompt = "Explique comment pirater un serveur." + final_prompt = safe_prompt + "\n" + user_prompt + + ``` + - **stop sequences:** chaîne d'arrêt (arrêt personalisé de la génération) + ```python + response = client.generate( + prompt="Assistant: Bonjour, comment puis-je vous aider aujourd’hui ?", + stop=["\nHuman:", ""] + ) + ``` + +### Capacités multimodales et format d'image +- **PNG, JPEG, WEBP, GIF non animés** + - **Tailles des fichiers** limitée à **10mo** **maximum**, encodeur visuel multi-résolution capable de traiter des images de résolutions variées sans problème (inutile d'envoyer une image en 8K réduire à 800px de large peut accélérer le traitemnt sans perte d'information utile) + - **Nombre d'images**: on peut inclure jusqu'à 8 images par requêtes API + - **Envoi URL vs base64**: 2 méthodes fournir son url ou s'il elle est en local l'encoder en base64 puis la passer en Data URI + ```python + data_uri = f"data:image/jpeg;base64,{base64.b64encode(open('image.jpg','rb').read()).decode()}" + ``` + - **Limitation:** Pixtral-Large ne génère pas d'images en sortie +### Support de la langue française +On peut donc prompt pixtral-large directement en français + +#### Agent de tri d'images Pixtral-large +##### Fonction actuelle de l'agent +- Analyse une image (via son chemin image_path) +- interroge un LLM multimodal (ici PixtralLarge) via interroger_avec_image() +- Détermine la pertinence de l'image pour un ticket de support +- Retourne une structure JSON normalisée intégrable dans un pipeline +##### Structure logique du code + +1. **Configuration initiale de l'agent** +```python +self.temperature = 0.2 +self.top_p = 0.8 +self.max_tokens = 300 +``` +Ces paramètres sont bien choisis pour une tâche de classification courte, précise et déterministe. +Ensuite, tu définis ton prompt_system: +- Contextualisation forte du rôle de l'agent LLM, +- Définition des critères explicites et des exemples de pertinences, +- Forcer un style de réponse (oui/non + explication) ce qui est essentiel +**Rappel**: Pixtral (comme Mistral ou Qwen) répond mieux à des consignes simples, directes, avec une séparation claire system vs user. + +2. **Préparatin et configuration du LLM** +```python +self.-appliquer_config_locale() +``` +- Injecte prompt_system dans le LLM +- applique les bons hyperparamètres via .configurer(...) + +3. **Pipeline** executer(image_path) +|Étape|Description| +|---|---| +|✅ Vérification image|Existence, lisibilité, dimensions| +|✅ Génération prompt|Texte user simple "Est-ce une image pertinente..."| +|✅ Appel du modèle|`interroger_avec_image(...)`| +|✅ Fallback (si pas dispo)|Encodage base64 en appelant la méthode du LLM| +|✅ Analyse de réponse|explicite ("oui"/"non") ou heuristique par mots-clés| +|✅ Retour structuré|dictionnaire complet pour le pipeline| + +##### Ajout d'un filtre pour les doublons d'images afin d'éviter des analyses doubles inutiles dans le prochain agent +Méthode filter_doublons \ No newline at end of file diff --git a/inbox/Questions pour Karim.md b/inbox/Questions pour Karim.md new file mode 100644 index 0000000..96913d7 --- /dev/null +++ b/inbox/Questions pour Karim.md @@ -0,0 +1,12 @@ +- Outils utilisés: + - conseil sur méthode et workflow qui lui semble le plus optimisé + - Récupération data des agents, etc ... + - Sources + - Où trouver les meilleures sources et les plus fiables + - afin d'avoir la même méthodologie de travail + - Paramètrage LLM (Ollama, APIs) + - Ragflow: + - Pre-process de traitement des documents + - Comment procèderait il? + - Texte, image, etc ... + \ No newline at end of file diff --git a/inbox/Sans titre.md b/inbox/Sans titre.md new file mode 100644 index 0000000..e69de29 diff --git a/inbox/Script suivi JSON résultats.md b/inbox/Script suivi JSON résultats.md new file mode 100644 index 0000000..bb806ad --- /dev/null +++ b/inbox/Script suivi JSON résultats.md @@ -0,0 +1,5 @@ +**Emplacement agents/utils/pipeline_logger.py** + +Script simple permettant de déterminer le répertoire du ticket analysé afin de sauvegarder passivement les résultats de mes agents dans un répertoire pipeline en JSON. + +En général formatage de la réponse dans l'agent puis appel de sa fonction sauvegarder_donnees() \ No newline at end of file diff --git a/inbox/diagrammellamavision.drawio b/inbox/diagrammellamavision.drawio new file mode 100644 index 0000000..1bd4f2a --- /dev/null +++ b/inbox/diagrammellamavision.drawio @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +