Skip to content
Guides6 min read

Amazon Mechanical Turk에 배포하기

Amazon Mechanical Turk에서 Potato 어노테이션 작업을 실행하는 방법, HIT 구성, 자격 테스트, 승인 및 거부 워크플로, 보너스 지급, 품질 모니터링을 다룹니다.

Potato Team

Amazon Mechanical Turk(MTurk)는 어노테이션 작업을 위한 대규모 온디맨드 인력을 제공합니다. Potato는 ExternalQuestion HIT 유형을 통해 MTurk와 연동됩니다. Potato 서버가 어노테이션 인터페이스 역할을 하고, MTurk는 작업자 모집, 할당 추적, 지급을 처리합니다. 전체를 구성하는 방법은 다음과 같습니다.

사전 요구 사항

  1. MTurk가 활성화된 AWS 계정
  2. requester.mturk.com의 MTurk Requester 계정(프로덕션 또는 샌드박스)
  3. 공개 URL로 접근할 수 있는 Potato 서버(HTTPS 사용)
  4. Potato가 설치된 Python 환경
  5. MTurk 개념(HIT, Worker, Assignment)에 대한 어느 정도의 이해

연동 방식

Potato는 MTurk HIT를 직접 관리하지 않습니다. 흐름은 다음과 같습니다.

  1. Potato 서버 URL을 가리키는 ExternalQuestion HIT를 MTurk에서 생성합니다
  2. 작업자가 MTurk에서 HIT를 수락하면 쿼리 매개변수(workerId, assignmentId, hitId, turkSubmitTo)와 함께 Potato 서버로 리디렉션됩니다
  3. Potato는 workerId 매개변수를 읽어 작업자를 식별합니다(login.type: url_direct를 통해)
  4. 작업자는 Potato 서버에서 어노테이션 작업을 수행합니다
  5. 작업이 끝나면 Potato가 작업자를 MTurk의 제출 엔드포인트로 다시 리디렉션합니다

구성

MTurk 연동은 한 가지로 귀결됩니다. 로그인 유형을 url_direct로 설정하고 url_argument: workerId를 지정하십시오. 이렇게 하면 Potato가 MTurk가 자동으로 전달하는 URL 쿼리 매개변수에서 작업자의 신원을 가져옵니다.

yaml
login:
  type: url_direct
  url_argument: workerId

이것이 Potato에서 유일한 MTurk 전용 설정입니다. HIT 생성, 자격, 지급, 승인은 모두 MTurk 쪽에서 이루어집니다.

전체 구성 예시

yaml
annotation_task_name: "Sentiment Classification"
task_description: "Classify the sentiment of short text snippets."
 
# MTurk login: extract worker ID from URL parameter
login:
  type: url_direct
  url_argument: workerId
 
# UI settings recommended for crowdsourcing
hide_navbar: true
jumping_to_id_disabled: true
 
# Assignment settings
assignment_strategy: random
max_annotations_per_user: 20
max_annotations_per_item: 3
 
# Data
data_files:
  - data/items.json
 
item_properties:
  id_key: id
  text_key: text
 
# Annotation scheme
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment of this text?"
    labels:
      - Positive
      - Negative
      - Neutral
 
# Output
output_annotation_dir: annotation_output
export_annotation_format: json

MTurk에서 설정하기

1단계: Potato 서버 시작

공개적으로 접근 가능한 머신에서 Potato 서버를 실행하십시오.

bash
potato start config.yaml -p 8080

