Посетите наш сборник рецептов по модерации контента, чтобы увидеть пример реализации модерации контента с использованием Claude.

Это руководство сфокусировано на модерации пользовательского контента в вашем приложении. Если вы ищете рекомендации по модерации взаимодействий с Claude, обратитесь к нашему руководству по защитным ограничениям.

Перед началом работы с Claude

Решите, стоит ли использовать Claude для модерации контента

Вот несколько ключевых показателей того, что вам следует использовать LLM вроде Claude вместо традиционного подхода на основе ML или правил для модерации контента:

Anthropic обучил все модели Claude быть честными, полезными и безвредными. Это может привести к тому, что Claude будет модерировать контент, который считается особенно опасным (в соответствии с нашей Политикой приемлемого использования), независимо от используемого промпта. Например, сайт для взрослых, который хочет разрешить пользователям публиковать откровенный сексуальный контент, может обнаружить, что Claude все равно помечает откровенный контент как требующий модерации, даже если в промпте указано не модерировать откровенный сексуальный контент. Мы рекомендуем ознакомиться с нашей Политикой приемлемого использования перед созданием решения для модерации.

Создайте примеры контента для модерации

Перед разработкой решения для модерации контента сначала создайте примеры контента, который должен быть помечен, и контента, который не должен быть помечен. Убедитесь, что вы включили граничные случаи и сложные сценарии, которые могут быть трудными для эффективной обработки системой модерации контента. После этого просмотрите ваши примеры, чтобы создать четко определенный список категорий модерации. Например, примеры, созданные социальной платформой, могут включать следующее:

allowed_user_comments = [
    'Этот фильм был отличным, мне он очень понравился. Главный актер просто убил!',
    'Я ненавижу понедельники.',
    'Сейчас отличное время для инвестиций в золото!'
]

disallowed_user_comments = [
    'Удали этот пост сейчас или тебе лучше спрятаться. Я иду за тобой и твоей семьей.',
    'Держитесь подальше от сотовых телефонов 5G!! Они используют 5G, чтобы контролировать вас.',
    'Поздравляем! Вы выиграли подарочную карту на 1000$. Нажмите здесь, чтобы получить свой приз!'
]

# Примеры комментариев пользователей для тестирования модерации контента
user_comments = allowed_user_comments + disallowed_user_comments

# Список категорий, считающихся небезопасными для модерации контента
unsafe_categories = [
    'Эксплуатация детей',
    'Теории заговора',
    'Ненависть',
    'Оружие массового поражения', 
    'Интеллектуальная собственность',
    'Ненасильственные преступления', 
    'Конфиденциальность',
    'Самоповреждение',
    'Сексуальные преступления',
    'Сексуальный контент',
    'Специализированные советы',
    'Насильственные преступления'
]

Эффективная модерация этих примеров требует нюансированного понимания языка. В комментарии Этот фильм был отличным, мне он очень понравился. Главный актер просто убил!, система модерации контента должна распознать, что “убил” является метафорой, а не указанием на реальное насилие. И наоборот, несмотря на отсутствие явных упоминаний насилия, комментарий Удали этот пост сейчас или тебе лучше спрятаться. Я иду за тобой и твоей семьей. должен быть помечен системой модерации контента.

Список unsafe_categories может быть настроен в соответствии с вашими конкретными потребностями. Например, если вы хотите предотвратить создание контента несовершеннолетними на вашем сайте, вы можете добавить “Публикации несовершеннолетних” в список.


Как модерировать контент с помощью Claude

Выберите правильную модель Claude

При выборе модели важно учитывать размер ваших данных. Если затраты вызывают беспокойство, меньшая модель, такая как Claude 3 Haiku, является отличным выбором благодаря своей экономической эффективности. Ниже приведена оценка стоимости модерации текста для социальной платформы, которая получает один миллиард постов в месяц:

  • Размер контента

    • Постов в месяц: 1 млрд
    • Символов на пост: 100
    • Всего символов: 100 млрд
  • Оценка токенов

    • Входные токены: 28,6 млрд (предполагая 1 токен на 3,5 символа)
    • Процент помеченных сообщений: 3%
    • Выходных токенов на помеченное сообщение: 50
    • Всего выходных токенов: 1,5 млрд
  • Оценка стоимости Claude 3 Haiku

    • Стоимость входных токенов: 2 860 MTok * 0,25/MTok=0,25/MTok = 715
    • Стоимость выходных токенов: 1 500 MTok * 1,25/MTok=1,25/MTok = 1 875
    • Месячная стоимость: 715+715 + 1 875 = $2 590
  • Оценка стоимости Claude 3.7 Sonnet

    • Стоимость входных токенов: 2 860 MTok * 3,00/MTok=3,00/MTok = 8 580
    • Стоимость выходных токенов: 1 500 MTok * 15,00/MTok=15,00/MTok = 22 500
    • Месячная стоимость: 8580+8 580 + 22 500 = $31 080
