bemade-addons/mail_manual_routing_ai/doc/ai-enhanced.md
xtremxpert 2750f9268a devben
2025-07-11 10:42:05 -04:00

12 KiB

Analyse d'un module IA pour améliorer mail_manual_routing

Introduction

Ce document présente une analyse conceptuelle d'un module complémentaire nommé mail_manual_routing_ai qui utiliserait l'intelligence artificielle pour améliorer la gestion des messages non routés capturés par le module mail_manual_routing. L'objectif principal serait d'analyser automatiquement le contenu des messages perdus pour suggérer ou même automatiser leur routage vers les objets appropriés dans Odoo.

Cas d'utilisation principal

Le cas d'utilisation typique serait celui où un client (M. X) envoie un courriel à un employé (M. Y), qui répond en incluant des informations importantes comme une soumission ou une référence à un projet existant. Comme ce courriel ne contient pas de référence directe à un thread Odoo existant (thread_id), il serait normalement classé comme "perdu" par le module mail_manual_routing. Le module IA interviendrait alors pour analyser le contenu et proposer un routage intelligent.

Architecture proposée

1. Intégration avec mail_manual_routing

Le module mail_manual_routing_ai dépendrait du module mail_manual_routing et étendrait ses fonctionnalités :

# __manifest__.py
{
    "name": "IA pour messages perdus",
    "version": "17.0.1.0.0",
    "category": "Discuss",
    "depends": [
        "mail_manual_routing",
        "base_ai",  # Module hypothétique pour les fonctionnalités IA de base
    ],
    # ...
}

2. Modèles de données

Le module ajouterait de nouveaux modèles pour gérer les suggestions d'IA :

# models/ai_suggestion.py
class MailMessageAISuggestion(models.Model):
    _name = "mail.message.ai.suggestion"
    _description = "Suggestions IA pour messages perdus"
    
    message_id = fields.Many2one('mail.message', string="Message", required=True)
    suggested_model = fields.Char(string="Modèle suggéré")
    suggested_record_id = fields.Integer(string="ID d'enregistrement suggéré")
    confidence_score = fields.Float(string="Score de confiance", help="Score de confiance de l'IA (0-1)")
    suggestion_reason = fields.Text(string="Explication", help="Explication de la suggestion par l'IA")
    is_applied = fields.Boolean(string="Appliqué", default=False)
    user_feedback = fields.Selection([
        ('positive', 'Correcte'),
        ('negative', 'Incorrecte'),
    ], string="Retour utilisateur")

3. Processus d'analyse IA

Le module implémenterait un processus d'analyse en plusieurs étapes :

  1. Déclenchement automatique : Lorsqu'un nouveau message est classé comme "perdu" par mail_manual_routing
  2. Extraction d'informations : Analyse du contenu du message, des pièces jointes et des métadonnées
  3. Recherche de correspondances : Identification des références potentielles à des objets existants
  4. Génération de suggestions : Création de suggestions avec scores de confiance
# models/mail_message.py
class MailMessage(models.Model):
    _inherit = "mail.message"
    
    ai_suggestion_ids = fields.One2many('mail.message.ai.suggestion', 'message_id', string="Suggestions IA")
    ai_suggestion_count = fields.Integer(compute='_compute_ai_suggestion_count')
    ai_analyzed = fields.Boolean(string="Analysé par IA", default=False)
    ai_top_suggestion_id = fields.Many2one('mail.message.ai.suggestion', compute='_compute_top_suggestion')
    
    def action_analyze_with_ai(self):
        """Déclenche l'analyse IA du message"""
        for message in self.filtered(lambda m: m.is_unattached):
            self.env['mail.message.ai.analyzer'].analyze_message(message)
        return True
    
    @api.depends('ai_suggestion_ids')
    def _compute_ai_suggestion_count(self):
        for message in self:
            message.ai_suggestion_count = len(message.ai_suggestion_ids)
    
    @api.depends('ai_suggestion_ids.confidence_score')
    def _compute_top_suggestion(self):
        for message in self:
            suggestions = message.ai_suggestion_ids.sorted(key=lambda s: s.confidence_score, reverse=True)
            message.ai_top_suggestion_id = suggestions[0] if suggestions else False

4. Techniques d'IA utilisées

Le module pourrait utiliser plusieurs techniques d'IA pour améliorer la précision des suggestions :

  1. Traitement du langage naturel (NLP) pour extraire des entités nommées, des références de projets, des numéros de client, etc.
  2. Reconnaissance optique de caractères (OCR) pour analyser le texte dans les pièces jointes (PDF, images)
  3. Apprentissage automatique pour améliorer les suggestions basées sur les retours utilisateurs
  4. Analyse sémantique pour comprendre le contexte et l'intention du message

5. Interface utilisateur

L'interface utilisateur serait enrichie pour présenter les suggestions de l'IA de manière intuitive :

