L'assistant de conformité qui refuse de deviner

Nous avons construit un assistant de recherche documentaire qui répond aux questions de gouvernance directement dans Microsoft Teams, en s’appuyant strictement sur les documents sources et en citant le paragraphe exact d’où provient la réponse. Voici l’architecture, les choix de conception et l’ingénierie qui rendent une réponse suffisamment fiable pour qu’on puisse s’y fier.

Toute organisation dotée d’une fonction conformité connaît la même inefficacité silencieuse. Les politiques, les normes et les procédures sont complètes et bien rédigées, et presque personne ne les lit en entier. À la place, les équipes posent sans cesse les mêmes quelques questions, et ces questions atterrissent chez la personne qui gère les documents plutôt que d’être traitées à partir des documents eux-mêmes. L’expert devient un service de consultation, et le savoir qui devrait être en libre-service reste bloqué dans l’agenda d’une personne.

La solution n’est pas un énième portail ni un meilleur moteur de recherche. C’est un assistant qui lit la documentation source à votre place et répond en langage clair, dans l’outil où vos équipes travaillent déjà. C’est exactement ce que nous avons construit : un assistant de conformité dans Microsoft Teams qui répond à une question en quelques secondes, tire sa réponse uniquement des documents approuvés, et affiche la citation pour que le lecteur puisse la vérifier. Cet article explique comment il fonctionne et pourquoi chaque décision a été prise ainsi, écrit pour être utile que vous validiez le budget ou que vous écriviez le code.

Ce qu’il fait

Posez une question dans Teams. L’assistant récupère les passages les plus pertinents de votre bibliothèque de gouvernance, compose une réponse strictement fondée sur ce texte, et cite le document source. Si la réponse ne figure pas dans le corpus, il le dit plutôt que d’en inventer une.

Pourquoi l’ancrage est tout l’enjeu

L’idée, pour tout le monde

Un chatbot généraliste est un généraliste sûr de lui. Il répondra à une question de politique interne par quelque chose qui sonne juste, assemblé à partir du web ouvert et de ses données d’entraînement. En conformité, c’est précisément le mauvais comportement. Une réponse plausible mais non traçable jusqu’à votre politique réelle est pire que pas de réponse du tout, car quelqu’un agira en conséquence.

La génération augmentée par récupération, ou RAG, change la donne. Plutôt que de répondre de mémoire, le modèle reçoit les passages précis de vos documents qui concernent la question, avec la consigne de répondre uniquement à partir de ces passages. L’intelligence réside dans la récupération et la rigueur, pas dans les opinions du modèle. Résultat : un assistant dont les réponses sont auditables, car chacune renvoie au paragraphe dont elle provient.

Comment l’assistant RAG sur Azure est construit

L’architecture

Le système comporte deux moitiés qui s’exécutent rarement en même temps. L’ingestion est la tâche ponctuelle qui transforme les documents en une base de connaissances interrogeable, répétée uniquement lorsqu’un document change. Le chemin de requête, lui, s’exécute à chaque question, et c’est là que la rapidité, le contrôle d’accès et l’ancrage doivent tous tenir ensemble.

Figure 1. Les deux pipelines. L’ingestion convertit une fois les documents sources en vecteurs. Le chemin de requête s’exécute à chaque question, avec le contrôle d’accès placé avant toute récupération, de sorte qu’une requête non autorisée n’atteint jamais la base de connaissances.

À l’ingestion, les documents sources sont chargés depuis le stockage blob et découpés en passages qui se chevauchent d’environ 500 caractères, avec 50 caractères de chevauchement pour qu’une phrase ne soit jamais coupée net à une frontière. Chaque passage est converti en un vecteur numérique qui capture son sens, un embedding de 1536 dimensions produit par le modèle text-embedding-ada-002 d’OpenAI, puis stocké dans une base vectorielle Chroma, étiqueté avec son document source et une référence pour la citation. Le chevauchement et l’étiquetage ne sont pas des détails anodins. Le chevauchement préserve l’intégrité d’une réponse à cheval sur deux passages, et l’étiquette est ce qui permet à l’assistant d’indiquer au lecteur d’où vient une réponse.

