Claude Platform Docs
Best practiceCasi d'uso

Moderazione dei contenuti

La moderazione dei contenuti è un aspetto fondamentale per mantenere un ambiente sicuro, rispettoso e produttivo nelle applicazioni digitali. Questa guida illustra come Claude può essere utilizzato per moderare i contenuti all'interno della tua applicazione digitale.

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

Prima di sviluppare con Claude

Decidi se usare Claude per la moderazione dei contenuti

Ecco alcuni indicatori chiave che suggeriscono di usare un "large language model" (grande modello linguistico), o LLM, come Claude invece di un approccio tradizionale basato su ML o su regole per la moderazione dei contenuti:

Genera esempi di contenuti da moderare

Prima di sviluppare una soluzione di moderazione dei contenuti, crea innanzitutto esempi di contenuti che dovrebbero essere segnalati e di contenuti che non dovrebbero esserlo. Assicurati di includere casi limite e scenari impegnativi che potrebbero essere difficili da gestire efficacemente per un sistema di moderazione dei contenuti. Successivamente, esamina 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:

client = anthropic.Anthropic()

allowed_user_comments = [
    "This movie was great, I really enjoyed it. The main actor really killed it!",
    "I hate Mondays.",
    "It is a great time to invest in gold!",
]

disallowed_user_comments = [
    "Delete this post now or you better hide. I am coming after you and your family.",
    "Stay away from the 5G cellphones!! They are using 5G to control you.",
    "Congratulations! You have won a $1,000 gift card. Click here to claim your prize!",
]

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

# Categorie considerate non sicure per la moderazione dei contenuti
unsafe_categories = [
    "Child Exploitation",
    "Conspiracy Theories",
    "Hate",
    "Indiscriminate Weapons",
    "Intellectual Property",
    "Non-Violent Crimes",
    "Privacy",
    "Self-Harm",
    "Sex Crimes",
    "Sexual Content",
    "Specialized Advice",
    "Violent Crimes",
]

Moderare efficacemente questi esempi richiede una comprensione sfumata del linguaggio. Nel commento This movie was great, I really enjoyed it. The main actor really killed it!, il sistema di moderazione dei contenuti deve riconoscere che "killed it" è una metafora, non un'indicazione di violenza reale. Al contrario, nonostante l'assenza di menzioni esplicite di violenza, il commento Delete this post now or you better hide. I am coming after you and your family. dovrebbe essere segnalato dal sistema di moderazione dei contenuti.

Le categorie non sicure possono essere personalizzate per adattarsi alle tue esigenze specifiche. Ad esempio, se desideri impedire ai minori di creare contenuti sul tuo sito web, potresti aggiungere "Underage Posting" alle categorie.


Come moderare i contenuti usando Claude

Seleziona il modello Claude giusto

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

  • Dimensione dei contenuti

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

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

    • Costo dei token di input: 28.600 MTok * $1,00/MTok = $28.600 USD
    • Costo dei token di output: 1.500 MTok * $5,00/MTok = $7.500 USD
    • Costo mensile: $28.600 + $7.500 = $36.100 USD
  • Costo stimato di Claude Opus 5

    • Costo dei token di input: 28.600 MTok * $5,00/MTok = $143.000 USD
    • Costo dei token di output: 1.500 MTok * $25,00/MTok = $37.500 USD
    • Costo mensile: $143.000 + $37.500 = $180.500 USD
  • Costo stimato di Claude Opus 4.8

    • Costo dei token di input: 28.600 MTok * $5,00/MTok = $143.000 USD
    • Costo dei token di output: 1.500 MTok * $25,00/MTok = $37.500 USD
    • Costo mensile: $143.000 + $37.500 = $180.500 USD

Costruisci un prompt solido

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

def moderate_message(message, unsafe_categories):
    # Converti le 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"""
    Determine whether the following message warrants moderation,
    based on the unsafe categories outlined below.

    Message:
    <message>{message}</message>

    Unsafe Categories:
    <categories>
    {unsafe_category_str}
    </categories>

    Respond with ONLY a JSON object, using the format below:
    {{
    "violation": <Boolean field denoting whether the message should be moderated>,
    "categories": [Comma-separated list of violated categories],
    "explanation": [Optional. Only include if there is a violation.]
    }}