<!-- views/mail_message_view.xml -->
<record id="mail_message_view_form_ai_enhanced" model="ir.ui.view">
    <field name="model">mail.message</field>
    <field name="inherit_id" ref="mail_manual_routing.mail_message_view_form"/>
    <field name="arch" type="xml">
        <xpath expr="//header" position="inside">
            <button string="Analyser avec IA" 
                    name="action_analyze_with_ai" 
                    type="object" 
                    class="btn-primary"
                    attrs="{'invisible': ['|', ('is_unattached', '=', False), ('ai_analyzed', '=', True)]}"/>
        </xpath>
        <xpath expr="//field[@name='lost_comments']" position="after">
            <field name="ai_analyzed" invisible="1"/>
            <field name="ai_suggestion_count" invisible="1"/>
            <div class="alert alert-info" attrs="{'invisible': [('ai_suggestion_count', '=', 0)]}">
                <div class="d-flex align-items-center">
                    <i class="fa fa-robot mr-2"/>
                    <span>L'IA suggère de router ce message vers : </span>
                    <field name="ai_top_suggestion_id" readonly="1" options="{'no_open': True}"/>
                    <button string="Appliquer" 
                            name="action_apply_ai_suggestion" 
                            type="object" 
                            class="btn btn-sm btn-primary ml-2"
                            attrs="{'invisible': [('ai_top_suggestion_id', '=', False)]}"/>
                    <button string="Voir toutes les suggestions" 
                            name="action_view_ai_suggestions" 
                            type="object" 
                            class="btn btn-sm btn-secondary ml-2"
                            attrs="{'invisible': [('ai_suggestion_count', '=', 0)]}"/>
                </div>
                <div attrs="{'invisible': [('ai_top_suggestion_id', '=', False)]}">
                    <field name="ai_top_suggestion_id.suggestion_reason" readonly="1" class="text-muted"/>
                </div>
            </div>
        </xpath>
    </field>
</record>

Fonctionnalités avancées

1. Apprentissage continu

Le module pourrait implémenter un système d'apprentissage continu basé sur les retours des utilisateurs :

  • Lorsqu'un utilisateur accepte ou rejette une suggestion, le système enregistre cette décision
  • Ces données sont utilisées pour améliorer les futures suggestions
  • Le modèle d'IA est régulièrement réentraîné avec ces nouvelles données

2. Routage automatique

Pour les suggestions avec un score de confiance élevé (configurable), le module pourrait proposer un routage automatique :

# models/res_config_settings.py
class ResConfigSettings(models.TransientModel):
    _inherit = 'res.config.settings'
    
    ai_auto_routing_threshold = fields.Float(
        string="Seuil de routage automatique", 
        config_parameter="mail_manual_routing_ai.auto_routing_threshold",
        default=0.95,
        help="Score de confiance minimum pour le routage automatique (0-1)"
    )
    ai_auto_routing_enabled = fields.Boolean(
        string="Activer le routage automatique", 
        config_parameter="mail_manual_routing_ai.auto_routing_enabled",
        default=False
    )

3. Analyse des pièces jointes

Un aspect particulierèrement utile serait l'analyse des pièces jointes pour extraire des informations pertinentes :

  • Extraction de texte des PDF, images et documents Office
  • Reconnaissance de formulaires et documents standard (factures, bons de commande, etc.)
  • Identification de références de projet, numéros de client ou autres identifiants
# models/mail_message_ai_analyzer.py
class MailMessageAIAnalyzer(models.AbstractModel):
    _name = "mail.message.ai.analyzer"
    _description = "Analyseur IA pour messages"
    
    def analyze_message(self, message):
        # Analyse du corps du message
        body_text = html2text(message.body) if message.body else ""
        body_entities = self._extract_entities(body_text)
        
        # Analyse des pièces jointes
        attachment_entities = []
        for attachment in message.attachment_ids:
            attachment_text = self._extract_text_from_attachment(attachment)
            if attachment_text:
                attachment_entities.extend(self._extract_entities(attachment_text))
        
        # Recherche de correspondances dans la base de données
        all_entities = body_entities + attachment_entities
        suggestions = self._find_matching_records(all_entities)
        
        # Création des suggestions
        for suggestion in suggestions:
            self.env['mail.message.ai.suggestion'].create({
                'message_id': message.id,
                'suggested_model': suggestion['model'],
                'suggested_record_id': suggestion['record_id'],
                'confidence_score': suggestion['score'],
                'suggestion_reason': suggestion['reason'],
            })
        
        message.ai_analyzed = True
        return True

Bénéfices attendus

  1. Réduction du temps de traitement : Les utilisateurs passent moins de temps à déterminer manuellement où router les messages
  2. Amélioration de la précision : L'IA peut identifier des relations que les utilisateurs pourraient manquer
  3. Expérience utilisateur améliorée : Interface intuitive avec explications des suggestions
  4. Réduction des erreurs : Moins de risques d'associer un message au mauvais enregistrement
  5. Apprentissage continu : Le système s'améliore avec le temps grâce aux retours utilisateurs

Considérations techniques

1. Performance et scalabilité

L'analyse IA peut être intensive en ressources, surtout pour les pièces jointes volumineuses. Des stratégies pourraient être mises en place :

  • Traitement asynchrone via des tâches planifiées (queue.job)
  • Limitation de la taille des pièces jointes à analyser
  • Mise en cache des résultats d'analyse pour les documents similaires

2. Confidentialité et sécurité

L'analyse de contenu par IA soulève des questions de confidentialité :

  • Option pour traiter les données localement sans les envoyer à des services externes
  • Paramètres de configuration pour limiter les types de données analysées
  • Journal d'audit des analyses effectuées

3. Intégration avec des services IA

Le module pourrait s'intégrer avec différents services d'IA :

  • Services internes (modèles locaux)
  • Services cloud (OpenAI, Google AI, Azure AI)
  • Combinaison hybride selon les besoins de confidentialité et de performance

Conclusion

Un module mail_manual_routing_ai offrirait une amélioration significative du processus de gestion des messages non routés dans Odoo. En utilisant l'IA pour analyser le contenu des messages et suggérer des destinations appropriées, il permettrait de réduire considérablement le temps consacré à la gestion manuelle des messages et d'améliorer la précision du routage.

Ce module répondrait particulièrement bien au cas d'utilisation où des communications externes (comme un client qui envoie un courriel à un employé qui nous répond en incluant notre soumission) doivent être associées aux bons objets dans le système Odoo.