Statistiken zu Spam-Markierungen, die von der KI-Triage-Automatisierung gemeldet wurden

Diese SQL-Abfrage liefert Statistiken über Spam-Markierungen, die von der Automatisierung unter Discourse AI - AI triage gemeldet wurden. Sie berechnet die Gesamtzahl der Markierungen, wie viele genehmigt oder abgelehnt wurden, und die entsprechenden Prozentsätze. Dieser Bericht ist nützlich, um zu verstehen, wie effektiv die automatische Spam-Erkennung in Ihrem Forum ist.

-- [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 für Spam (Als Spam markieren und Beitrag ausblenden)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Genehmigte und abgelehnte Markierungen
    AND r.created_by_id = -1 -- Systembenutzer-ID

Erklärung der SQL-Abfrage

  • Parameter: :start_date und :end_date Parameter im Format JJJJ-MM-TT mit Standardwerten.
  • Join: Verbindet die Tabelle reviewables mit der Tabelle post_actions, um sicherzustellen, dass nur Spam-Markierungen gezählt werden, die den Überprüfungsprozess durchlaufen haben.
  • Filterung:
    • post_action_type_id = 8: Beschränkt auf reine Spam-Markierungen.
    • Datumsbereichsfilterung mit den angegebenen Parametern.
    • status IN (1, 2): Schließt nur Markierungen ein, die bearbeitet wurden (genehmigt oder abgelehnt).
    • created_by_id = -1: Schließt nur Markierungen ein, die vom Systembenutzer (KI-Triage) erstellt wurden.
  • Aggregationen:
    • total_flags: Die Gesamtzahl der vom System erstellten Spam-Markierungen.
    • approved_flags: Anzahl der Markierungen, die von Mitarbeitern genehmigt wurden (Status = 1).
    • rejected_flags: Anzahl der Markierungen, die von Mitarbeitern abgelehnt wurden (Status = 2).
    • approved_percentage: Prozentsatz der genehmigten Markierungen.
    • rejected_percentage: Prozentsatz der abgelehnten Markierungen.

Beispielergebnisse

total_flags approved_flags rejected_flags approved_percentage rejected_percentage
152 128 24 84.21 15.79
3 „Gefällt mir“

Und ich bekam

PG::DivisionByZero: ERROR:  division durch Null

Dieser Fehler tritt auf, weil es im genannten Zeitraum keine Spam-Markierungen von @system gab, denen Sie zugestimmt oder widersprochen haben.
Die Abfrage versucht, durch die Gesamtzahl der Markierungen zu dividieren, die die Bedingungen erfüllen. In Ihrem Fall ist das 0, also geht es schief.
Wenn Sie möchten, dass die Abfrage trotzdem ein Ergebnis zurückgibt, können Sie NULLIF verwenden, um dies zu überprüfen, damit Sie NULL erhalten, wenn es nichts zu dividieren gibt.

-- [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 für Spam (Als Spam markieren und Beitrag ausblenden)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Akzeptierte und abgelehnte Markierungen
    AND r.created_by_id = -1 -- Systembenutzer-ID
2 „Gefällt mir“

Ich habe ein paar, allesamt falsche Positive, aber ich kann mich nicht mehr erinnern, wie ich damit umgegangen bin.

Aber so etwas habe ich auch vermutet (ich bin wirklich schlecht im Lesen von SQL).