Visita il nostro cookbook sulla moderazione dei contenuti per vedere un esempio di implementazione della moderazione dei contenuti utilizzando Claude.

Questa guida è incentrata sulla moderazione dei contenuti generati dagli utenti all’interno della tua applicazione. Se stai cercando indicazioni sulla moderazione delle interazioni con Claude, consulta la nostra guida ai guardrail.

Prima di costruire con Claude

Decidi se utilizzare Claude per la moderazione dei contenuti

Ecco alcuni indicatori chiave che suggeriscono di utilizzare un LLM come Claude invece di un approccio tradizionale basato su ML o regole per la moderazione dei contenuti:

Anthropic ha addestrato tutti i modelli Claude ad essere onesti, utili e innocui. Ciò potrebbe comportare che Claude moderi contenuti considerati particolarmente pericolosi (in linea con la nostra Politica di Utilizzo Accettabile), indipendentemente dal prompt utilizzato. Ad esempio, un sito web per adulti che desidera consentire agli utenti di pubblicare contenuti sessuali espliciti potrebbe scoprire che Claude continua a segnalare contenuti espliciti come richiedenti moderazione, anche se specificano nel loro prompt di non moderare contenuti sessuali espliciti. Consigliamo di rivedere la nostra AUP prima di costruire una soluzione di moderazione.

Genera esempi di contenuti da moderare

Prima di sviluppare una soluzione di moderazione dei contenuti, crea esempi di contenuti che dovrebbero essere segnalati e contenuti che non dovrebbero essere segnalati. Assicurati di includere casi limite e scenari impegnativi che potrebbero essere difficili da gestire efficacemente per un sistema di moderazione dei contenuti. Successivamente, rivedi i tuoi esempi per creare un elenco ben definito di categorie di moderazione. Ad esempio, gli esempi generati da una piattaforma di social media potrebbero includere quanto segue:

allowed_user_comments = [
    'Questo film è stato fantastico, mi è piaciuto molto. L\'attore principale ha davvero spaccato!',
    'Odio i lunedì.',
    'È un ottimo momento per investire in oro!'
]

disallowed_user_comments = [
    'Elimina questo post ora o è meglio che ti nasconda. Sto venendo a prendere te e la tua famiglia.',
    'State lontani dai telefoni cellulari 5G!! Stanno usando il 5G per controllarvi.',
    'Congratulazioni! Hai vinto una carta regalo da 1.000 dollari. Clicca qui per richiedere il tuo premio!'
]

# Commenti utente di esempio per testare la moderazione dei contenuti
user_comments = allowed_user_comments + disallowed_user_comments

# Elenco di categorie considerate non sicure per la moderazione dei contenuti
unsafe_categories = [
    'Sfruttamento Minorile',
    'Teorie del Complotto',
    'Odio',
    'Armi Indiscriminate', 
    'Proprietà Intellettuale',
    'Crimini Non Violenti', 
    'Privacy',
    'Autolesionismo',
    'Crimini Sessuali',
    'Contenuti Sessuali',
    'Consigli Specializzati',
    'Crimini Violenti'
]

Moderare efficacemente questi esempi richiede una comprensione sfumata del linguaggio. Nel commento, Questo film è stato fantastico, mi è piaciuto molto. L'attore principale ha davvero spaccato!, il sistema di moderazione dei contenuti deve riconoscere che “spaccato” è una metafora, non un’indicazione di violenza reale. Al contrario, nonostante la mancanza di menzioni esplicite di violenza, il commento Elimina questo post ora o è meglio che ti nasconda. Sto venendo a prendere te e la tua famiglia. dovrebbe essere segnalato dal sistema di moderazione dei contenuti.

L’elenco unsafe_categories può essere personalizzato per adattarsi alle tue esigenze specifiche. Ad esempio, se desideri impedire ai minori di creare contenuti sul tuo sito web, potresti aggiungere “Pubblicazione da parte di Minori” all’elenco.


Come moderare i contenuti utilizzando Claude

Seleziona il modello Claude giusto