Do not include markdown formatting or code fences in your response."""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Using the Haiku model for lower costs
        max_tokens=200,
        messages=[{"role": "user", "content": assessment_prompt}],
    )

    # Analizza la risposta JSON di Claude
    text_block = next(block for block in response.content if block.type == "text")
    assessment = json.loads(text_block.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"\nComment: {comment}")
    violation, violated_categories, explanation = moderate_message(
        comment, unsafe_categories
    )

    if violation:
        print(f"Violated Categories: {', '.join(violated_categories)}")
        print(f"Explanation: {explanation}")
    else:
        print("No issues detected.")

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

La valutazione del modello viene quindi analizzata per determinare se vi sia una violazione. In caso di violazione, Claude restituisce anche un elenco delle categorie violate e una spiegazione del motivo per cui il messaggio non è sicuro.

Valuta il tuo prompt

La moderazione dei contenuti è un problema di classificazione. Pertanto, puoi usare le stesse tecniche descritte nel cookbook sulla 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, puoi creare più categorie per rappresentare vari livelli di rischio. Creare più livelli di rischio ti consente di regolare l'aggressività della moderazione. Ad esempio, potresti voler bloccare automaticamente le query degli utenti ritenute ad alto rischio, mentre gli utenti con molte query a rischio medio vengono segnalati per una revisione umana.

def assess_risk_level(message, unsafe_categories):
    # Converti le 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"""
    Assess the risk level of the following message,
    based on the unsafe categories listed below.

Message:
<message>{message}</message>

Unsafe Categories:
<categories>
{unsafe_category_str}
</categories>

Assign a risk level based on your confidence that the user's message should be moderated
based on the defined unsafe categories:

0 - No risk
1 - Low risk
2 - Medium risk
3 - High risk

Respond with ONLY a JSON object, using the format below:
{{
  "risk_level": <Numerical field denoting the risk level>,
  "categories": [Comma-separated list of violated categories],
  "explanation": <Optional. Only include if risk level is greater than 0>
}}
Do not include markdown formatting or code fences in your response."""

    # Invia la richiesta a Claude per la valutazione del rischio
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Using the Haiku model for lower costs
        max_tokens=200,
        messages=[{"role": "user", "content": assessment_prompt}],
    )

    # Analizza la risposta JSON di Claude
    text_block = next(block for block in response.content if block.type == "text")
    assessment = json.loads(text_block.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"\nComment: {comment}")
    risk_level, violated_categories, explanation = assess_risk_level(
        comment, unsafe_categories
    )

    print(f"Risk Level: {risk_level}")
    if violated_categories:
        print(f"Violated Categories: {', '.join(violated_categories)}")
    if explanation:
        print(f"Explanation: {explanation}")

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

All'interno della funzione viene generato un prompt per Claude, che include il messaggio da valutare, le categorie non sicure e istruzioni specifiche per la valutazione del 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 facoltativa.

Questo approccio consente una moderazione dei contenuti flessibile tramite l'assegnazione di livelli di rischio. Può essere integrato senza difficoltà in un sistema più ampio per automatizzare il filtraggio dei contenuti o segnalare commenti per la revisione umana in base al livello di rischio valutato. Ad esempio, eseguendo questo codice, il commento Delete this post now or you better hide. I am coming after you and your family. viene identificato come ad alto rischio a causa della sua pericolosa minaccia. Al contrario, il commento Stay away from the 5G cellphones!! They are using 5G to control you. viene classificato come a rischio medio.

Distribuisci il tuo prompt

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

  1. Fornisci un feedback chiaro agli utenti: quando l'input di un 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 precedenti, ciò avviene tramite il campo 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 usando metriche come il monitoraggio di precision e recall. Usa questi dati per perfezionare in modo iterativo i tuoi prompt di moderazione, le parole chiave e i criteri di valutazione.


Migliora le prestazioni

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

Definisci gli argomenti e fornisci esempi

Oltre a elencare le categorie non sicure nel prompt, è possibile ottenere ulteriori miglioramenti fornendo definizioni e frasi relative a ciascuna categoria.

# Categorie considerate non sicure per la moderazione dei contenuti, con le relative definizioni
unsafe_category_definitions = {
    "Child Exploitation": "Content that depicts child nudity or that enables, encourages, excuses, or depicts the sexual abuse of children.",
    "Conspiracy Theories": """Content that promotes or endorses unfounded, false, or misleading theories about events, situations, or individuals,
        which can incite harm or undermine public trust in institutions or facts.""",
    "Hate": """Content that is hateful toward people on the basis of their protected characteristics
        (race, color, ethnicity, national origin, disability, religious affiliation, caste, sexual orientation, sex, gender identity and serious disease),
        or content that perpetuates negative stereotypes.""",
    "Indiscriminate Weapons": "Content that enables the creation of weapons of mass destruction.",
    "Intellectual Property": "Content that violates the intellectual property rights of third parties.",
    "Non-Violent Crimes": "Content that enables, encourages, or excuses the commission of non-violent crimes.",
    "Privacy": "Content that contains sensitive, personal information about private individuals.",
    "Self-Harm": "Content that enables, encourages, or excuses acts of intentional self-harm.",
    "Sex Crimes": "Content that enables, encourages, or excuses the commission of sex crimes.",
    "Sexual Content": "Content that contains erotic descriptions or explicit depictions of sex acts.",
    "Specialized Advice": """Content that contains financial, medical, or legal advice.
        Financial advice includes guidance on investments, stocks, bonds, or any financial planning.""",
    "Violent Crimes": "Content that enables, encourages, or excuses the commission of violent crimes.",
}


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"""Determine whether the following message warrants moderation, based on the unsafe categories outlined below.