서버가 인터넷에서 접근 가능한지 확인하십시오(예: https://your-server.com:8080/).

2단계: ExternalQuestion XML 생성

MTurk는 ExternalQuestion이라는 XML 형식을 사용해 외부 웹사이트를 HIT에 임베드합니다. 필요한 XML은 다음과 같습니다.

xml
<?xml version="1.0" encoding="UTF-8"?>
<ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
  <ExternalURL>https://your-server.com:8080/?workerId=${workerId}&amp;assignmentId=${assignmentId}&amp;hitId=${hitId}&amp;turkSubmitTo=${turkSubmitTo}</ExternalURL>
  <FrameHeight>800</FrameHeight>
</ExternalQuestion>

중요: XML에서는 & 대신 &amp;를 사용하십시오. 작업자가 HIT를 수락하면 MTurk가 ${...} 자리표시자를 실제 값으로 바꿉니다.

3단계: MTurk에서 HIT 생성

MTurk Requester 콘솔을 통해 또는 AWS SDK(boto3)로 프로그래밍 방식으로 HIT를 생성할 수 있습니다. 제목, 설명, 보상, 기간, 자격 같은 HIT 설정은 모두 Potato가 아니라 MTurk 쪽에 있습니다.

boto3 사용(Python)

python
import boto3
 
# Use sandbox for testing
mturk = boto3.client(
    'mturk',
    region_name='us-east-1',
    endpoint_url='https://mturk-requester-sandbox.us-east-1.amazonaws.com'
)
 
# For production, omit endpoint_url or use:
# endpoint_url='https://mturk-requester.us-east-1.amazonaws.com'
 
question_xml = '''<?xml version="1.0" encoding="UTF-8"?>
<ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
  <ExternalURL>https://your-server.com:8080/?workerId=${workerId}&amp;assignmentId=${assignmentId}&amp;hitId=${hitId}&amp;turkSubmitTo=${turkSubmitTo}</ExternalURL>
  <FrameHeight>800</FrameHeight>
</ExternalQuestion>'''
 
response = mturk.create_hit(
    Title='Sentiment Classification Task',
    Description='Read short texts and classify their sentiment as positive, negative, or neutral.',
    Keywords='sentiment, classification, text, NLP',
    Reward='0.50',
    MaxAssignments=100,
    LifetimeInSeconds=86400,         # 1 day
    AssignmentDurationInSeconds=3600, # 1 hour
    AutoApprovalDelayInSeconds=604800, # 7 days
    Question=question_xml,
    QualificationRequirements=[
        {
            'QualificationTypeId': '000000000000000000L0',  # Approval rate
            'Comparator': 'GreaterThanOrEqualTo',
            'IntegerValues': [97]
        },
        {
            'QualificationTypeId': '00000000000000000040',  # Number approved
            'Comparator': 'GreaterThanOrEqualTo',
            'IntegerValues': [500]
        },
        {
            'QualificationTypeId': '00000000000000000071',  # Locale
            'Comparator': 'In',
            'LocaleValues': [
                {'Country': 'US'},
                {'Country': 'GB'},
                {'Country': 'CA'},
                {'Country': 'AU'}
            ]
        }
    ]
)
 
print(f"Created HIT: {response['HIT']['HITId']}")

4단계: 자격 설정(MTurk에서)

HIT를 생성할 때 MTurk 쪽에서 작업자 자격을 설정합니다. 일반적인 필터는 다음과 같습니다.

  • 승인율: 최소 HIT 승인 비율을 요구합니다(예: 97% 이상)
  • 승인된 HIT: 이전에 승인된 HIT의 최소 개수를 요구합니다(예: 500개 이상)
  • 로케일: 특정 국가의 작업자로 제한합니다
  • Masters: MTurk가 사전 검증한 Masters 작업자를 사용합니다(비용이 더 듭니다)
  • 사용자 지정 자격: MTurk 콘솔을 통해 직접 자격 테스트를 만듭니다

완료 처리

작업자가 할당된 모든 항목을 마치면 Potato는 할당이 제출되도록 작업자를 MTurk로 다시 리디렉션해야 합니다. MTurk는 turkSubmitTo URL 매개변수를 전달하여 Potato가 완료 POST 요청을 어디로 보내야 하는지 알려 줍니다.

작업을 마친 후 작업자에게 "Submit HIT" 버튼이 표시됩니다. 이를 클릭하면 할당이 검토 및 승인을 위해 MTurk로 다시 전송됩니다.

MTurk 샌드박스에서 테스트하기

프로덕션에서 실제 비용을 쓰기 전에 MTurk 샌드박스에서 전체를 테스트하십시오.

로컬 테스트

MTurk 없이 로컬에서 URL 매개변수 흐름을 테스트할 수 있습니다.

bash
# Simulate a worker accessing your task
curl "http://localhost:8080/?workerId=TEST_WORKER&assignmentId=TEST_ASSIGN&hitId=TEST_HIT"
 
# Simulate the preview mode (before a worker accepts the HIT)
curl "http://localhost:8080/?workerId=TEST_WORKER&assignmentId=ASSIGNMENT_ID_NOT_AVAILABLE&hitId=TEST_HIT"

assignmentIdASSIGNMENT_ID_NOT_AVAILABLE이면 작업자는 HIT를 미리보기만 하고 아직 수락하지 않은 상태입니다.

HIT 및 승인 관리

진행 상황 모니터링이든, 할당 승인 또는 거부든, 보너스 지급이든 HIT는 MTurk의 자체 도구를 통해 관리합니다.

  • MTurk Requester 콘솔: HIT 관리, 할당 검토, 작업자 메시지 전송을 위한 웹 인터페이스
  • boto3(Python용 AWS SDK): 일괄 작업을 위한 프로그래밍 방식 접근
python
# Example: List assignments for a HIT
assignments = mturk.list_assignments_for_hit(
    HITId='YOUR_HIT_ID',
    AssignmentStatuses=['Submitted']
)
 
# Approve an assignment
mturk.approve_assignment(AssignmentId='ASSIGNMENT_ID')
 
# Reject an assignment (use sparingly)
mturk.reject_assignment(
    AssignmentId='ASSIGNMENT_ID',
    RequesterFeedback='Did not complete all items.'
)

비용 계산

MTurk는 작업자에게 지급하는 보상 위에 수수료를 부과합니다.

  • 기본 수수료: 보상 금액의 20%
  • Masters 자격: 추가 5%
  • HIT당 10개 이상의 할당: 추가 20%

예를 들어 100개 할당에 걸쳐 할당당 $0.50을 지급하는 경우:

  • 기본 비용: 100 x $0.50 x 1.20 = $60.00
  • Masters 적용 시: 100 x $0.50 x 1.25 = $62.50

해 두면 좋은 것들

  1. 샌드박스에서 시작하십시오. 돈이 오가기 전에 전체 워크플로를 그곳에서 실행하십시오.
  2. 공정하게 지급하십시오. 시간당 금액(보상 / 예상 시간 x 60)을 계산하고 시간당 $12에서 $15 또는 그 이상을 목표로 하십시오.
  3. 명확한 HIT 설명을 작성하십시오. 좋은 제목과 설명은 더 나은 작업자를 끌어들입니다.
  4. 빠르게 승인하십시오. 작업자는 빠른 지급을 알아차리므로 품질이 괜찮아 보이면 곧바로 승인하십시오.
  5. 거부에 신중하십시오. 거부는 작업자의 승인율과 본인의 requester 평판에 해를 끼치므로 아껴서 사용하십시오.
  6. HTTPS를 사용하십시오. 일부 브라우저는 혼합 콘텐츠를 차단하며, HTTPS는 iframe이 계속 작동하도록 합니다.
  7. hide_navbar: true를 설정하여 작업자가 Potato 안에서 작업을 벗어나지 않도록 하십시오.
  8. HIT가 유효한 동안 서버를 계속 가동하십시오.

MTurk vs Prolific

항목MTurkProlific
작업자 풀크고 다양함더 작고 연구 중심
품질가변적대체로 높음
가격낮은 기본료 + 수수료높지만 투명함
설정더 복잡함더 단순함
적합한 용도대규모, 예산연구, 품질
Potato 설정url_argument: workerIdurl_argument: PROLIFIC_PID

다음으로 갈 곳

MTurk 설정의 전체 세부 사항은 원본 문서를 참고하십시오. 더 큰 규모의 크라우드소싱을 진행한다면 크라우드소싱 가이드에서 플랫폼 전반의 작업자 관리와 품질 모니터링을 다룹니다.


MTurk 전체 문서는 /docs/deployment/mturk-integration에 있습니다.