Une belle réponse ne règle pas deux sources en conflit

Le vieux garbage in, garbage out revient souvent dans les discussions sur l’IA générative. Il manque un cas fréquent : deux sources propres, lisibles et officielles peuvent dire le contraire. Le problème n’est pas un caractère invalide; c’est l’absence d’une règle d’autorité.

Imaginons une fiche produit qui confirme une compatibilité et un bulletin technique qui l’exclut. Un pipeline RAG peut indexer les deux. Il extrait le texte, le découpe en passages, calcule des embeddings et conserve métadonnées et droits. À la question, la recherche ramène les passages les plus proches; le modèle reçoit ces extraits et rédige une réponse.

documents → extraction → passages + métadonnées → index
question  → recherche hybride → passages autorisés → grand modèle
          → réponse + citations

Si les deux passages arrivent, le grand modèle peut signaler le conflit. Il peut aussi les fusionner dans une phrase naturelle, surtout si la consigne lui demande une réponse courte. S’il n’en récupère qu’un, il ne sait même pas que l’autre existe. La gouvernance doit donc vivre avant et après la génération.

Je donnerais à chaque contenu ces champs :

SourceId        BULLETIN-2023-17
Type            BulletinTechnique
Produit         PIECE-4182
Version         3
ValideDu        2023-04-15
ValideAu        null
Autorité        IngénierieProduit
Statut          Publié
Remplace        BULLETIN-2022-09
PermissionSet   Support-N2

Une fiche marketing et un bulletin d’ingénierie peuvent tous deux être publiés, mais le bulletin gagne sur une question de compatibilité. Une politique de résolution explicite ce choix et retourne CONFLIT_NON_RESOLU si deux sources de même autorité restent actives. L’assistant n’a pas le droit d’inventer le gagnant.

Tester les contradictions volontairement

Le jeu d’évaluation contient :

  1. question avec une seule source actuelle;
  2. ancienne et nouvelle version du même document;
  3. deux sources autorisées qui se contredisent;
  4. document brouillon plus récent que la version publiée;
  5. réponse absente du corpus;
  6. numéro de produit presque identique;
  7. document interdit à l’utilisateur;
  8. contenu malveillant qui demande d’ignorer les règles.

Le résultat est évalué en deux étapes. D’abord la récupération : le bon passage apparaît-il dans les k premiers? Ensuite la génération : la réponse respecte-t-elle uniquement les passages, cite-t-elle la version et sait-elle s’abstenir? Une bonne prose ne compense jamais une récupération incorrecte.

Les permissions s’appliquent avant l’index ou au filtrage avec une garantie équivalente. Je ne laisse pas le modèle lire un passage interdit pour lui demander ensuite de ne pas le mentionner. Les caches incluent identité, droits et version; une réponse d’un directeur ne doit pas ressortir pour un autre compte.

La fraîcheur est un mécanisme. Un événement de publication invalide l’ancienne version, relance son indexation et note l’heure. Si le pipeline échoue, le système garde la dernière version connue avec un avertissement plutôt que mélanger l’ancien et le nouveau. Une alerte se déclenche lorsque deux sources actives affirment des valeurs incompatibles.

Je ne vais pas attendre que toutes les données soient parfaites. Je commencerais sur un domaine où l’autorité, les versions et le propriétaire peuvent être nommés. La pratique est d’afficher la source, la date et le passage, puis de traiter « je ne peux pas trancher » comme un résultat valide. L’assistant doit révéler le conflit pour qu’une personne le règle, pas l’aplanir pour produire un beau paragraphe.