Фактические затраты могут отличаться от этих оценок. Эти оценки основаны на промпте, выделенном в разделе о пакетной обработке. Выходные токены можно еще больше сократить, удалив поле explanation из ответа.

Создайте сильный промпт

Чтобы использовать Claude для модерации контента, Claude должен понимать требования к модерации вашего приложения. Давайте начнем с написания промпта, который позволит вам определить ваши потребности в модерации:

import anthropic
import json

# Инициализация клиента Anthropic
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # Преобразование списка небезопасных категорий в строку, каждая категория на новой строке
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Создание промпта для Claude, включая сообщение и небезопасные категории
    assessment_prompt = f"""
    Определите, требует ли следующее сообщение модерации, 
    основываясь на перечисленных ниже небезопасных категориях.
    
    Сообщение:
    <message>{message}</message>

    Небезопасные категории:
    <categories>
    {unsafe_category_str}
    </categories>

    Ответьте ТОЛЬКО JSON-объектом, используя формат ниже:
    {{
    "violation": <Логическое поле, указывающее, должно ли сообщение быть модерировано>,
    "categories": [Список нарушенных категорий через запятую],
    "explanation": [Необязательно. Включать только если есть нарушение.]
    }}"""

    # Отправка запроса Claude для модерации контента
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Использование модели Haiku для снижения затрат
        max_tokens=200,
        temperature=0,   # Использование температуры 0 для повышения согласованности
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Разбор JSON-ответа от Claude
    assessment = json.loads(response.content[0].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"\nКомментарий: {comment}")
    violation, violated_categories, explanation = moderate_message(comment, unsafe_categories)
    
    if violation:
        print(f"Нарушенные категории: {', '.join(violated_categories)}")
        print(f"Объяснение: {explanation}")
    else:
        print("Проблем не обнаружено.")

В этом примере функция moderate_message содержит промпт оценки, который включает небезопасные категории контента и сообщение, которое мы хотим оценить. Промпт просит Claude оценить, должно ли сообщение быть модерировано, основываясь на определенных нами небезопасных категориях.

Затем оценка модели анализируется, чтобы определить, есть ли нарушение. Если есть нарушение, Claude также возвращает список нарушенных категорий, а также объяснение, почему сообщение небезопасно.

Оцените ваш промпт

Модерация контента - это задача классификации. Таким образом, вы можете использовать те же методы, описанные в нашем сборнике рецептов по классификации, чтобы определить точность вашей системы модерации контента.

Одно дополнительное соображение заключается в том, что вместо того, чтобы рассматривать модерацию контента как задачу бинарной классификации, вы можете создать несколько категорий для представления различных уровней риска. Создание нескольких уровней риска позволяет регулировать агрессивность вашей модерации. Например, вы можете автоматически блокировать запросы пользователей, которые считаются высокорисковыми, в то время как пользователи с множеством запросов среднего риска помечаются для проверки человеком.

import anthropic
import json

# Инициализация клиента Anthropic
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # Преобразование списка небезопасных категорий в строку, каждая категория на новой строке
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Создание промпта для Claude, включая сообщение, небезопасные категории и определения уровней риска
    assessment_prompt = f"""
    Оцените уровень риска следующего сообщения на предмет необходимости модерации, 
    основываясь на перечисленных ниже небезопасных категориях.
    
Сообщение:
<message>{message}</message>

Небезопасные категории:
<categories>
{unsafe_category_str}
</categories>

Назначьте уровень риска на основе вашей уверенности в том, что сообщение пользователя 
должно быть модерировано согласно определенным небезопасным категориям:

0 - Нет риска
1 - Низкий риск
2 - Средний риск
3 - Высокий риск

Ответьте ТОЛЬКО JSON-объектом, используя формат ниже:
{{
  "risk_level": <Числовое поле, указывающее уровень риска>,
  "categories": [Список нарушенных категорий через запятую],
  "explanation": <Необязательно. Включать только если уровень риска больше 0>
}}"""

    # Отправка запроса Claude для оценки риска
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Использование модели Haiku для снижения затрат
        max_tokens=200,
        temperature=0,   # Использование температуры 0 для повышения согласованности
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Разбор JSON-ответа от Claude
    assessment = json.loads(response.content[0].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"\nКомментарий: {comment}")
    risk_level, violated_categories, explanation = assess_risk_level(comment, unsafe_categories)
    
    print(f"Уровень риска: {risk_level}")
    if violated_categories:
        print(f"Нарушенные категории: {', '.join(violated_categories)}")
    if explanation:
        print(f"Объяснение: {explanation}")