À chaque question, le flux est délibéré : Teams transmet le message au service de bot, qui l’achemine vers l’API, laquelle vérifie d’abord si l’utilisateur a le droit de poser la question. Ce n’est qu’ensuite que le système vectorise la question, récupère les passages les plus proches, et les transmet au modèle pour composer une réponse ancrée et citée. L’ordre a son importance, et c’est le point suivant qui mérite qu’on s’y attarde.

La sécurité est une position dans le pipeline, pas une fonctionnalité

Le contrôle d’accès par conception

La manière la plus courante de greffer l’autorisation sur un système RAG consiste à filtrer les résultats après la récupération, ou à tronquer la réponse avant de la renvoyer. Les deux sont plus fragiles qu’il n’y paraît, car à ce stade la requête a déjà touché la base de connaissances et le modèle. Nous plaçons le point de contrôle d’accès en tête de la couche API, avant qu’un seul passage ne soit récupéré. Si une requête n’est pas autorisée, elle n’atteint jamais la base vectorielle ni le modèle.

Figure 2. Le point de contrôle d’accès se situe en amont de la récupération. Une requête non autorisée est refusée avant de pouvoir toucher la base de connaissances ou le modèle, ce qui est plus propre, plus économique et plus auditable qu’un filtrage a posteriori.

C’est plus propre, plus économique et plus facile à auditer. Plus propre, car le chemin des données sensibles n’a qu’une entrée et un seul gardien. Plus économique, car les requêtes refusées ne coûtent rien en récupération ni en appels au modèle. Plus auditable, car la décision d’autoriser ou de refuser est un événement unique et journalisé, en un point unique, plutôt qu’une propriété émergente de plusieurs filtres en aval. Quand un audit de sécurité demande comment vous empêchez les accès non autorisés, la réponse est un emplacement sur un schéma, pas un paragraphe de réserves.

Concevoir le modèle pour qu’il reste honnête

Le prompt d’ancrage

L’ancrage est imposé par les instructions que le modèle reçoit avec chaque question. Le prompt est volontairement strict, et deux de ses règles sont déterminantes. Le reste du prompt relève de l’intendance, mais ces deux règles font toute la différence entre un outil qu’une équipe conformité utilisera en confiance et un outil qu’elle délaissera discrètement.

You are a compliance assistant.
Your answers must be based strictly on the provided context.
Do not use any outside knowledge.

Rules:
– Answer concisely and accurately.
– Use context even if not labelled exactly as asked.
– Do not add examples not explicitly stated in the context.
– Always cite the source document.
– Fall back only if the context has nothing relevant.

Le prompt système reste en anglais, la langue dans laquelle le modèle a été réglé.

Utiliser le contexte même s’il n’est pas formulé exactement comme la question. Sans cette règle, le modèle écarte un passage parfaitement pertinent parce que sa formulation ne correspond pas mot pour mot à la question. Les questions transverses à plusieurs documents, où la réponse se trouve sous une terminologie différente de celle employée par l’utilisateur, en sont les premières victimes. Cette règle garde l’assistant utile sur un corpus réel, et pas seulement sur des questions formulées comme les documents se trouvent l’être.

Ne pas ajouter d’exemples qui ne figurent pas explicitement dans le contexte. C’est le garde-fou contre les hallucinations. Sans contrôle, un modèle inventera volontiers un détail de politique plausible qui n’apparaît dans aucun de vos documents, et cela se lira exactement comme une bonne réponse. C’est ce qui le rend dangereux. Cette seule instruction referme le mode de défaillance le plus dommageable pour un assistant de conformité.

Un dernier réglage sous-tend l’ensemble. La température du modèle est fixée à zéro, si bien que la même question renvoie toujours la même réponse, et non une formulation différente à chaque exécution. En conformité, la reproductibilité n’est pas un luxe. C’est ce qui vous permet d’assumer une réponse une deuxième fois.

