Moderação de conteúdo
A moderação de conteúdo é um aspecto crítico para manter um ambiente seguro, respeitoso e produtivo em aplicações digitais. Este guia discute como o Claude pode ser usado para moderar conteúdo dentro da sua aplicação digital.
Visite o cookbook de moderação de conteúdo para ver um exemplo de implementação de moderação de conteúdo usando o Claude.
Antes de construir com o Claude
Decida se deve usar o Claude para moderação de conteúdo
Aqui estão alguns indicadores-chave de que você deve usar um "large language model" (modelo de linguagem grande), ou LLM, como o Claude em vez de uma abordagem tradicional de ML ou baseada em regras para moderação de conteúdo:
Gere exemplos de conteúdo para moderar
Antes de desenvolver uma solução de moderação de conteúdo, primeiro crie exemplos de conteúdo que deve ser sinalizado e conteúdo que não deve ser sinalizado. Certifique-se de incluir casos extremos e cenários desafiadores que podem ser difíceis para um sistema de moderação de conteúdo lidar de forma eficaz. Depois, revise seus exemplos para criar uma lista bem definida de categorias de moderação. Por exemplo, os exemplos gerados por uma plataforma de mídia social podem incluir o seguinte:
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!",
]
# Comentários de usuários de exemplo para testar a moderação de conteúdo
user_comments = allowed_user_comments + disallowed_user_comments
# Categorias consideradas inseguras para moderação de conteúdo
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",
]Moderar esses exemplos de forma eficaz exige uma compreensão sutil da linguagem. No comentário This movie was great, I really enjoyed it. The main actor really killed it!, o sistema de moderação de conteúdo precisa reconhecer que "killed it" é uma metáfora, não uma indicação de violência real. Por outro lado, apesar da ausência de menções explícitas à violência, o comentário Delete this post now or you better hide. I am coming after you and your family. deve ser sinalizado pelo sistema de moderação de conteúdo.
As categorias inseguras podem ser personalizadas para atender às suas necessidades específicas. Por exemplo, se você deseja impedir que menores criem conteúdo em seu site, você pode adicionar "Underage Posting" às categorias.
Como moderar conteúdo usando o Claude
Selecione o modelo Claude certo
Ao selecionar um modelo, é importante considerar o tamanho dos seus dados. Se os custos forem uma preocupação, um modelo menor como o Claude Haiku 4.5 é uma excelente escolha devido ao seu custo-benefício. A seguir está uma estimativa do custo para moderar texto em uma plataforma de mídia social que recebe um bilhão de posts por mês:
-
Tamanho do conteúdo
- Posts por mês: 1 bilhão
- Caracteres por post: 100
- Total de caracteres: 100 bilhões
-
Tokens estimados
- Tokens de entrada: 28,6 bilhões (assumindo 1 token a cada 3,5 caracteres)
- Porcentagem de mensagens sinalizadas: 3%
- Tokens de saída por mensagem sinalizada: 50
- Total de tokens de saída: 1,5 bilhão
-
Custo estimado do Claude Haiku 4.5
- Custo de tokens de entrada: 28.600 MTok * $1,00/MTok = $28.600 USD
- Custo de tokens de saída: 1.500 MTok * $5,00/MTok = $7.500 USD
- Custo mensal: $28.600 + $7.500 = $36.100 USD
-
Custo estimado do Claude Opus 5
- Custo de tokens de entrada: 28.600 MTok * $5,00/MTok = $143.000 USD
- Custo de tokens de saída: 1.500 MTok * $25,00/MTok = $37.500 USD
- Custo mensal: $143.000 + $37.500 = $180.500 USD
-
Custo estimado do Claude Opus 4.8
- Custo de tokens de entrada: 28.600 MTok * $5,00/MTok = $143.000 USD
- Custo de tokens de saída: 1.500 MTok * $25,00/MTok = $37.500 USD
- Custo mensal: $143.000 + $37.500 = $180.500 USD
Construa um prompt forte
Para usar o Claude para moderação de conteúdo, o Claude deve entender os requisitos de moderação da sua aplicação. Comece escrevendo um prompt que permita definir suas necessidades de moderação:
def moderate_message(message, unsafe_categories):
# Converte as categorias inseguras em uma string, com cada categoria em uma nova linha
unsafe_category_str = "\n".join(unsafe_categories)
# Constrói o prompt para o Claude, incluindo a mensagem e as categorias inseguras
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."""
# Envia a solicitação ao Claude para moderação de conteúdo
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}],
)
# Analisa a resposta JSON do Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Extrai o status de violação da avaliação
contains_violation = assessment["violation"]
# Se houver violação, obtém as categorias e a explicação; caso contrário, usa padrões vazios
violated_categories = assessment.get("categories", []) if contains_violation else []
explanation = assessment.get("explanation") if contains_violation else None
return contains_violation, violated_categories, explanation
# Processa cada comentário e imprime os resultados
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.")Neste exemplo, a função moderate_message contém um prompt de avaliação que inclui as categorias de conteúdo inseguro e a mensagem a ser avaliada. O prompt pede ao Claude que avalie se a mensagem deve ser moderada, com base nas categorias inseguras que você definiu anteriormente.
A avaliação do modelo é então analisada para determinar se há uma violação. Se houver uma violação, o Claude também retorna uma lista das categorias violadas e uma explicação sobre por que a mensagem é insegura.
Avalie seu prompt
A moderação de conteúdo é um problema de classificação. Assim, você pode usar as mesmas técnicas descritas no cookbook de classificação para determinar a precisão do seu sistema de moderação de conteúdo.
Uma consideração adicional é que, em vez de tratar a moderação de conteúdo como um problema de classificação binária, você pode criar múltiplas categorias para representar vários níveis de risco. Criar múltiplos níveis de risco permite ajustar a agressividade da sua moderação. Por exemplo, você pode querer bloquear automaticamente consultas de usuários consideradas de alto risco, enquanto usuários com muitas consultas de risco médio são sinalizados para revisão humana.
def assess_risk_level(message, unsafe_categories):
# Converte as categorias inseguras em uma string, com cada categoria em uma nova linha
unsafe_category_str = "\n".join(unsafe_categories)
# Constrói o prompt para o Claude, incluindo a mensagem, as categorias inseguras e as definições de nível de risco
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."""
# Envia a solicitação ao Claude para avaliação de risco
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}],
)
# Analisa a resposta JSON do Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Extrai o nível de risco, as categorias violadas e a explicação da avaliação
risk_level = assessment["risk_level"]
violated_categories = assessment["categories"]
explanation = assessment.get("explanation")
return risk_level, violated_categories, explanation
# Processa cada comentário e imprime os resultados
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}")Este código implementa uma função assess_risk_level que usa o Claude para avaliar o nível de risco de uma mensagem. A função aceita uma mensagem e as categorias inseguras como entradas.
Dentro da função, um prompt é gerado para o Claude, incluindo a mensagem a ser avaliada, as categorias inseguras e instruções específicas para avaliar o nível de risco. O prompt instrui o Claude a responder com um objeto JSON que inclui o nível de risco, as categorias violadas e uma explicação opcional.
Essa abordagem permite uma moderação de conteúdo flexível ao atribuir níveis de risco. Ela pode ser integrada perfeitamente a um sistema maior para automatizar a filtragem de conteúdo ou sinalizar comentários para revisão humana com base no nível de risco avaliado. Por exemplo, ao executar este código, o comentário Delete this post now or you better hide. I am coming after you and your family. é identificado como de alto risco devido à sua ameaça perigosa. Por outro lado, o comentário Stay away from the 5G cellphones!! They are using 5G to control you. é categorizado como de risco médio.
Implante seu prompt
Quando você estiver confiante na qualidade da sua solução, é hora de implantá-la em produção. Aqui estão algumas práticas recomendadas a seguir ao usar moderação de conteúdo em produção:
-
Forneça feedback claro aos usuários: Quando a entrada do usuário é bloqueada ou uma resposta é sinalizada devido à moderação de conteúdo, forneça feedback informativo e construtivo para ajudar os usuários a entender por que sua mensagem foi sinalizada e como podem reformulá-la adequadamente. Nos exemplos de código anteriores, isso é feito por meio do campo
explanationna resposta do Claude. -
Analise o conteúdo moderado: Acompanhe os tipos de conteúdo sendo sinalizados pelo seu sistema de moderação para identificar tendências e possíveis áreas de melhoria.
-
Avalie e melhore continuamente: Avalie regularmente o desempenho do seu sistema de moderação de conteúdo usando métricas como acompanhamento de precisão e recall. Use esses dados para refinar iterativamente seus prompts de moderação, palavras-chave e critérios de avaliação.
Melhore o desempenho
Em cenários complexos, pode ser útil considerar estratégias adicionais para melhorar o desempenho além das técnicas de engenharia de prompt padrão. Aqui estão algumas estratégias avançadas:
Defina tópicos e forneça exemplos
Além de listar as categorias inseguras no prompt, melhorias adicionais podem ser feitas fornecendo definições e frases relacionadas a cada categoria.
# Categorias consideradas inseguras para moderação de conteúdo, com suas definições
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):
# Formata a string de categorias inseguras, com cada categoria e sua definição em uma nova linha
unsafe_category_str = "\n".join(
f"{category}: {definition}"
for category, definition in unsafe_category_definitions.items()
)
# Constrói o prompt para o Claude, incluindo a mensagem e as categorias inseguras
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."""
# Envia a solicitação ao Claude para moderação de conteúdo
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}],
)
# Analisa a resposta JSON do Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Extrai o status de violação da avaliação
contains_violation = assessment["violation"]
# Se houver violação, obtém as categorias e a explicação; caso contrário, usa padrões vazios
violated_categories = assessment.get("categories", []) if contains_violation else []
explanation = assessment.get("explanation") if contains_violation else None
return contains_violation, violated_categories, explanation
# Processa cada comentário e imprime os resultados
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.")A função moderate_message_with_definitions expande a função anterior moderate_message ao permitir que cada categoria insegura seja associada a uma definição detalhada. Isso ocorre no código substituindo a coleção unsafe_categories da função original por um mapeamento unsafe_category_definitions. Esse mapeamento associa cada categoria insegura à sua definição correspondente. Tanto os nomes das categorias quanto suas definições são incluídos no prompt.
Notavelmente, a definição da categoria Specialized Advice agora especifica os tipos de aconselhamento financeiro que devem ser proibidos. Como resultado, o comentário It is a great time to invest in gold!, que anteriormente passava na avaliação de moderate_message, agora aciona uma violação.
Considere o processamento em lote
Para reduzir custos em situações onde a moderação em tempo real não é necessária, considere moderar mensagens em lotes. Inclua múltiplas mensagens dentro do contexto do prompt e peça ao Claude que avalie quais mensagens devem ser moderadas.
def batch_moderate_messages(messages, unsafe_categories):
# Converte as categorias inseguras em uma string, com cada categoria em uma nova linha
unsafe_category_str = "\n".join(unsafe_categories)
# Formata a string de mensagens, com cada mensagem envolvida em tags estilo XML e com um ID
messages_str = "\n".join(
[f"<message id={idx}>{msg}</message>" for idx, msg in enumerate(messages)]
)
# Constrói o prompt para o Claude, incluindo as mensagens e as categorias inseguras
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."""
# Envia a solicitação ao Claude para moderação de conteúdo
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}],
)
# Analisa a resposta JSON do Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
return assessment
# Processa o lote de comentários e obtém a resposta
response_obj = batch_moderate_messages(user_comments, unsafe_categories)
# Imprime os resultados para cada violação detectada
for violation in response_obj["violations"]:
print(f"""Comment: {user_comments[violation["id"]]}
Violated Categories: {", ".join(violation["categories"])}
Explanation: {violation["explanation"]}
""")Neste exemplo, a função batch_moderate_messages lida com a moderação de um lote inteiro de mensagens com uma única chamada à API do Claude.
Dentro da função, é criado um prompt que inclui a lista de mensagens a serem avaliadas e as categorias de conteúdo inseguro. O prompt orienta o Claude a retornar um objeto JSON listando todas as mensagens que contêm violações. Cada mensagem na resposta é identificada pelo seu id, que corresponde à posição da mensagem no lote.
Tenha em mente que encontrar o tamanho de lote ideal para suas necessidades específicas pode exigir alguma experimentação. Embora tamanhos de lote maiores possam reduzir custos, eles também podem levar a uma leve diminuição na qualidade. Além disso, você pode precisar aumentar o parâmetro max_tokens na chamada à API do Claude para acomodar respostas mais longas. Para detalhes sobre o número máximo de tokens que o modelo escolhido pode gerar, consulte a tabela de comparação de modelos.
Veja um exemplo totalmente implementado baseado em código de como usar o Claude para moderação de conteúdo.
Explore técnicas de proteção para moderar interações com o Claude.
Was this page helpful?