Quando selezioni un modello, è importante considerare la dimensione dei tuoi dati. Se i costi sono una preoccupazione, un modello più piccolo come Claude Haiku 3 è un’eccellente scelta grazie alla sua convenienza. Di seguito è riportata una stima del costo per moderare il testo per una piattaforma di social media che riceve un miliardo di post al mese:

  • Dimensione del contenuto

    • Post al mese: 1 miliardo
    • Caratteri per post: 100
    • Caratteri totali: 100 miliardi
  • Token stimati

    • Token di input: 28,6 miliardi (assumendo 1 token ogni 3,5 caratteri)
    • Percentuale di messaggi segnalati: 3%
    • Token di output per messaggio segnalato: 50
    • Token di output totali: 1,5 miliardi
  • Costo stimato di Claude Haiku 3

    • Costo token di input: 2.860 MTok * $0,25/MTok = $715
    • Costo token di output: 1.500 MTok * $1,25/MTok = $1.875
    • Costo mensile: $715 + $1.875 = $2.590
  • Costo stimato di Claude Sonnet 4

    • Costo token di input: 2.860 MTok * $3,00/MTok = $8.580
    • Costo token di output: 1.500 MTok * $15,00/MTok = $22.500
    • Costo mensile: $8.580 + $22.500 = $31.080
I costi effettivi potrebbero differire da queste stime. Queste stime si basano sul prompt evidenziato nella sezione sull’elaborazione in batch. I token di output possono essere ulteriormente ridotti rimuovendo il campo explanation dalla risposta.

Costruisci un prompt efficace

Per utilizzare Claude per la moderazione dei contenuti, Claude deve comprendere i requisiti di moderazione della tua applicazione. Iniziamo scrivendo un prompt che ti permetta di definire le tue esigenze di moderazione:

import anthropic
import json

# Inizializza il client Anthropic
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # Converti l'elenco delle categorie non sicure in una stringa, con ogni categoria su una nuova riga
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Costruisci il prompt per Claude, includendo il messaggio e le categorie non sicure
    assessment_prompt = f"""
    Determina se il seguente messaggio richiede moderazione, 
    in base alle categorie non sicure delineate di seguito.
    
    Messaggio:
    <message>{message}</message>

    Categorie Non Sicure:
    <categories>
    {unsafe_category_str}
    </categories>

    Rispondi SOLO con un oggetto JSON, utilizzando il formato seguente:
    {{
    "violation": <Campo booleano che indica se il messaggio dovrebbe essere moderato>,
    "categories": [Elenco separato da virgole delle categorie violate],
    "explanation": [Opzionale. Includi solo se c'è una violazione.]
    }}"""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilizzo del modello Haiku per costi inferiori
        max_tokens=200,
        temperature=0,   # Usa temperatura 0 per una maggiore coerenza
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analizza la risposta JSON da Claude
    assessment = json.loads(response.content[0].text)
    
    # Estrai lo stato di violazione dalla valutazione
    contains_violation = assessment['violation']
    
    # Se c'è una violazione, ottieni le categorie e la spiegazione; altrimenti, usa valori predefiniti vuoti
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation

# Elabora ogni commento e stampa i risultati
for comment in user_comments:
    print(f"\nCommento: {comment}")
    violation, violated_categories, explanation = moderate_message(comment, unsafe_categories)
    
    if violation:
        print(f"Categorie Violate: {', '.join(violated_categories)}")
        print(f"Spiegazione: {explanation}")
    else:
        print("Nessun problema rilevato.")

In questo esempio, la funzione moderate_message contiene un prompt di valutazione che include le categorie di contenuti non sicuri e il messaggio che desideriamo valutare. Il prompt chiede a Claude di valutare se il messaggio dovrebbe essere moderato, in base alle categorie non sicure che abbiamo definito.

La valutazione del modello viene quindi analizzata per determinare se c’è una violazione. Se c’è una violazione, Claude restituisce anche un elenco delle categorie violate, nonché una spiegazione del motivo per cui il messaggio non è sicuro.

Valuta il tuo prompt

La moderazione dei contenuti è un problema di classificazione. Pertanto, puoi utilizzare le stesse tecniche delineate nel nostro cookbook di classificazione per determinare l’accuratezza del tuo sistema di moderazione dei contenuti.

Un’ulteriore considerazione è che invece di trattare la moderazione dei contenuti come un problema di classificazione binaria, potresti invece creare più categorie per rappresentare vari livelli di rischio. Creare più livelli di rischio ti consente di regolare l’aggressività della tua moderazione. Ad esempio, potresti voler bloccare automaticamente le query degli utenti considerate ad alto rischio, mentre gli utenti con molte query a rischio medio vengono segnalati per la revisione umana.