Le principe

Un assistant de conformité doit être évalué sur la confiance qu’on peut lui accorder, pas sur son intelligence. Chaque choix de conception ici échange un peu de portée contre beaucoup de fiabilité, et dans ce domaine, c’est le bon compromis.

Mesurer ce qui compte vraiment

L’évaluation

Un assistant qu’on ne peut pas mesurer ne peut être ni amélioré ni défendu. Nous évaluons sur un jeu fixe de questions de test à l’aide de six métriques, et nous optimisons celle qui reflète la confiance plutôt que celle qui flatte la démo. Une vérification manuelle par sondage passera à côté des défaillances qui comptent ; un harnais d’évaluation automatisé les fait remonter systématiquement, à chaque modification.

Figure 3. Scores d’évaluation de cette version. La fidélité (faithfulness) est la métrique que nous optimisons. Le rappel à cinq est délibérément mesuré à la profondeur de récupération utilisée en production, plutôt que gonflé à un k plus élevé.

La fidélité (faithfulness), à 0,98, est la métrique que nous optimisons. Elle mesure si la réponse est entièrement étayée par le contexte récupéré, autrement dit si l’assistant invente quoi que ce soit. En conformité, une réponse qui n’invente rien vaut mieux qu’une réponse qui récupère chaque phrase potentiellement pertinente. Le rang réciproque moyen (MRR) compte aussi, car il récompense le passage le plus pertinent lorsqu’il se place en haut du contexte plutôt qu’enfoui au milieu, là où les modèles lui prêtent régulièrement moins d’attention.

Le rappel à cinq, à 0,41 pour un objectif de 0,70, paraît faible, et c’est honnête, pas cassé. Le rappel à cinq mesure combien de passages pertinents figurent parmi les cinq premiers résultats récupérés. Lorsqu’une seule question peut compter une douzaine de passages pertinents, voire plus, dans le corpus, un rappel parfait à cinq est arithmétiquement impossible. Mesurer à un k plus élevé pour améliorer le chiffre flatterait la métrique sans améliorer le produit, car cinq est la profondeur à laquelle l’assistant lit réellement. Nous fixons l’objectif par rapport au k utilisé en production et le rapportons tel quel. Une équipe qui gonfle le rappel optimise la diapositive, pas l’assistant.

Le durcissement pour la production

Les quatre modes de défaillance contre lesquels nous concevons

Faire passer un système RAG d’un prototype fonctionnel à un déploiement Teams fiable sur Azure fait apparaître un petit ensemble de modes de défaillance, faciles à manquer et rapides à corriger une fois qu’on les reconnaît. Nous instrumentons les quatre avant le premier déploiement, de sorte qu’un déploiement défectueux se signale de lui-même en moins d’une minute, plutôt qu’après un après-midi de tâtonnements.

  1. Base de connaissances vide après déploiement. Le dossier de la base vectorielle est exclu par le .gitignore : le pipeline livre une application fonctionnelle mais sans données de récupération, qui ne renvoie que des réponses de repli. Vérifiez le nombre de passages au démarrage ; un compte à zéro localise la faute immédiatement.
  2. Version de SQLite sur runtime Linux App Service. La base vectorielle exige SQLite 3.35 ou une version plus récente, mais le runtime Linux App Service fournit une version plus ancienne : le démarrage échoue. Épinglez pysqlite3-binary avec une surcharge conditionnelle propre à Linux.
  3. Authentification du bot mono-locataire. Le locataire (tenant) n’est pas déduit automatiquement, donc le Bot Service ne se connecte pas. Définissez channel_auth_tenant explicitement sur l’adaptateur avant le premier déploiement.
  4. Vérification d’appartenance via l’API Graph. En l’absence d’utilisateur connecté, une autorisation déléguée renvoie une erreur 403 sur la vérification de groupe. Utilisez plutôt une autorisation d’application avec consentement administrateur.