Message:
<message>{message}</message>

Unsafe Categories and Their Definitions:
<categories>
{unsafe_category_str}
</categories>

It's important that you remember all unsafe categories and their definitions.

Respond with ONLY a JSON object, using the format below:
{{
  "violation": <Boolean field denoting whether the message should be moderated>,
  "categories": [Comma-separated list of violated categories],
  "explanation": [Optional. Only include if there is a violation.]
}}
Do not include markdown formatting or code fences in your response."""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Using the Haiku model for lower costs
        max_tokens=200,
        messages=[{"role": "user", "content": assessment_prompt}],
    )

    # Analizza la risposta JSON di Claude
    text_block = next(block for block in response.content if block.type == "text")
    assessment = json.loads(text_block.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"\nComment: {comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(
        comment, unsafe_category_definitions
    )

    if violation:
        print(f"Violated Categories: {', '.join(violated_categories)}")
        print(f"Explanation: {explanation}")
    else:
        print("No issues detected.")

La funzione moderate_message_with_definitions estende la precedente funzione moderate_message consentendo di associare a ciascuna categoria non sicura una definizione dettagliata. Nel codice ciò avviene sostituendo la raccolta unsafe_categories della funzione originale con una mappatura unsafe_category_definitions. Questa mappatura associa ciascuna categoria non sicura alla definizione corrispondente. Sia i nomi delle categorie sia le loro definizioni sono inclusi nel prompt.

In particolare, la definizione della categoria Specialized Advice ora specifica i tipi di consulenza finanziaria che dovrebbero essere vietati. Di conseguenza, il commento It is a great time to invest in gold!, che in precedenza superava la valutazione di moderate_message, ora genera 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 debbano essere moderati.

def batch_moderate_messages(messages, unsafe_categories):
    # Converti le 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 simil-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"""Determine the messages to moderate, based on the unsafe categories outlined below.

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

Unsafe Categories:
<categories>
{unsafe_category_str}
</categories>

Respond with ONLY a JSON object, using the format below:
{{
  "violations": [
    {{
      "id": <message id>,
      "categories": [list of violated categories],
      "explanation": <Explanation of why there's a violation>
    }}
  ]
}}

Important Notes:
- Remember to analyze every message for a violation.
- Select any number of violations that reasonably apply.
- Do not include markdown formatting or code fences in your response."""

    # Invia la richiesta a Claude per la moderazione dei contenuti
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Using the Haiku model for lower costs
        max_tokens=2048,  # Increased max token count to handle batches
        messages=[{"role": "user", "content": assessment_prompt}],
    )

    # Analizza la risposta JSON di Claude
    text_block = next(block for block in response.content if block.type == "text")
    assessment = json.loads(text_block.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"""Comment: {user_comments[violation["id"]]}
Violated Categories: {", ".join(violation["categories"])}
Explanation: {violation["explanation"]}
""")

In questo esempio, la funzione batch_moderate_messages gestisce la moderazione di un intero batch di messaggi con una singola chiamata all'API di Claude. All'interno della funzione viene creato un prompt che include l'elenco dei messaggi da valutare e le categorie di contenuti non sicuri. Il prompt indica a Claude di restituire un oggetto JSON che elenca tutti i messaggi contenenti violazioni. Ogni messaggio nella risposta è identificato dal suo id, che corrisponde alla posizione del messaggio nel batch. Tieni presente che trovare la dimensione ottimale del batch per le tue esigenze specifiche potrebbe richiedere qualche sperimentazione. Sebbene batch di dimensioni maggiori possano ridurre i costi, potrebbero anche comportare una leggera diminuzione della qualità. Inoltre, potrebbe essere necessario aumentare il parametro max_tokens nella chiamata all'API di Claude per gestire risposte più lunghe. Per i dettagli sul numero massimo di token che il modello scelto può produrre in output, consulta la tabella di confronto dei modelli.

Visualizza un esempio di codice completamente implementato su come usare Claude per la moderazione dei contenuti.

Esplora le tecniche di guardrail per moderare le interazioni con Claude.

Was this page helpful?