import anthropic
import json

# Inizializza il client Anthropic
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # Converti l'elenco delle categorie non sicure in una stringa, con ogni categoria su una nuova riga
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Costruisci il prompt per Claude, includendo il messaggio, le categorie non sicure e le definizioni dei livelli di rischio
    assessment_prompt = f"""
    Valuta il livello di rischio del seguente messaggio che richiede moderazione, 
    in base alle categorie non sicure elencate di seguito.
    
Messaggio:
<message>{message}</message>

Categorie Non Sicure:
<categories>
{unsafe_category_str}
</categories>

Assegna un livello di rischio in base alla tua fiducia che il messaggio dell'utente debba essere moderato 
in base alle categorie non sicure definite:

0 - Nessun rischio
1 - Rischio basso
2 - Rischio medio
3 - Rischio alto

Rispondi SOLO con un oggetto JSON, utilizzando il formato seguente:
{{
  "risk_level": <Campo numerico che indica il livello di rischio>,
  "categories": [Elenco separato da virgole delle categorie violate],
  "explanation": <Opzionale. Includi solo se il livello di rischio è maggiore di 0>
}}"""

    # Invia la richiesta a Claude per la valutazione del rischio
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilizzo del modello Haiku per costi inferiori
        max_tokens=200,
        temperature=0,   # Usa temperatura 0 per una maggiore coerenza
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analizza la risposta JSON da Claude
    assessment = json.loads(response.content[0].text)
    
    # Estrai il livello di rischio, le categorie violate e la spiegazione dalla valutazione
    risk_level = assessment["risk_level"]
    violated_categories = assessment["categories"]
    explanation = assessment.get("explanation")
    
    return risk_level, violated_categories, explanation

# Elabora ogni commento e stampa i risultati
for comment in user_comments:
    print(f"\nCommento: {comment}")
    risk_level, violated_categories, explanation = assess_risk_level(comment, unsafe_categories)
    
    print(f"Livello di Rischio: {risk_level}")
    if violated_categories:
        print(f"Categorie Violate: {', '.join(violated_categories)}")
    if explanation:
        print(f"Spiegazione: {explanation}")

Questo codice implementa una funzione assess_risk_level che utilizza Claude per valutare il livello di rischio di un messaggio. La funzione accetta un messaggio e un elenco di categorie non sicure come input.

All’interno della funzione, viene generato un prompt per Claude, che include il messaggio da valutare, le categorie non sicure e istruzioni specifiche per valutare il livello di rischio. Il prompt istruisce Claude a rispondere con un oggetto JSON che include il livello di rischio, le categorie violate e una spiegazione opzionale.

Questo approccio consente una moderazione dei contenuti flessibile assegnando livelli di rischio. Può essere integrato senza problemi in un sistema più ampio per automatizzare il filtraggio dei contenuti o segnalare commenti per la revisione umana in base al loro livello di rischio valutato. Ad esempio, quando si esegue questo codice, il commento Elimina questo post ora o è meglio che ti nasconda. Sto venendo a prendere te e la tua famiglia. viene identificato come ad alto rischio a causa della sua pericolosa minaccia. Al contrario, il commento State lontani dai telefoni cellulari 5G!! Stanno usando il 5G per controllarvi. è classificato come rischio medio.

Implementa il tuo prompt

Una volta che sei sicuro della qualità della tua soluzione, è il momento di implementarla in produzione. Ecco alcune best practice da seguire quando si utilizza la moderazione dei contenuti in produzione:

  1. Fornisci un feedback chiaro agli utenti: Quando l’input dell’utente viene bloccato o una risposta viene segnalata a causa della moderazione dei contenuti, fornisci un feedback informativo e costruttivo per aiutare gli utenti a capire perché il loro messaggio è stato segnalato e come possono riformularlo in modo appropriato. Negli esempi di codice sopra, questo viene fatto attraverso il tag explanation nella risposta di Claude.

  2. Analizza i contenuti moderati: Tieni traccia dei tipi di contenuti segnalati dal tuo sistema di moderazione per identificare tendenze e potenziali aree di miglioramento.

  3. Valuta e migliora continuamente: Valuta regolarmente le prestazioni del tuo sistema di moderazione dei contenuti utilizzando metriche come la precisione e il richiamo. Utilizza questi dati per perfezionare iterativamente i tuoi prompt di moderazione, le parole chiave e i criteri di valutazione.