Figure 4. Quatre modes de défaillance et leurs corrections. Le fil conducteur est l’instrumentation : journaliser le nombre d’éléments de la collection, le locataire d’authentification et la réponse de l’API Graph au démarrage vous indique immédiatement où un déploiement a dérapé.

Des quatre, la base de connaissances vide est le plus insidieux, car rien ne semble cassé. L’application tourne, répond à chaque question et ne lève aucune erreur ; seul le contenu derrière elle manque, si bien que la défaillance se cache en pleine vue. C’est pourquoi l’instrumentation compte plus que n’importe quel correctif isolé. Journalisez le nombre de passages, le locataire d’authentification et la réponse Graph au démarrage, et une défaillance silencieuse se signale en une ligne plutôt que de coûter un après-midi de tâtonnements.

Ce que cela rend possible ensuite

La feuille de route

Les principes ci-dessous ont façonné cette version et façonneront la suivante. Ils résument tout ce qui précède.

  1. Optimiser d’abord la fidélité. Une réponse qui invente un détail de politique est pire que pas de réponse. Réglez d’abord la fidélité, puis améliorez le rappel. En conformité, l’ordre n’est pas négociable.
  2. Contrôler l’accès avant la récupération. Refuser une requête non autorisée au niveau de la couche API, avant qu’aucune requête n’atteigne la base ou le modèle, est plus propre, plus économique et plus auditable que n’importe quel filtre en aval.
  3. Instrumenter le démarrage, pas seulement la requête. Journaliser le nombre de passages, le locataire d’authentification et la réponse de l’API Graph au démarrage localise un déploiement défectueux en moins d’une minute.
  4. Différer le coût, jamais l’architecture. Une base vectorielle locale plutôt qu’un service de recherche entièrement managé économise le budget au lancement sans toucher à la logique de récupération. Concevez la base comme un composant interchangeable, et la montée en gamme se fera en un seul changement le moment venu.

Le question-réponse est la version un, pas la destination. La même fondation de récupération qui répond à la demande peut aussi agir de façon proactive : rappels d’audits à venir, suivi des non-conformités, et alertes sur les dates de revue qui approchent, remontés dans Teams sans que personne ait à demander. La couche de récupération construite aujourd’hui pose les bases d’une fonction conformité qui va au-devant des besoins au lieu d’attendre qu’on l’interroge. C’est le tournant qu’il vaut la peine d’anticiper, et il commence par bien poser les fondations, ennuyeuses mais fiables.

Vous vous demandez où l’IA trouve sa place dans vos opérations ?

Nous concevons et construisons des assistants sur lesquels vos équipes peuvent réellement compter, ancrés dans votre propre documentation et évalués sur les métriques qui comptent. Si vous avez un processus à forte densité documentaire qui repose sur des personnes répondant sans cesse aux mêmes questions, il en existe une version pour vous.

Parlez à AMO

Testez GRATUITEMENT notre POC de moins de 30 jours

En moins de 30 jours, nous prenons les rênes pour vous construire un POC qui à l’image de l’application finale.
Votre vision, notre rapidité.

Semaine 1

icon for web-01

Session de découverte

Nous recueillons des informations sur vos besoins et les objectifs de vos applications. Vous n’êtes pas sûr de l’application dont vous avez besoin ? Nous évaluerons soigneusement vos principaux défis et vous fournirons des conseils d’experts sur la solution parfaitement adaptée à votre réussite.

Semaine 2

icon for web-02

Validation du prototype

Nous créons des maquettes et un prototype interactif pour visualiser le design et les fonctionnalités de votre application et apporter des modifications en fonction de vos commentaires.

Semaine 3

icon for web-03

Définition de périmètre, estimation et planification

Estimation du projet en termes de ressources, de délais de livraison et de coûts impliqués.

Semaine 4

icon for web-04

Démo de POC

Présentation du POC aux parties prenantes concernées en illustrant les fonctionnalités et le potentiel de l’application pour atteindre les objectifs de l’entreprise.