Statistiche sui flag di spam segnalati dall'automazione del triage AI

Questa query SQL fornisce statistiche sui flag di spam segnalati dall’automazione Discourse AI - AI triage. Calcola il numero totale di flag, quanti sono stati approvati o rifiutati e le percentuali corrispondenti. Questo report è utile per comprendere l’efficacia del rilevamento automatico dello spam sul tuo 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 per spam (Segnala come spam e nascondi post)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Flag accettati e rifiutati
    AND r.created_by_id = -1 -- ID utente di sistema

Spiegazione della query SQL

  • Parametri: Parametri :start_date e :end_date in formato AAAA-MM-GG con valori predefiniti.
  • Join: Collega la tabella reviewables con la tabella post_actions per garantire che vengano conteggiati solo i flag di spam che sono passati attraverso il processo di revisione.
  • Filtraggio:
    • post_action_type_id = 8: Limita solo ai flag di spam.
    • Filtraggio per intervallo di date con i parametri specificati.
    • status IN (1, 2): Include solo i flag che sono stati risolti (approvati o rifiutati).
    • created_by_id = -1: Include solo i flag creati dall’utente di sistema (AI triage).
  • Aggregazioni:
    • total_flags: Il numero totale di flag di spam da parte del sistema.
    • approved_flags: Conteggio dei flag che gli utenti dello staff hanno approvato (stato = 1).
    • rejected_flags: Conteggio dei flag che gli utenti dello staff hanno rifiutato (stato = 2).
    • approved_percentage: Percentuale di flag che sono stati approvati.
    • rejected_percentage: Percentuale di flag che sono stati rifiutati.

Esempio di risultati

total_flags approved_flags rejected_flags approved_percentage rejected_percentage
152 128 24 84.21 15.79
3 Mi Piace

E ho ricevuto

PG::DivisionByZero: ERRORE: divisione per zero

Questo errore si verifica perché non ci sono state segnalazioni di spam da parte di @system con cui eri d’accordo o in disaccordo durante quel periodo di tempo.
La query cerca di dividere per il numero totale di segnalazioni che soddisfano le condizioni. Nel tuo caso è 0, quindi si interrompe.
Se desideri che la query restituisca comunque un risultato, puoi utilizzare NULLIF per verificarlo in modo da ottenere NULL quando non c’è niente da dividere.

-- [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 per spam (Segnala come spam e nascondi il post)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Segnalazioni accettate e rifiutate
    AND r.created_by_id = -1 -- ID utente di sistema
2 Mi Piace

Ne ho un paio, tutti falsi positivi, ma non ricordo come li ho gestiti. Ma qualcosa del genere l’avevo intuito anch’io (sono davvero pessimo a leggere SQL).