Посетите наш сборник рецептов по модерации контента, чтобы увидеть пример реализации модерации контента с использованием 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 = [
    'Child Exploitation',
    'Conspiracy Theories',
    'Hate',
    'Indiscriminate Weapons', 
    'Intellectual Property',
    'Non-Violent Crimes', 
    'Privacy',
    'Self-Harm',
    'Sex Crimes',
    'Sexual Content',
    'Specialized Advice',
    'Violent Crimes'
]

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

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


Как модерировать контент с помощью 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.5 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 = {
    'Child Exploitation': 'Контент, который изображает детскую наготу или который позволяет, поощряет, оправдывает или изображает сексуальное насилие над детьми.',
    'Conspiracy Theories': """Контент, который продвигает или поддерживает необоснованные, ложные или вводящие в заблуждение теории о событиях, ситуациях или людях, 
        которые могут причинить вред или подорвать общественное доверие к институтам или фактам.""",
    'Hate': """Контент, который является ненавистническим по отношению к людям на основе их защищенных характеристик 
        (раса, цвет кожи, этническая принадлежность, национальное происхождение, инвалидность, религиозная принадлежность, каста, сексуальная ориентация, пол, гендерная идентичность и серьезные заболевания), 
        или контент, который увековечивает негативные стереотипы.""",
    'Indiscriminate Weapons': 'Контент, который позволяет создавать оружие массового поражения.', 
    'Intellectual Property': 'Контент, который нарушает права интеллектуальной собственности третьих лиц.',
    'Non-Violent Crimes': 'Контент, который позволяет, поощряет или оправдывает совершение ненасильственных преступлений.', 
    'Privacy': 'Контент, который содержит конфиденциальную, личную информацию о частных лицах.',
    'Self-Harm': 'Контент, который позволяет, поощряет или оправдывает акты преднамеренного самоповреждения.',
    'Sex Crimes': 'Контент, который позволяет, поощряет или оправдывает совершение сексуальных преступлений.',
    'Sexual Content': 'Контент, который содержит эротические описания или явные изображения половых актов.',
    'Specialized Advice': """Контент, который содержит финансовые, медицинские или юридические советы. 
        Финансовые советы включают рекомендации по инвестициям, акциям, облигациям или любому финансовому планированию.""",
    '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"""Определите, требует ли следующее сообщение модерации, на основе перечисленных ниже небезопасных категорий.

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

Примечательно, что определение категории Specialized Advice теперь указывает типы финансовых советов, которые должны быть запрещены. В результате комментарий Сейчас отличное время для инвестиций в золото!, который ранее прошел оценку 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, чтобы вместить более длинные ответы. Подробности о максимальном количестве токенов, которое может выводить выбранная вами модель, см. на странице сравнения моделей.