Этот код реализует функцию assess_risk_level, которая использует Claude для оценки уровня риска сообщения. Функция принимает сообщение и список небезопасных категорий в качестве входных данных.

Внутри функции генерируется промпт для Claude, включающий сообщение для оценки, небезопасные категории и конкретные инструкции по оценке уровня риска. Промпт указывает Claude ответить JSON-объектом, который включает уровень риска, нарушенные категории и необязательное объяснение.

Этот подход обеспечивает гибкую модерацию контента путем назначения уровней риска. Он может быть легко интегрирован в более крупную систему для автоматической фильтрации контента или пометки комментариев для проверки человеком на основе оцененного уровня риска. Например, при выполнении этого кода комментарий Удали этот пост сейчас или тебе лучше спрятаться. Я иду за тобой и твоей семьей. определяется как высокорисковый из-за опасной угрозы. И наоборот, комментарий Держитесь подальше от сотовых телефонов 5G!! Они используют 5G, чтобы контролировать вас. классифицируется как среднерисковый.

Разверните ваш промпт

Когда вы уверены в качестве вашего решения, пора развернуть его в производство. Вот некоторые лучшие практики, которым следует следовать при использовании модерации контента в производстве:

  1. Предоставляйте четкую обратную связь пользователям: Когда пользовательский ввод блокируется или ответ помечается из-за модерации контента, предоставляйте информативную и конструктивную обратную связь, чтобы помочь пользователям понять, почему их сообщение было помечено и как они могут переформулировать его соответствующим образом. В приведенных выше примерах кода это делается через тег explanation в ответе Claude.

  2. Анализируйте модерируемый контент: Отслеживайте типы контента, помечаемого вашей системой модерации, чтобы выявлять тенденции и потенциальные области для улучшения.

  3. Постоянно оценивайте и улучшайте: Регулярно оценивайте производительность вашей системы модерации контента, используя такие метрики, как отслеживание точности и полноты. Используйте эти данные для итеративного улучшения ваших промптов модерации, ключевых слов и критериев оценки.


Улучшите производительность

В сложных сценариях может быть полезно рассмотреть дополнительные стратегии для улучшения производительности помимо стандартных методов инженерии промптов. Вот некоторые продвинутые стратегии:

Определите темы и предоставьте примеры

В дополнение к перечислению небезопасных категорий в промпте, дальнейшие улучшения можно сделать, предоставив определения и фразы, связанные с каждой категорией.

import anthropic
import json

# Инициализация клиента Anthropic
client = anthropic.Anthropic()

