Statistiques sur les signalements de spam rapportés par l'automatisation du triage de l'IA

Cette requête SQL fournit des statistiques sur les drapeaux de spam signalés par l’automatisation Discourse AI - AI triage. Elle calcule le nombre total de drapeaux, combien ont été approuvés ou rejetés, et les pourcentages correspondants. Ce rapport est utile pour comprendre l’efficacité de la détection automatisée de spam sur votre forum.

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2025-05-30

SELECT 
    COUNT(*) AS total_flags,
    COUNT(*) FILTER (WHERE r.status = 1) AS approved_flags,
    COUNT(*) FILTER (WHERE r.status = 2) AS rejected_flags,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 1) / COUNT(*), 2) AS approved_percentage,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 2) / COUNT(*), 2) AS rejected_percentage
FROM 
    reviewables r
JOIN 
    post_actions pa ON pa.post_id = r.target_id AND r.target_type = 'Post'
WHERE
    pa.post_action_type_id = 8 -- ID pour le spam (Signaler comme spam et masquer le message)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Drapeaux acceptés et rejetés
    AND r.created_by_id = -1 -- ID de l'utilisateur système

Explication de la requête SQL

  • Paramètres : Les paramètres :start_date et :end_date au format AAAA-MM-JJ avec des valeurs par défaut.
  • Jointure : Connecte la table reviewables à la table post_actions pour s’assurer que seuls les drapeaux de spam qui ont passé le processus de révision sont comptés.
  • Filtrage :
    • post_action_type_id = 8 : Restreint aux seuls drapeaux de spam.
    • Filtrage par plage de dates avec les paramètres spécifiés.
    • status IN (1, 2) : Inclut uniquement les drapeaux qui ont été résolus (approuvés ou rejetés).
    • created_by_id = -1 : Inclut uniquement les drapeaux créés par l’utilisateur système (triage IA).
  • Agrégations :
    • total_flags : Le nombre total de drapeaux de spam par le système.
    • approved_flags : Le nombre de drapeaux que les utilisateurs du personnel ont approuvés (statut = 1).
    • rejected_flags : Le nombre de drapeaux que les utilisateurs du personnel ont rejetés (statut = 2).
    • approved_percentage : Le pourcentage de drapeaux qui ont été approuvés.
    • rejected_percentage : Le pourcentage de drapeaux qui ont été rejetés.

Exemple de résultats

total_flags approved_flags rejected_flags approved_percentage rejected_percentage
152 128 24 84.21 15.79
3 « J'aime »

Et j’ai reçu

PG::DivisionByZero: ERROR:  division by zero

Cette erreur se produit parce qu’il n’y a eu aucun signalement de spam par @system avec lequel vous étiez d’accord ou en désaccord pendant cette période.
La requête essaie de diviser par le nombre total de signalements qui remplissent les conditions. Dans votre cas, c’est 0, donc ça casse.
Si vous voulez que la requête renvoie toujours un résultat, vous pouvez utiliser NULLIF pour vérifier cela afin d’obtenir NULL lorsqu’il n’y a rien à diviser.

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2025-05-30

SELECT 
    COUNT(*) AS total_flags,
    COUNT(*) FILTER (WHERE r.status = 1) AS approved_flags,
    COUNT(*) FILTER (WHERE r.status = 2) AS rejected_flags,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 1) / NULLIF(COUNT(*), 0), 2) AS approved_percentage,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 2) / NULLIF(COUNT(*), 0), 2) AS rejected_percentage
FROM 
    reviewables r
JOIN 
    post_actions pa ON pa.post_id = r.target_id AND r.target_type = 'Post'
WHERE
    pa.post_action_type_id = 8 -- ID pour spam (Signaler comme spam et masquer le message)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Signalements acceptés et rejetés
    AND r.created_by_id = -1 -- ID de l'utilisateur système
2 « J'aime »

J’en ai quelques-uns, tous des faux positifs, mais je ne me souviens plus comment je les ai gérés.

Mais quelque chose comme ça, je l’ai deviné aussi (je suis vraiment mauvais en lecture SQL).