Migliora le prestazioni

In scenari complessi, potrebbe essere utile considerare strategie aggiuntive per migliorare le prestazioni oltre alle tecniche standard di prompt engineering. Ecco alcune strategie avanzate:

Definisci argomenti e fornisci esempi

Oltre a elencare le categorie non sicure nel prompt, ulteriori miglioramenti possono essere apportati fornendo definizioni e frasi relative a ciascuna categoria.

import anthropic
import json

# Inizializza il client Anthropic
client = anthropic.Anthropic()

# Dizionario delle categorie considerate non sicure per la moderazione dei contenuti, con le loro definizioni
unsafe_category_definitions = {
    'Sfruttamento Minorile': 'Contenuti che raffigurano nudità infantile o che abilitano, incoraggiano, giustificano o raffigurano l\'abuso sessuale di minori.',
    'Teorie del Complotto': """Contenuti che promuovono o approvano teorie infondate, false o fuorvianti su eventi, situazioni o individui, 
        che possono incitare danni o minare la fiducia pubblica nelle istituzioni o nei fatti.""",
    'Odio': """Contenuti che sono odiosi verso le persone sulla base delle loro caratteristiche protette 
        (razza, colore, etnia, origine nazionale, disabilità, affiliazione religiosa, casta, orientamento sessuale, sesso, identità di genere e malattie gravi), 
        o contenuti che perpetuano stereotipi negativi.""",
    'Armi Indiscriminate': 'Contenuti che consentono la creazione di armi di distruzione di massa.', 
    'Proprietà Intellettuale': 'Contenuti che violano i diritti di proprietà intellettuale di terzi.',
    'Crimini Non Violenti': 'Contenuti che abilitano, incoraggiano o giustificano la commissione di crimini non violenti.', 
    'Privacy': 'Contenuti che contengono informazioni sensibili e personali su individui privati.',
    'Autolesionismo': 'Contenuti che abilitano, incoraggiano o giustificano atti di autolesionismo intenzionale.',
    'Crimini Sessuali': 'Contenuti che abilitano, incoraggiano o giustificano la commissione di crimini sessuali.',
    'Contenuti Sessuali': 'Contenuti che contengono descrizioni erotiche o rappresentazioni esplicite di atti sessuali.',
    'Consigli Specializzati': """Contenuti che contengono consigli finanziari, medici o legali. 
        I consigli finanziari includono indicazioni su investimenti, azioni, obbligazioni o qualsiasi pianificazione finanziaria.""",
    'Crimini Violenti': 'Contenuti che abilitano, incoraggiano o giustificano la commissione di crimini violenti.', 
}


def moderate_message_with_definitions(message, unsafe_category_definitions):
    # Formatta la stringa delle categorie non sicure, con ogni categoria e la sua definizione su una nuova riga
    unsafe_category_str = '\n'.join(f'{category}: {definition}' 
        for category, definition in unsafe_category_definitions.items()
    )
    
    # Costruisci il prompt per Claude, includendo il messaggio e le categorie non sicure
    assessment_prompt = f"""Determina se il seguente messaggio richiede moderazione, in base alle categorie non sicure delineate di seguito.

Messaggio:
<message>{message}</message>

Categorie Non Sicure e Le Loro Definizioni:
<categories>
{unsafe_category_str}
</categories>

È importante che tu ricordi tutte le categorie non sicure e le loro definizioni.

Rispondi SOLO con un oggetto JSON, utilizzando il formato seguente:
{{
  "violation": <Campo booleano che indica se il messaggio dovrebbe essere moderato>,
  "categories": [Elenco separato da virgole delle categorie violate],
  "explanation": [Opzionale. Includi solo se c'è una violazione.]
}}"""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilizzo del modello Haiku per costi inferiori
        max_tokens=200,
        temperature=0,   # Usa temperatura 0 per una maggiore coerenza
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analizza la risposta JSON da Claude
    assessment = json.loads(response.content[0].text)
    
    # Estrai lo stato di violazione dalla valutazione
    contains_violation = assessment['violation']
    
    # Se c'è una violazione, ottieni le categorie e la spiegazione; altrimenti, usa valori predefiniti vuoti
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation


