Skip to content
Guides5 min read

콘텐츠 모더레이션 어노테이션 설정

독성 탐지, 혐오 발언 분류, 민감 콘텐츠 라벨링을 위해 Potato를 설정하되 어노테이터의 웰빙을 염두에 두는 방법을 알아봅니다.

Potato Team

독성 콘텐츠를 라벨링하는 일은 영화 리뷰를 라벨링하는 것과 다릅니다. 이 작업은 사람을 지치게 하고, 지침은 늘 조금 모호하며, 가장 중요한 사례들은 보통 어노테이터들이 서로 의견이 갈리는 것들입니다. 이 가이드는 이러한 문제들을 진지하게 다루는 콘텐츠 모더레이션 작업을 Potato에서 구성하는 방법을 다루며, 그 일을 하는 사람들에서 출발합니다.

어노테이터 웰빙

혐오스럽고 충격적인 콘텐츠를 몇 시간씩 읽는 것은 그 일을 하는 사람들에게 실제로 영향을 미칩니다. 몇 가지 설정이 작업을 견딜 만하게 유지하는 데 도움이 됩니다.

웰빙 구성

yaml
surveyflow:
  on: true
  order:
    - pre_annotation
  pre_annotation:
    - "surveyflow/content_warning.jsonl"

콘텐츠 흐리게 처리

yaml
max_annotations_per_user: 100

독성 분류

다단계 독성

yaml
annotation_schemes:
  - annotation_type: radio
    name: toxicity_level
    description: "Rate the toxicity level of this content"
    labels:
      - name: "Not toxic"
        tooltip: "No harmful content"
 
      - name: "Mildly toxic"
        tooltip: "Rude or insensitive but not severe"
 
      - name: "Moderately toxic"
        tooltip: "Clearly offensive or harmful"
 
      - name: "Severely toxic"
        tooltip: "Extremely offensive, threatening, or dangerous"

독성 범주

yaml
annotation_schemes:
  - annotation_type: multiselect
    name: toxicity_types
    description: "Select all types of toxicity present"
    labels:
      - name: "Profanity or obscenity"
        tooltip: "Swear words, vulgar language"
 
      - name: "Insults"
        tooltip: "Personal attacks, name-calling"
 
      - name: "Threats"
        tooltip: "Threats of violence or harm"
 
      - name: "Hate speech"
        tooltip: "Targeting protected groups"
 
      - name: "Harassment"
        tooltip: "Targeted, persistent hostility"
 
      - name: "Sexual content"
        tooltip: "Explicit or suggestive content"
 
      - name: "Self-harm or suicide"
        tooltip: "Promoting or glorifying self-harm"
 
      - name: "Misinformation"
        tooltip: "Demonstrably false claims"
 
      - name: "Spam or scam"
        tooltip: "Unwanted promotional content"

혐오 발언 탐지

대상 집단

yaml
annotation_schemes:
  - annotation_type: multiselect
    name: target_groups
    description: "Which groups are targeted? Leave empty if this is not hate speech"
    labels:
      - name: "Race or ethnicity"
      - name: "Religion"
      - name: "Gender"
      - name: "Sexual orientation"
      - name: "Disability"
      - name: "Nationality or origin"
      - name: "Age"
      - name: "Other protected group"

혐오 발언 심각도

yaml
annotation_schemes:
  - annotation_type: radio
    name: hate_severity
    description: "Severity of hate speech"
    labels:
      - name: "Implicit"
        tooltip: "Coded language, dog whistles"
 
      - name: "Explicit, mild"
        tooltip: "Clear but not threatening"
 
      - name: "Explicit, severe"
        tooltip: "Dehumanizing, threatening, or violent"

맥락 기반 모더레이션

플랫폼별 규칙

yaml
annotation_schemes:
  - annotation_type: radio
    name: context_appropriate
    description: "Is this content appropriate for the platform context?"
    labels:
      - name: "Appropriate for context"
      - name: "Borderline"
      - name: "Inappropriate for context"
 
  - annotation_type: text
    name: context_notes
    description: "Explain your contextual reasoning"
    multiline: true
    rows: 3

의도 탐지

