Alertes sur les sites GenAI : pourquoi notre extension affiche-t-elle des faux positifs ?
Ça Bloom ?

Next utilise un filtre de Bloom pour afficher des alertes sur les médias utilisant de l’IA générative pour tout ou partie de ses articles. Comment fonctionne notre algorithme de détection et pourquoi y a-t-il des faux positifs ? On vous explique.
Le 08 avril à 10h50
5 min
Next
Next
Notre extension Chrome et Firefox pour alerter les visiteurs des sites d'information utilisant l’IA générative pour tout ou partie de leurs articles utilise une liste de plus de 3 000 noms de domaines identifiés « à la main et de visu » (sans recours à des outils de vérification algorithmique et automatisé) par notre journaliste Jean-Marc Manach. Le code source est disponible sur GitHub.
Cachez cette liste que je ne saurais voir…
Nous ne souhaitons pas diffuser publiquement la liste des domaines (et des entreprises), pour plusieurs raisons que nous avons déjà expliquées dès la première partie de notre enquête :
« Nous ne voulons pas, d'une part, que cette base de données puisse aider ceux qui voudraient améliorer leurs générateurs d'articles automatisés, et qui se targuent de ne pas être reconnus comme GenAI (nous y reviendrons). Nous ne voulons pas non plus faire de "name and shame" et mettre sur le même plan des auto-entrepreneurs SEO ayant créé quelques sites de façon opportuniste et les entreprises (y compris individuelles) en ayant créé plusieurs dizaines ».
Nous avons donc utilisé une méthode d’obfuscation pour masquer la liste. Un développeur de moji – Hasnaine – nous a grandement épaulés pour cette tâche. Il a développé le code de cette partie de l’extension, ainsi qu’un script pour transformer notre liste de manière irréversible. La méthode utilise un filtre de Bloom, mais qu’est-ce que c’est et qu’est-ce que cela implique ?
Comme l’explique Bioinfo-fr, « le filtre de Bloom ne vous permet pas vraiment de “stocker” des données à proprement parler ; le filtre est là pour vous permettre de tester l'appartenance d'un élément à un ensemble de données ». Parfait, c’est exactement ce que l’on cherche.
- Télécharger et installer notre extension pour Chrome
- Télécharger et installer notre extension pour Firefox
Contre les faux positifs, la liste blanche
Un filtre de Bloom est une structure probabiliste. Dans la pratique, c’est un tableau de n bits qui est initialement à 0 sur toutes ses entrées. « Nous allons utiliser plusieurs fonctions de hachage indépendantes qui retourneront une suite de bits correspondant à des adresses mémoires : au lieu d'effectivement stocker les données, on ne stockera ainsi que quelques bits d'information », explique Bioinfo-fr.
L’exemple parle du stockage de séquences ADN (logique pour un site dédié à la biologie), mais cela fonctionne à peu près pour n’importe quoi. L’algorithme a deux résultats possibles lors d’un test : l’élément est probablement dans la liste, ou il n’est pas présent (cette fois-ci avec certitude), comme le résume Wikipédia :
« Plus précisément, un test d'appartenance renvoie soit "peut-être dans l'ensemble" ou "assurément pas dans l'ensemble". Dit autrement, il n'y a jamais de faux négatif mais il peut y avoir des faux positifs. »
Il a donc l’avantage de ne pas produire de faux négatif (un site qui serait dans la liste, mais non identifié comme tel). Toutefois, il a l'inconvénient de générer des faux positifs. Et plus la liste d’éléments de base est grande, plus le risque de faux positifs augmente. Raison pour laquelle certains sites sont parfois identifiés à tort par notre extension.
Un faux positif arrive donc lorsque l‘algorithme identifie à tort un site comme étant « peut-être » dans notre liste, quand bien même il n'y figure pourtant pas. Pour contrer cette problématique inhérente au fonctionnement du filtre de Bloom, nous avons mis en place depuis quasiment le début une liste blanche d’URL à ne pas identifier.
Nous tâchons d’ajouter au plus vite les éléments dans notre liste pour corriger les faux positifs quand ils nous sont signalés. Depuis peu, l’application télécharge sa liste blanche sur les serveurs de Next, ce qui évite d'avoir à la pousser manuellement à chaque nouvelle mise à jour (encore à déployer sur Chrome, ça arrive).
Notre algorithme, côté technique
Pour en revenir à notre filtre de Bloom, nous vous donnons les principaux paramètres de notre formule pour calculer la taille de notre tableau (en bits), à partir du nombre d’éléments et du taux de faux positif spécifié. Attention, plus le taux est faible, plus la taille du tableau est importante, il faut donc choisir avec précaution ce paramètre.
const expectedElements = strings.length;
const falsePositiveRate = 0.00000001;
const size = Math.ceil(-(expectedElements * Math.log(falsePositiveRate)) / (Math.log(2) ** 2));
const numHashes = Math.max(1, Math.ceil((size / expectedElements) * Math.log(2)));
Une fois la taille de notre tableau obtenu, nous calculons le nombre de hachages pour notre filtre de Bloom.
L’influence de la précision
Voici quelques résultats en fonction de la précision (falsePositiveRate) demandée sur les faux positifs (il s’agit ici de quelques exemples, d’autres combinaisons sont possibles) :
1 % (0.01):
- Taille : 32 772 bits
- Nombre de fonctions de hash : 7
0,01 % (0.0001) :
- Taille : 65 543 bits
- Nombre de fonctions de hash : 14
0,0001 % (0.000001) :
- Taille : 98 314 bits
- Nombre de fonctions de hash : 20
0.000001 % (0.00000001) :
- Taille : 131 086 bits
- Nombre de fonctions de hash : 27
Afin de limiter le nombre de faux positifs, nous avons augmenté la précision dans la dernière mise à jour de notre extension.
Alertes sur les sites GenAI : pourquoi notre extension affiche-t-elle des faux positifs ?
-
Cachez cette liste que je ne saurais voir…
-
Contre les faux positifs, la liste blanche
-
Notre algorithme, côté technique
-
L’influence de la précision
Commentaires (14)
Abonnez-vous pour prendre part au débat
Déjà abonné ? Se connecter
Cet article est en accès libre, mais il est le fruit du travail d'une rédaction qui ne travaille que pour ses lecteurs, sur un média sans pub et sans tracker. Soutenez le journalisme tech de qualité en vous abonnant.
Accédez en illimité aux articles
Profitez d’un média expert et unique
Intégrez la communauté et prenez part aux débats
Partagez des articles premium à vos contacts
Abonnez-vousLe 08/04/2025 à 11h25
Je ne connaissais pas ce genre de filtre, cela donne envie de plonger plus dedans.
Petite remarque, mais j'ignore si je dois le faire ici. Je travaille beaucoup avec la console des navigateurs, le souci, c'est que l'extension laisse quelques traces de logs sur chaque page, par exemple :
Congratulations!!Service Worker Registered ServiceWorker scope: https://next.ink/
Ce n'est pas non plus très gênant, mais c'était surtout pour prévenir ! Je sais que sous Chrome, je peux masquer ce genre de message :)
Encore une fois super extension et merci pour vos explications.
PS : J'aurais bien report l'issue sur Github, mais je n'ai trouvé que le code pour Firefox :)
Le 08/04/2025 à 11h49
C'est juste l'empaquetage et la distribution qui doivent changer.
Le 08/04/2025 à 13h28
Le 08/04/2025 à 11h47
Je retrouve beaucoup moins de lien GenAI dans le résultat de recherche ces derniers jours (j'utilise une version modifiée de l'extension, qui
barre en rougeles liens qui sont des liens de sites GenAI, évitant de devoir se rendre sur ledit site pour s'en rendre compte)Le 08/04/2025 à 11h53
C'est masqué et ne laisse pas de place au hasard.
Le 08/04/2025 à 12h03
- la taille du filtre de Bloom est "indépendante" du nombre d'éléments (c'est le facteur de faux positif qui en dépend)
- impossible de savoir le nombre exact d'éléments à l'intérieur
- inverser le filtre de Bloom nécessitera un peu plus de compétence et de temps que d'inverser une fonction de hashage classique
- la complexité de la vérification via un filtre de Bloom est en temps constant O(1) par rapport aux nombres d'éléments (car la taille du filtre ne dépend pas du nombre d'éléments), contrairement à une liste de hashage où elle serait, au mieux en O(log(n)).
Modifié le 08/04/2025 à 12h18
En choisissant la table de hash j'aurais dû exposer le nombre d'éléments dans le set, cela aurait grandement augmenté la taille de l'extension, le bloom filter réduit considérablement la taille de la structure de donnée contenant le set d'URLs.
Cela aurait aussi entraîné une complexification importante du process de mise a jour de la liste, le sérialisation du bloom filter est beaucoup plus simple.
Dernièrement, un attaquant expérimenté aurait eu une plus grande surface d'attaque sur une hash table possédant plus d'informations a exploiter
Ces raisons sont les principales qui m'ont poussé a choisir la solution du bloom filter.
Après j'aime bien me dire que l'aspect probabiliste avec la possibilité de faux positifs est une feature plutôt qu'un bug, ça te force a faire marcher ton esprit critique en te demandant si le site est vraiment généré par IA ou pas, plutôt que du suivre aveuglément une figure d'autorité
Celui qui cesse de douter, cesse de progresser
PS: D'après les retours de mes collègues j'ai des tendances a overengineer, si vous avez une solution plus simple et élégante je serais ravi d'avoir vos perspectives.
Le 08/04/2025 à 16h23
Je suppose qu’héberger la liste des domaines IA pose des problème de confidentialité ?
Le 08/04/2025 à 16h54
Ainsi, la seule chose que sait Mozilla, c’est que telle adresse IP veut visiter un site dont le début du hash est pareil à ceux dans la liste. Mozilla ne sait même pas s’il est dans la liste : ce peut être un site légitime, mais ayant le même début de hash.
Le 08/04/2025 à 18h04
Cette stratégie nous aurait en effet évité d'avoir a implémenter un mécanisme d'obfuscation mais la grande contrepartie en termes d'appels réseaux nécessaires et de bande passante dédiée a cela sur les serveurs de Next nous a fait éluder cette option.
Bien que nous l'ayons envisagé, le format actuel semble représenter un bon compromis entre les nécessités d'économies réseaux tout en préservant notre liste d'URL
Le 08/04/2025 à 20h30
Le nombre estimé de sites qui seront bloqués ?
Le 09/04/2025 à 00h07
Le 10/04/2025 à 14h14
Le 10/04/2025 à 19h38