Besuchen Sie unser Inhaltsmoderationshandbuch, um ein Beispiel für die Implementierung der Inhaltsmoderation mit Claude zu sehen.

Dieser Leitfaden konzentriert sich auf die Moderation von nutzergenerierten Inhalten innerhalb Ihrer Anwendung. Wenn Sie Anleitungen zur Moderation von Interaktionen mit Claude suchen, lesen Sie bitte unseren Leitfaden zu Leitplanken.

Vor dem Aufbau mit Claude

Entscheiden Sie, ob Sie Claude für die Inhaltsmoderation verwenden möchten

Hier sind einige wichtige Indikatoren dafür, dass Sie ein LLM wie Claude anstelle eines traditionellen ML- oder regelbasierten Ansatzes für die Inhaltsmoderation verwenden sollten:

Anthropic hat alle Claude-Modelle darauf trainiert, ehrlich, hilfreich und harmlos zu sein. Dies kann dazu führen, dass Claude Inhalte moderiert, die als besonders gefährlich eingestuft werden (im Einklang mit unserer Richtlinie zur akzeptablen Nutzung), unabhängig vom verwendeten Prompt. Beispielsweise könnte eine Website für Erwachsene, die Nutzern erlauben möchte, explizite sexuelle Inhalte zu posten, feststellen, dass Claude explizite Inhalte trotzdem als moderationsbedürftig kennzeichnet, selbst wenn in ihrem Prompt angegeben wird, explizite sexuelle Inhalte nicht zu moderieren. Wir empfehlen, unsere AUP vor der Entwicklung einer Moderationslösung zu überprüfen.

Generieren Sie Beispiele für zu moderierende Inhalte

Bevor Sie eine Inhaltsmoderationsslösung entwickeln, erstellen Sie zunächst Beispiele für Inhalte, die gekennzeichnet werden sollten, und Inhalte, die nicht gekennzeichnet werden sollten. Stellen Sie sicher, dass Sie Grenzfälle und herausfordernde Szenarien einbeziehen, die für ein Inhaltsmoderationsystem schwierig zu handhaben sein könnten. Überprüfen Sie anschließend Ihre Beispiele, um eine klar definierte Liste von Moderationskategorien zu erstellen. Die von einer Social-Media-Plattform generierten Beispiele könnten beispielsweise Folgendes umfassen:

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!'
]

# Sample user comments to test the content moderation
user_comments = allowed_user_comments + disallowed_user_comments

# List of categories considered unsafe for content moderation
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'
]

Die effektive Moderation dieser Beispiele erfordert ein nuanciertes Sprachverständnis. In dem Kommentar This movie was great, I really enjoyed it. The main actor really killed it! muss das Inhaltsmoderationsystem erkennen, dass “killed it” eine Metapher ist und kein Hinweis auf tatsächliche Gewalt. Umgekehrt sollte der Kommentar Delete this post now or you better hide. I am coming after you and your family. trotz des Fehlens expliziter Gewalterwähnungen vom Inhaltsmoderationsystem gekennzeichnet werden.

Die Liste unsafe_categories kann an Ihre spezifischen Bedürfnisse angepasst werden. Wenn Sie beispielsweise verhindern möchten, dass Minderjährige Inhalte auf Ihrer Website erstellen, könnten Sie “Underage Posting” zur Liste hinzufügen.


Wie man Inhalte mit Claude moderiert

Wählen Sie das richtige Claude-Modell

Bei der Auswahl eines Modells ist es wichtig, die Größe Ihrer Daten zu berücksichtigen. Wenn Kosten ein Anliegen sind, ist ein kleineres Modell wie Claude Haiku 3 aufgrund seiner Kosteneffizienz eine ausgezeichnete Wahl. Nachfolgend finden Sie eine Schätzung der Kosten für die Moderation von Texten für eine Social-Media-Plattform, die eine Milliarde Beiträge pro Monat erhält:

  • Inhaltsgröße

    • Beiträge pro Monat: 1 Mrd.
    • Zeichen pro Beitrag: 100
    • Gesamtzeichen: 100 Mrd.
  • Geschätzte Tokens

    • Input-Tokens: 28,6 Mrd. (unter der Annahme von 1 Token pro 3,5 Zeichen)
    • Prozentsatz der gekennzeichneten Nachrichten: 3%
    • Output-Tokens pro gekennzeichneter Nachricht: 50
    • Gesamtzahl der Output-Tokens: 1,5 Mrd.
  • Claude Haiku 3 geschätzte Kosten

    • Kosten für Input-Tokens: 2.860 MTok * 0,25 /MTok=715/MTok = 715
    • Kosten für Output-Tokens: 1.500 MTok * 1,25 /MTok=1.875/MTok = 1.875
    • Monatliche Kosten: 715 +1.875+ 1.875 = 2.590 $
  • Claude Sonnet 4 geschätzte Kosten

    • Kosten für Input-Tokens: 2.860 MTok * 3,00 /MTok=8.580/MTok = 8.580
    • Kosten für Output-Tokens: 1.500 MTok * 15,00 /MTok=22.500/MTok = 22.500
    • Monatliche Kosten: 8.580 +22.500+ 22.500 = 31.080 $