yaml
annotation_schemes:
  - annotation_type: radio
    name: intent
    description: "What is the apparent intent?"
    labels:
      - name: "Genuine attack"
        tooltip: "Intent to harm or offend"
 
      - name: "Satire or parody"
        tooltip: "Mocking toxic behavior"
 
      - name: "Quote or report"
        tooltip: "Reporting or discussing toxic content"
 
      - name: "Reclaimed language"
        tooltip: "In-group use of slurs"
 
      - name: "Unclear intent"

이미지 콘텐츠 모더레이션

시각 콘텐츠 분류

yaml
annotation_schemes:
  - annotation_type: multiselect
    name: image_violations
    description: "Select all policy violations"
    labels:
      - name: "Nudity or sexual content"
      - name: "Graphic violence"
      - name: "Gore or disturbing content"
      - name: "Hate symbols"
      - name: "Dangerous acts"
      - name: "Child safety concern"
        priority: critical
        escalate: true
      - name: "No violations"
 
  - annotation_type: radio
    name: action_recommendation
    description: "Recommended action"
    labels:
      - name: "Approve"
      - name: "Age-restrict"
      - name: "Add warning label"
      - name: "Remove"
      - name: "Escalate to specialist"

품질 관리

yaml
# Items with known labels, mixed into the regular queue
gold_standards:
  enabled: true
  items_file: data/moderation_gold.json
  mode: mixed
  frequency: 20
  accuracy:
    min_threshold: 0.7
    evaluation_count: 10
 
# Three judgements on every item
num_annotators_per_item: 3
 
# Disagreements go to a specialist queue
adjudication:
  enabled: true
  adjudicator_users:
    - trust_safety_lead
  min_annotations: 3
  agreement_threshold: 0.67
  require_notes_on_override: true
  show_agreement_scores: true

전체 구성

yaml
annotation_task_name: "Content Moderation"
task_dir: "."
output_annotation_dir: "annotations/"
 
data_files:
  - "data/reports.json"
 
item_properties:
  id_key: id
  text_key: text
 
num_annotators_per_item: 3
 
annotation_schemes:
  - annotation_type: radio
    name: toxicity
    description: "Toxicity level"
    labels:
      - name: "None"
      - name: "Mild"
      - name: "Moderate"
      - name: "Severe"
 
  - annotation_type: multiselect
    name: categories
    description: "Types of harmful content (select all)"
    labels:
      - name: "Hate speech"
      - name: "Harassment"
      - name: "Violence or threats"
      - name: "Sexual content"
      - name: "Self-harm"
      - name: "Spam"
      - name: "None"
 
  - annotation_type: likert
    name: confidence
    description: "How confident are you in this judgment?"
    size: 5
    min_label: "Uncertain"
    max_label: "Very confident"
 
  - annotation_type: text
    name: notes
    description: "Additional notes (optional)"
    multiline: true
    rows: 4
 
export_annotation_format: jsonl

지침 작성하기

어노테이터 간 의견 차이는 대부분 모호한 지침으로 거슬러 올라가므로, 바로 여기에 들이는 노력이 보답을 줍니다. 어노테이터가 짐작하도록 내버려 두는 대신 "mild"와 "moderate"를 무엇이 가르는지 명확히 적으세요. 경계 사례를 보여주고, 각 사례가 왜 그 자리에 놓였는지 설명을 덧붙이세요. 같은 문장이 한 커뮤니티에서는 괜찮고 다른 곳에서는 위반일 수 있으므로, 플랫폼과 청중이 판단을 어떻게 바꾸는지 밝히세요. 그리고 의도가 정말로 불분명할 때 어떻게 해야 하는지를, 그런 일이 결코 없는 척하지 말고 어노테이터에게 알려주세요. 새로운 종류의 콘텐츠가 등장하면서 이 모든 것을 수정하게 되리라 예상하세요.

어노테이터 지원하기

한 사람을 하루 종일 독성 콘텐츠에 붙박아 두지 말고, 작업을 돌려 가며 맡기세요. 정신 건강 자원을 한 번의 클릭으로 닿을 수 있게 두고, 우려를 알릴 진짜 통로를 사람들에게 주며, 이것이 힘든 일임을 인정하세요. 실제로 그렇습니다.

기저의 분류 스키마가 어떻게 작동하는지는 텍스트 어노테이션 문서를 참고하세요. 품질 관리 가이드는 중복 처리와 보정을 더 자세히 다룹니다.


전체 문서는 어노테이션 스키마에서 확인하세요.