# Elabora ogni commento e stampa i risultati
for comment in user_comments:
    print(f"\nCommento: {comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(comment, unsafe_category_definitions)
    
    if violation:
        print(f"Categorie Violate: {', '.join(violated_categories)}")
        print(f"Spiegazione: {explanation}")
    else:
        print("Nessun problema rilevato.")

La funzione moderate_message_with_definitions espande la precedente funzione moderate_message consentendo di associare ogni categoria non sicura a una definizione dettagliata. Questo avviene nel codice sostituendo l’elenco unsafe_categories della funzione originale con un dizionario unsafe_category_definitions. Questo dizionario mappa ogni categoria non sicura alla sua corrispondente definizione. Sia i nomi delle categorie che le loro definizioni sono inclusi nel prompt.

In particolare, la definizione per la categoria Consigli Specializzati ora specifica i tipi di consigli finanziari che dovrebbero essere proibiti. Di conseguenza, il commento È un ottimo momento per investire in oro!, che in precedenza aveva superato la valutazione moderate_message, ora attiva una violazione.

Considera l’elaborazione in batch

Per ridurre i costi in situazioni in cui la moderazione in tempo reale non è necessaria, considera di moderare i messaggi in batch. Includi più messaggi nel contesto del prompt e chiedi a Claude di valutare quali messaggi dovrebbero essere moderati.

import anthropic
import json

# Inizializza il client Anthropic
client = anthropic.Anthropic()

def batch_moderate_messages(messages, unsafe_categories):
    # Converti l'elenco delle categorie non sicure in una stringa, con ogni categoria su una nuova riga
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Formatta la stringa dei messaggi, con ogni messaggio racchiuso in tag simili a XML e dotato di un ID
    messages_str = '\n'.join([f'<message id={idx}>{msg}</message>' for idx, msg in enumerate(messages)])
    
    # Costruisci il prompt per Claude, includendo i messaggi e le categorie non sicure
    assessment_prompt = f"""Determina i messaggi da moderare, in base alle categorie non sicure delineate di seguito.

Messaggi:
<messages>
{messages_str}
</messages>

Categorie non sicure e le loro definizioni:
<categories>
{unsafe_category_str}
</categories>

Rispondi SOLO con un oggetto JSON, utilizzando il formato seguente:
{{
  "violations": [
    {{
      "id": <id del messaggio>,
      "categories": [elenco delle categorie violate],
      "explanation": <Spiegazione del motivo per cui c'è una violazione>
    }},
    ...
  ]
}}

Note Importanti:
- Ricorda di analizzare ogni messaggio per una violazione.
- Seleziona qualsiasi numero di violazioni che si applicano ragionevolmente."""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Utilizzo del modello Haiku per costi inferiori
        max_tokens=2048,  # Aumento del conteggio massimo di token per gestire i batch
        temperature=0,    # Usa temperatura 0 per una maggiore coerenza
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Analizza la risposta JSON da Claude
    assessment = json.loads(response.content[0].text)
    return assessment


# Elabora il batch di commenti e ottieni la risposta
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# Stampa i risultati per ogni violazione rilevata
for violation in response_obj['violations']:
    print(f"""Commento: {user_comments[violation['id']]}
Categorie Violate: {', '.join(violation['categories'])}
Spiegazione: {violation['explanation']}
""")

In questo esempio, la funzione batch_moderate_messages gestisce la moderazione di un intero batch di messaggi con una singola chiamata API a Claude. All’interno della funzione, viene creato un prompt che include l’elenco dei messaggi da valutare, le categorie di contenuti non sicuri definite e le loro descrizioni. Il prompt indica a Claude di restituire un oggetto JSON che elenca tutti i messaggi che contengono violazioni. Ogni messaggio nella risposta è identificato dal suo id, che corrisponde alla posizione del messaggio nell’elenco di input. Tieni presente che trovare la dimensione ottimale del batch per le tue esigenze specifiche potrebbe richiedere alcune sperimentazioni. Mentre dimensioni di batch più grandi possono abbassare i costi, potrebbero anche portare a un leggero calo della qualità. Inoltre, potrebbe essere necessario aumentare il parametro max_tokens nella chiamata API di Claude per accogliere risposte più lunghe. Per dettagli sul numero massimo di token che il modello scelto può produrre, consulta la pagina di confronto dei modelli.