Toutes les questions ne se valent pas
Un flux de demandes entrantes se partage en trois catégories, et elles n’appellent pas le même traitement.
Les questions à réponse documentée. Horaires, délais standards, modalités, procédure de retour, documents à fournir. La réponse existe, elle est écrite quelque part, elle ne change pas. Y répondre à la main est une perte sèche.
Les questions à réponse contextuelle. « Où en est ma commande », « ai-je bien reçu votre facture » : la réponse existe aussi, mais dans un système, et elle dépend du dossier. Elles s’automatisent, avec des garde-fous d’identification.
Les questions à jugement. Une réclamation, une demande de geste commercial, un cas particulier. Elles doivent aller à une personne, immédiatement et sans détour.
L’erreur classique consiste à traiter les trois de la même façon — soit tout à la main, soit tout à la machine. Le travail réel d’un projet comme celui-ci est de tracer la frontière, et de la tracer prudemment.
Ce qu’on automatise
L’indexation de vos contenus. Documents, pages, procédures, et l’historique de vos réponses.
La recherche de ce qui, dans ces contenus, répond à la question posée.
La rédaction d’une réponse appuyée sur ces extraits, dans votre ton, avec la source citée.
Le filtrage. Sujets interdits, questions à faible confiance, signaux de mécontentement, demandes juridiques : transmission immédiate.
La transmission avec le contexte, au bon interlocuteur.
La détection des manques. Les questions transmises faute de réponse sont regroupées : c’est la liste exacte de ce qu’il faut documenter, par ordre de fréquence.
La mesure. Taux de réponse automatique, taux de reprise humaine après réponse automatique — l’indicateur le plus révélateur —, satisfaction comparée.
Comment ça marche techniquement — pour qui veut le détail
Le découpage des documents. C’est l’étape qui détermine la qualité finale, bien plus que le choix du modèle. On découpe par structure sémantique — titres, sections, articles des conditions générales — plutôt qu’en tranches de taille fixe, qui coupent au milieu d’une phrase et produisent des extraits inutilisables. Chaque fragment conserve son titre de section et son chemin documentaire, ce qui permet de citer précisément et d’aider le modèle à situer l’extrait.
La recherche hybride. Lexicale avec tsvector et la configuration française de PostgreSQL, indispensable sur les références exactes, les noms de produit et les termes métier. Vectorielle avec pgvector et un index HNSW, sur des plongements produits par un modèle multilingue exécuté en local (famille E5 ou BGE). Fusion des deux classements par Reciprocal Rank Fusion. Puis, sur les quinze meilleurs candidats, un réordonnancement par un modèle d’encodage croisé : c’est cette étape qui fait le plus gros gain de pertinence, pour un coût de calcul modeste sur quinze documents.
Le seuil d’abstention. Le score du meilleur extrait après réordonnancement est comparé à un seuil. En dessous, aucune génération n’est tentée — ce qui économise l’appel au modèle et supprime la principale source d’erreur. Ce seuil est calibré sur un jeu de questions réelles étiquetées, et se resserre ou se relâche à la lumière du taux de reprise humaine observé.
La génération contrainte. Le modèle reçoit les extraits retenus et la question, avec consigne de répondre uniquement à partir des extraits et de citer les identifiants utilisés. Sa sortie est structurée : {reponse, sources: [id], confiance, sujet_sensible: bool}. Les identifiants cités sont vérifiés contre les extraits effectivement fournis ; une citation inventée fait rejeter la réponse entière.
Les garde-fous par liste. Avant génération, la question est passée au crible d’une liste de sujets interdits — expressions régulières sur les thèmes de prix, délai, remise, résiliation, litige, données de santé, plus un classifieur léger pour les formulations indirectes. Un filtre par motifs, simple et lisible, attrape l’essentiel et ne dépend d’aucun modèle. La liste est la vôtre et vous pouvez la lire.
La détection de mécontentement. Analyse de sentiment rapide et repérage de marqueurs — majuscules, ponctuation répétée, vocabulaire de litige, mention d’un avocat ou d’une association de consommateurs. Toute détection court-circuite la réponse automatique et priorise le transfert. Répondre automatiquement à un client en colère aggrave systématiquement la situation.
Le contexte dossier. Pour les questions contextuelles, le modèle n’interroge pas la base : il appelle des fonctions au périmètre strict — etat_commande(identifiant), date_derniere_facture(client) — qui ne renvoient que des champs autorisés, et uniquement après identification de la personne par un canal fiable. Le modèle n’a jamais d’accès direct à la base de données, par principe de moindre privilège.
La mise à jour de l’index. Un changement dans un document source déclenche la réindexation du seul fragment concerné. Un index périmé est le problème le plus fréquent de ce type de système : une condition générale modifiée et non réindexée fait répondre l’ancienne version pendant des mois. La date de dernière indexation de chaque source est surveillée et affichée.
La boucle de qualité. Chaque question, la réponse produite, les sources citées, la décision de répondre ou de transmettre, et l’issue — le client a-t-il rebondi, une personne a-t-elle dû reprendre — sont journalisées. Le taux de reprise humaine après réponse automatique est l’indicateur central : c’est lui qui dit si le système aide ou s’il ajoute un tour de piste avant le vrai traitement.
L’annonce. Le caractère automatique est annoncé au premier message, et le passage à un humain est proposé explicitement, pas caché derrière trois niveaux de menu.