Модерация контента
Модерация контента — это критически важный аспект поддержания безопасной, уважительной и продуктивной среды в цифровых приложениях. В этом руководстве рассматривается, как Claude можно использовать для модерации контента в вашем цифровом приложении.
Посетите cookbook по модерации контента, чтобы увидеть пример реализации модерации контента с использованием Claude.
Перед началом разработки с Claude
Решите, стоит ли использовать Claude для модерации контента
Вот несколько ключевых признаков того, что для «content moderation» (модерации контента) вам следует использовать «large language model» (большую языковую модель), или LLM, такую как Claude, вместо традиционного подхода на основе машинного обучения (ML) или правил:
Сгенерируйте примеры контента для модерации
Перед разработкой решения для модерации контента сначала создайте примеры контента, который должен быть помечен, и контента, который не должен быть помечен. Обязательно включите пограничные случаи и сложные сценарии, с которыми системе модерации контента может быть трудно эффективно справиться. После этого просмотрите свои примеры, чтобы составить чётко определённый список категорий модерации. Например, примеры, сгенерированные платформой социальных сетей, могут включать следующее:
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!",
]
# Примеры комментариев пользователей для проверки модерации контента
user_comments = allowed_user_comments + disallowed_user_comments
# Категории, считающиеся небезопасными для модерации контента
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",
]Эффективная модерация этих примеров требует тонкого понимания языка. В комментарии This movie was great, I really enjoyed it. The main actor really killed it! система модерации контента должна распознать, что «killed it» — это метафора, а не указание на реальное насилие. И наоборот, несмотря на отсутствие явных упоминаний насилия, комментарий Delete this post now or you better hide. I am coming after you and your family. должен быть помечен системой модерации контента.
Небезопасные категории можно настроить в соответствии с вашими конкретными потребностями. Например, если вы хотите запретить несовершеннолетним создавать контент на вашем сайте, вы можете добавить в список категорий «Underage Posting» (публикации несовершеннолетних).
Как модерировать контент с помощью Claude
Выберите подходящую модель Claude
При выборе модели важно учитывать объём ваших данных. Если затраты имеют значение, меньшая модель, такая как Claude Haiku 4.5, — отличный выбор благодаря своей экономичности. Ниже приведена оценка стоимости модерации текста для платформы социальных сетей, которая получает один миллиард публикаций в месяц:
-
Объём контента
- Публикаций в месяц: 1 млрд
- Символов в публикации: 100
- Всего символов: 100 млрд
-
Оценочное количество токенов
- Входные токены: 28,6 млрд (при условии 1 токен на 3,5 символа)
- Процент помеченных сообщений: 3%
- Выходных токенов на помеченное сообщение: 50
- Всего выходных токенов: 1,5 млрд
-
Оценочная стоимость Claude Haiku 4.5
- Стоимость входных токенов: 28 600 MTok * $1,00/MTok = $28 600 USD
- Стоимость выходных токенов: 1 500 MTok * $5,00/MTok = $7 500 USD
- Ежемесячная стоимость: $28 600 + $7 500 = $36 100 USD
-
Оценочная стоимость Claude Opus 5
- Стоимость входных токенов: 28 600 MTok * $5,00/MTok = $143 000 USD
- Стоимость выходных токенов: 1 500 MTok * $25,00/MTok = $37 500 USD
- Ежемесячная стоимость: $143 000 + $37 500 = $180 500 USD
-
Оценочная стоимость Claude Opus 4.8
- Стоимость входных токенов: 28 600 MTok * $5,00/MTok = $143 000 USD
- Стоимость выходных токенов: 1 500 MTok * $25,00/MTok = $37 500 USD
- Ежемесячная стоимость: $143 000 + $37 500 = $180 500 USD
Составьте сильную подсказку
Чтобы использовать Claude для модерации контента, Claude должен понимать требования к модерации в вашем приложении. Начните с написания «prompt» (подсказки), которая позволит вам определить ваши потребности в модерации:
def moderate_message(message, unsafe_categories):
# Преобразуем небезопасные категории в строку, каждая категория с новой строки
unsafe_category_str = "\n".join(unsafe_categories)
# Формируем подсказку для Claude, включая сообщение и небезопасные категории
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."""
# Отправляем запрос Claude для модерации контента
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}],
)
# Разбираем JSON-ответ от Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Извлекаем статус нарушения из оценки
contains_violation = assessment["violation"]
# Если есть нарушение, получаем категории и объяснение; иначе используем пустые значения по умолчанию
violated_categories = assessment.get("categories", []) if contains_violation else []
explanation = assessment.get("explanation") if contains_violation else None
return contains_violation, violated_categories, explanation
# Обрабатываем каждый комментарий и выводим результаты
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.")В этом примере функция moderate_message содержит оценочную подсказку, включающую категории небезопасного контента и сообщение для оценки. Подсказка просит Claude оценить, следует ли модерировать сообщение, на основе небезопасных категорий, которые вы определили ранее.
Затем оценка модели разбирается, чтобы определить, есть ли нарушение. Если нарушение есть, Claude также возвращает список нарушенных категорий и объяснение того, почему сообщение небезопасно.
Оцените вашу подсказку
Модерация контента — это задача классификации. Поэтому вы можете использовать те же методы, что описаны в cookbook по классификации, чтобы определить точность вашей системы модерации контента.
Ещё одно соображение: вместо того чтобы рассматривать модерацию контента как задачу бинарной классификации, вы можете создать несколько категорий, представляющих различные уровни риска. Создание нескольких уровней риска позволяет регулировать строгость вашей модерации. Например, вы можете автоматически блокировать пользовательские запросы, признанные высокорисковыми, а пользователей с большим количеством запросов среднего риска помечать для проверки человеком.
def assess_risk_level(message, unsafe_categories):
# Преобразуем небезопасные категории в строку, каждая категория с новой строки
unsafe_category_str = "\n".join(unsafe_categories)
# Формируем подсказку для Claude, включая сообщение, небезопасные категории и определения уровней риска
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."""
# Отправляем запрос Claude для оценки риска
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}],
)
# Разбираем JSON-ответ от Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Извлекаем уровень риска, нарушенные категории и объяснение из оценки
risk_level = assessment["risk_level"]
violated_categories = assessment["categories"]
explanation = assessment.get("explanation")
return risk_level, violated_categories, explanation
# Обрабатываем каждый комментарий и выводим результаты
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}")Этот код реализует функцию assess_risk_level, которая использует Claude для оценки уровня риска сообщения. Функция принимает на вход сообщение и небезопасные категории.
Внутри функции для Claude генерируется подсказка, включающая сообщение для оценки, небезопасные категории и конкретные инструкции по оценке уровня риска. Подсказка предписывает Claude ответить JSON-объектом, который включает уровень риска, нарушенные категории и необязательное объяснение.
Такой подход обеспечивает гибкую модерацию контента за счёт присвоения уровней риска. Его можно легко интегрировать в более крупную систему для автоматической фильтрации контента или пометки комментариев для проверки человеком на основе оценённого уровня риска. Например, при выполнении этого кода комментарий 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. относится к категории среднего риска.
Разверните вашу подсказку
Когда вы будете уверены в качестве своего решения, настанет время развернуть его в продакшене. Вот несколько лучших практик, которым стоит следовать при использовании модерации контента в продакшене:
-
Предоставляйте пользователям понятную обратную связь: когда пользовательский ввод блокируется или ответ помечается в результате модерации контента, предоставляйте информативную и конструктивную обратную связь, чтобы помочь пользователям понять, почему их сообщение было помечено и как они могут переформулировать его надлежащим образом. В приведённых выше примерах кода это делается через поле
explanationв ответе Claude. -
Анализируйте модерируемый контент: отслеживайте типы контента, помечаемого вашей системой модерации, чтобы выявлять тенденции и потенциальные области для улучшения.
-
Постоянно оценивайте и улучшайте: регулярно оценивайте производительность вашей системы модерации контента с помощью таких метрик, как отслеживание точности (precision) и полноты (recall). Используйте эти данные для итеративного уточнения ваших подсказок для модерации, ключевых слов и критериев оценки.
Повышение производительности
В сложных сценариях может быть полезно рассмотреть дополнительные стратегии повышения производительности помимо стандартных методов «prompt engineering» (инженерии подсказок). Вот несколько продвинутых стратегий:
Определите темы и приведите примеры
Помимо перечисления небезопасных категорий в подсказке, дальнейших улучшений можно добиться, предоставив определения и фразы, относящиеся к каждой категории.
# Категории, считающиеся небезопасными для модерации контента, с их определениями
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):
# Форматируем строку небезопасных категорий: каждая категория и её определение с новой строки
unsafe_category_str = "\n".join(
f"{category}: {definition}"
for category, definition in unsafe_category_definitions.items()
)
# Формируем подсказку для Claude, включая сообщение и небезопасные категории
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."""
# Отправляем запрос Claude для модерации контента
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}],
)
# Разбираем JSON-ответ от Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
# Извлекаем статус нарушения из оценки
contains_violation = assessment["violation"]
# Если есть нарушение, получаем категории и объяснение; иначе используем пустые значения по умолчанию
violated_categories = assessment.get("categories", []) if contains_violation else []
explanation = assessment.get("explanation") if contains_violation else None
return contains_violation, violated_categories, explanation
# Обрабатываем каждый комментарий и выводим результаты
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.")Функция moderate_message_with_definitions расширяет предыдущую функцию moderate_message, позволяя сопоставить каждой небезопасной категории подробное определение. В коде это достигается заменой коллекции unsafe_categories из исходной функции на отображение unsafe_category_definitions. Это отображение сопоставляет каждую небезопасную категорию с соответствующим определением. В подсказку включаются как названия категорий, так и их определения.
Примечательно, что определение категории Specialized Advice теперь указывает типы финансовых советов, которые должны быть запрещены. В результате комментарий It is a great time to invest in gold!, который ранее проходил оценку moderate_message, теперь вызывает нарушение.
Рассмотрите пакетную обработку
Чтобы снизить затраты в ситуациях, когда модерация в реальном времени не требуется, рассмотрите «batch processing» (пакетную обработку) — модерацию сообщений пакетами. Включите несколько сообщений в контекст подсказки и попросите Claude оценить, какие сообщения следует модерировать.
def batch_moderate_messages(messages, unsafe_categories):
# Преобразуем небезопасные категории в строку, каждая категория с новой строки
unsafe_category_str = "\n".join(unsafe_categories)
# Форматируем строку сообщений: каждое сообщение обёрнуто в XML-подобные теги и имеет ID
messages_str = "\n".join(
[f"<message id={idx}>{msg}</message>" for idx, msg in enumerate(messages)]
)
# Формируем подсказку для Claude, включая сообщения и небезопасные категории
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."""
# Отправляем запрос Claude для модерации контента
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}],
)
# Разбираем JSON-ответ от Claude
text_block = next(block for block in response.content if block.type == "text")
assessment = json.loads(text_block.text)
return assessment
# Обрабатываем пакет комментариев и получаем ответ
response_obj = batch_moderate_messages(user_comments, unsafe_categories)
# Выводим результаты для каждого обнаруженного нарушения
for violation in response_obj["violations"]:
print(f"""Comment: {user_comments[violation["id"]]}
Violated Categories: {", ".join(violation["categories"])}
Explanation: {violation["explanation"]}
""")В этом примере функция batch_moderate_messages выполняет модерацию целого пакета сообщений за один вызов Claude API.
Внутри функции создаётся подсказка, включающая список сообщений для оценки и категории небезопасного контента. Подсказка предписывает Claude вернуть JSON-объект со списком всех сообщений, содержащих нарушения. Каждое сообщение в ответе идентифицируется по своему id, который соответствует позиции сообщения в пакете.
Имейте в виду, что поиск оптимального размера пакета для ваших конкретных потребностей может потребовать некоторых экспериментов. Хотя большие размеры пакетов могут снизить затраты, они также могут привести к небольшому снижению качества. Кроме того, вам может потребоваться увеличить параметр max_tokens в вызове Claude API, чтобы вместить более длинные ответы. Подробную информацию о максимальном количестве токенов, которое может выдать выбранная вами модель, см. в сравнительной таблице моделей.
Посмотрите полностью реализованный пример кода, показывающий, как использовать Claude для модерации контента.
Изучите методы защитных ограничений для модерации взаимодействий с Claude.
Was this page helpful?