Die tatsächlichen Kosten können von diesen Schätzungen abweichen. Diese Schätzungen basieren auf dem Prompt, der im Abschnitt zur Stapelverarbeitung hervorgehoben wird. Die Output-Tokens können noch weiter reduziert werden, indem das Feld explanation aus der Antwort entfernt wird.

Erstellen Sie einen starken Prompt

Um Claude für die Inhaltsmoderation zu verwenden, muss Claude die Moderationsanforderungen Ihrer Anwendung verstehen. Beginnen wir mit dem Schreiben eines Prompts, mit dem Sie Ihre Moderationsbedürfnisse definieren können:

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construct the prompt for Claude, including the message and unsafe categories
    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.]
    }}"""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the violation status from the assessment
    contains_violation = assessment['violation']
    
    # If there's a violation, get the categories and explanation; otherwise, use empty defaults
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation

# Process each comment and print the results
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 diesem Beispiel enthält die Funktion moderate_message einen Bewertungsprompt, der die unsicheren Inhaltskategorien und die Nachricht, die wir bewerten möchten, enthält. Der Prompt fordert Claude auf, zu beurteilen, ob die Nachricht moderiert werden sollte, basierend auf den von uns definierten unsicheren Kategorien.

Die Bewertung des Modells wird dann analysiert, um festzustellen, ob ein Verstoß vorliegt. Wenn ein Verstoß vorliegt, gibt Claude auch eine Liste der verletzten Kategorien sowie eine Erklärung zurück, warum die Nachricht unsicher ist.

Bewerten Sie Ihren Prompt

Inhaltsmoderation ist ein Klassifikationsproblem. Daher können Sie die gleichen Techniken verwenden, die in unserem Klassifikationshandbuch beschrieben sind, um die Genauigkeit Ihres Inhaltsmoderationsystems zu bestimmen.

Eine zusätzliche Überlegung ist, dass Sie die Inhaltsmoderation nicht als binäres Klassifikationsproblem behandeln, sondern stattdessen mehrere Kategorien erstellen können, um verschiedene Risikoniveaus darzustellen. Die Erstellung mehrerer Risikoniveaus ermöglicht es Ihnen, die Aggressivität Ihrer Moderation anzupassen. Beispielsweise möchten Sie möglicherweise Benutzeranfragen, die als hochriskant eingestuft werden, automatisch blockieren, während Benutzer mit vielen mittelriskanten Anfragen für eine manuelle Überprüfung gekennzeichnet werden.

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construct the prompt for Claude, including the message, unsafe categories, and risk level definitions
    assessment_prompt = f"""
    Assess the risk level of the following message warrants moderation, 
    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>
}}"""

    # Send the request to Claude for risk assessment
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the risk level, violated categories, and explanation from the assessment
    risk_level = assessment["risk_level"]
    violated_categories = assessment["categories"]
    explanation = assessment.get("explanation")
    
    return risk_level, violated_categories, explanation

# Process each comment and print the results
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}")

Dieser Code implementiert eine Funktion assess_risk_level, die Claude verwendet, um das Risikoniveau einer Nachricht zu bewerten. Die Funktion akzeptiert eine Nachricht und eine Liste unsicherer Kategorien als Eingaben.

Innerhalb der Funktion wird ein Prompt für Claude generiert, der die zu bewertende Nachricht, die unsicheren Kategorien und spezifische Anweisungen zur Bewertung des Risikoniveaus enthält. Der Prompt weist Claude an, mit einem JSON-Objekt zu antworten, das das Risikoniveau, die verletzten Kategorien und eine optionale Erklärung enthält.

Dieser Ansatz ermöglicht eine flexible Inhaltsmoderation durch Zuweisung von Risikoniveaus. Er kann nahtlos in ein größeres System integriert werden, um die Inhaltsfilterung zu automatisieren oder Kommentare basierend auf ihrem bewerteten Risikoniveau für eine manuelle Überprüfung zu kennzeichnen. Beispielsweise wird bei der Ausführung dieses Codes der Kommentar Delete this post now or you better hide. I am coming after you and your family. aufgrund seiner gefährlichen Drohung als hochriskant eingestuft. Im Gegensatz dazu wird der Kommentar Stay away from the 5G cellphones!! They are using 5G to control you. als mittelriskant eingestuft.

Setzen Sie Ihren Prompt ein

Sobald Sie von der Qualität Ihrer Lösung überzeugt sind, ist es Zeit, sie in die Produktion zu bringen. Hier sind einige Best Practices, die Sie bei der Verwendung von Inhaltsmoderation in der Produktion befolgen sollten:

  1. Geben Sie den Benutzern klares Feedback: Wenn Benutzereingaben blockiert oder eine Antwort aufgrund von Inhaltsmoderation gekennzeichnet wird, geben Sie informatives und konstruktives Feedback, um den Benutzern zu helfen, zu verstehen, warum ihre Nachricht gekennzeichnet wurde und wie sie sie angemessen umformulieren können. In den obigen Codebeispielen geschieht dies durch das Tag explanation in der Claude-Antwort.

  2. Analysieren Sie moderierte Inhalte: Verfolgen Sie die Arten von Inhalten, die von Ihrem Moderationssystem gekennzeichnet werden, um Trends und potenzielle Verbesserungsbereiche zu identifizieren.

  3. Kontinuierliche Bewertung und Verbesserung: Bewerten Sie regelmäßig die Leistung Ihres Inhaltsmoderationsystems anhand von Metriken wie Präzision und Recall-Tracking. Verwenden Sie diese Daten, um Ihre Moderationsprompts, Schlüsselwörter und Bewertungskriterien iterativ zu verfeinern.


Leistung verbessern

In komplexen Szenarien kann es hilfreich sein, zusätzliche Strategien zur Leistungsverbesserung über die Standard-Prompt-Engineering-Techniken hinaus zu berücksichtigen. Hier sind einige fortgeschrittene Strategien:

Themen definieren und Beispiele bereitstellen

Zusätzlich zur Auflistung der unsicheren Kategorien im Prompt können weitere Verbesserungen erzielt werden, indem Definitionen und Phrasen zu jeder Kategorie bereitgestellt werden.

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

# Dictionary of categories considered unsafe for content moderation, with their definitions
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):
    # Format unsafe categories string, with each category and its definition on a new line
    unsafe_category_str = '\n'.join(f'{category}: {definition}' 
        for category, definition in unsafe_category_definitions.items()
    )
    
    # Construct the prompt for Claude, including the message and unsafe categories
    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.]
}}"""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the violation status from the assessment
    contains_violation = assessment['violation']
    
    # If there's a violation, get the categories and explanation; otherwise, use empty defaults
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation


# Process each comment and print the results
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.")

Die Funktion moderate_message_with_definitions erweitert die frühere Funktion moderate_message, indem sie es ermöglicht, jede unsichere Kategorie mit einer detaillierten Definition zu koppeln. Dies geschieht im Code, indem die Liste unsafe_categories aus der ursprünglichen Funktion durch ein Wörterbuch unsafe_category_definitions ersetzt wird. Dieses Wörterbuch ordnet jeder unsicheren Kategorie ihre entsprechende Definition zu. Sowohl die Kategorienamen als auch ihre Definitionen sind im Prompt enthalten.

Bemerkenswert ist, dass die Definition für die Kategorie Specialized Advice nun die Arten von Finanzberatung spezifiziert, die verboten sein sollten. Infolgedessen löst der Kommentar It's a great time to invest in gold!, der zuvor die Bewertung von moderate_message bestanden hat, jetzt einen Verstoß aus.

Erwägen Sie die Stapelverarbeitung

Um Kosten in Situationen zu senken, in denen keine Echtzeitmoderation erforderlich ist, erwägen Sie die Moderation von Nachrichten in Stapeln. Fügen Sie mehrere Nachrichten in den Kontext des Prompts ein und bitten Sie Claude zu beurteilen, welche Nachrichten moderiert werden sollten.

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

def batch_moderate_messages(messages, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Format messages string, with each message wrapped in XML-like tags and given an ID
    messages_str = '\n'.join([f'<message id={idx}>{msg}</message>' for idx, msg in enumerate(messages)])
    
    # Construct the prompt for Claude, including the messages and unsafe categories
    assessment_prompt = f"""Determine the messages to moderate, based on the unsafe categories outlined below.

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

Unsafe categories and their definitions:
<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."""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=2048,  # Increased max token count to handle batches
        temperature=0,    # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    return assessment


# Process the batch of comments and get the response
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# Print the results for each detected violation
for violation in response_obj['violations']:
    print(f"""Comment: {user_comments[violation['id']]}
Violated Categories: {', '.join(violation['categories'])}
Explanation: {violation['explanation']}
""")

In diesem Beispiel behandelt die Funktion batch_moderate_messages die Moderation eines gesamten Stapels von Nachrichten mit einem einzigen Claude API-Aufruf. Innerhalb der Funktion wird ein Prompt erstellt, der die Liste der zu bewertenden Nachrichten, die definierten unsicheren Inhaltskategorien und ihre Beschreibungen enthält. Der Prompt weist Claude an, ein JSON-Objekt zurückzugeben, das alle Nachrichten auflistet, die Verstöße enthalten. Jede Nachricht in der Antwort wird durch ihre ID identifiziert, die der Position der Nachricht in der Eingabeliste entspricht. Beachten Sie, dass das Finden der optimalen Stapelgröße für Ihre spezifischen Bedürfnisse einige Experimente erfordern kann. Während größere Stapelgrößen die Kosten senken können, können sie auch zu einer leichten Qualitätsminderung führen. Zusätzlich müssen Sie möglicherweise den Parameter max_tokens im Claude API-Aufruf erhöhen, um längere Antworten zu ermöglichen. Einzelheiten zur maximalen Anzahl von Tokens, die Ihr gewähltes Modell ausgeben kann, finden Sie auf der Modellvergleichsseite.