# Словарь категорий, считающихся небезопасными для модерации контента, с их определениями
unsafe_category_definitions = {
    'Эксплуатация детей': 'Контент, который изображает детскую наготу или который позволяет, поощряет, оправдывает или изображает сексуальное насилие над детьми.',
    'Теории заговора': """Контент, который продвигает или поддерживает необоснованные, ложные или вводящие в заблуждение теории о событиях, ситуациях или людях, 
        которые могут причинить вред или подорвать общественное доверие к институтам или фактам.""",
    'Ненависть': """Контент, который является ненавистническим по отношению к людям на основе их защищенных характеристик 
        (раса, цвет кожи, этническая принадлежность, национальное происхождение, инвалидность, религиозная принадлежность, каста, сексуальная ориентация, пол, гендерная идентичность и серьезные заболевания), 
        или контент, который увековечивает негативные стереотипы.""",
    'Оружие массового поражения': 'Контент, который позволяет создавать оружие массового поражения.', 
    'Интеллектуальная собственность': 'Контент, который нарушает права интеллектуальной собственности третьих лиц.',
    'Ненасильственные преступления': 'Контент, который позволяет, поощряет или оправдывает совершение ненасильственных преступлений.', 
    'Конфиденциальность': 'Контент, который содержит конфиденциальную, личную информацию о частных лицах.',
    'Самоповреждение': 'Контент, который позволяет, поощряет или оправдывает акты намеренного самоповреждения.',
    'Сексуальные преступления': 'Контент, который позволяет, поощряет или оправдывает совершение сексуальных преступлений.',
    'Сексуальный контент': 'Контент, который содержит эротические описания или явные изображения половых актов.',
    'Специализированные советы': """Контент, который содержит финансовые, медицинские или юридические советы. 
        Финансовые советы включают рекомендации по инвестициям, акциям, облигациям или любому финансовому планированию.""",
    'Насильственные преступления': 'Контент, который позволяет, поощряет или оправдывает совершение насильственных преступлений.', 
}


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"""Определите, требует ли следующее сообщение модерации, основываясь на перечисленных ниже небезопасных категориях.

Сообщение:
<message>{message}</message>

Небезопасные категории и их определения:
<categories>
{unsafe_category_str}
</categories>

Важно, чтобы вы помнили все небезопасные категории и их определения.

Ответьте ТОЛЬКО JSON-объектом, используя формат ниже:
{{
  "violation": <Логическое поле, указывающее, должно ли сообщение быть модерировано>,
  "categories": [Список нарушенных категорий через запятую],
  "explanation": [Необязательно. Включать только если есть нарушение.]
}}"""

    # Отправка запроса Claude для модерации контента
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Использование модели Haiku для снижения затрат
        max_tokens=200,
        temperature=0,   # Использование температуры 0 для повышения согласованности
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Разбор JSON-ответа от Claude
    assessment = json.loads(response.content[0].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"\nКомментарий: {comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(comment, unsafe_category_definitions)
    
    if violation:
        print(f"Нарушенные категории: {', '.join(violated_categories)}")
        print(f"Объяснение: {explanation}")
    else:
        print("Проблем не обнаружено.")

Функция moderate_message_with_definitions расширяет предыдущую функцию moderate_message, позволяя каждой небезопасной категории быть связанной с подробным определением. Это происходит в коде путем замены списка unsafe_categories из исходной функции на словарь unsafe_category_definitions. Этот словарь сопоставляет каждую небезопасную категорию с ее соответствующим определением. И названия категорий, и их определения включены в промпт.

Примечательно, что определение категории Специализированные советы теперь указывает типы финансовых советов, которые должны быть запрещены. В результате комментарий Сейчас отличное время для инвестиций в золото!, который ранее прошел оценку moderate_message, теперь вызывает нарушение.

Рассмотрите пакетную обработку

Чтобы снизить затраты в ситуациях, когда модерация в реальном времени не требуется, рассмотрите возможность модерации сообщений пакетами. Включите несколько сообщений в контекст промпта и попросите Claude оценить, какие сообщения должны быть модерированы.

import anthropic
import json

# Инициализация клиента Anthropic
client = anthropic.Anthropic()

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"""Определите сообщения для модерации, основываясь на перечисленных ниже небезопасных категориях.

Сообщения:
<messages>
{messages_str}
</messages>

Небезопасные категории и их определения:
<categories>
{unsafe_category_str}
</categories>

Ответьте ТОЛЬКО JSON-объектом, используя формат ниже:
{{
  "violations": [
    {{
      "id": <id сообщения>,
      "categories": [список нарушенных категорий],
      "explanation": <Объяснение, почему есть нарушение>
    }},
    ...
  ]
}}

Важные примечания:
- Помните о необходимости анализировать каждое сообщение на предмет нарушения.
- Выберите любое количество нарушений, которые разумно применимы."""

    # Отправка запроса Claude для модерации контента
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Использование модели Haiku для снижения затрат
        max_tokens=2048,  # Увеличенное максимальное количество токенов для обработки пакетов
        temperature=0,    # Использование температуры 0 для повышения согласованности
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Разбор JSON-ответа от Claude
    assessment = json.loads(response.content[0].text)
    return assessment


# Обработка пакета комментариев и получение ответа
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# Вывод результатов для каждого обнаруженного нарушения
for violation in response_obj['violations']:
    print(f"""Комментарий: {user_comments[violation['id']]}
Нарушенные категории: {', '.join(violation['categories'])}
Объяснение: {violation['explanation']}
""")

В этом примере функция batch_moderate_messages обрабатывает модерацию целого пакета сообщений с помощью одного вызова API Claude. Внутри функции создается промпт, который включает список сообщений для оценки, определенные небезопасные категории контента и их описания. Промпт указывает Claude вернуть JSON-объект, перечисляющий все сообщения, содержащие нарушения. Каждое сообщение в ответе идентифицируется по его id, который соответствует позиции сообщения во входном списке. Имейте в виду, что поиск оптимального размера пакета для ваших конкретных потребностей может потребовать некоторого экспериментирования. Хотя большие размеры пакетов могут снизить затраты, они также могут привести к небольшому снижению качества. Кроме того, вам может потребоваться увеличить параметр max_tokens в вызове API Claude, чтобы вместить более длинные ответы. Подробности о максимальном количестве токенов, которое может выводить выбранная вами модель, см. на странице сравнения моделей.