Amazon Mechanical Turk에 배포하기
Amazon Mechanical Turk에서 Potato 어노테이션 작업을 실행하는 방법, HIT 구성, 자격 테스트, 승인 및 거부 워크플로, 보너스 지급, 품질 모니터링을 다룹니다.
Amazon Mechanical Turk(MTurk)는 어노테이션 작업을 위한 대규모 온디맨드 인력을 제공합니다. Potato는 ExternalQuestion HIT 유형을 통해 MTurk와 연동됩니다. Potato 서버가 어노테이션 인터페이스 역할을 하고, MTurk는 작업자 모집, 할당 추적, 지급을 처리합니다. 전체를 구성하는 방법은 다음과 같습니다.
사전 요구 사항
- MTurk가 활성화된 AWS 계정
- requester.mturk.com의 MTurk Requester 계정(프로덕션 또는 샌드박스)
- 공개 URL로 접근할 수 있는 Potato 서버(HTTPS 사용)
- Potato가 설치된 Python 환경
- MTurk 개념(HIT, Worker, Assignment)에 대한 어느 정도의 이해
연동 방식
Potato는 MTurk HIT를 직접 관리하지 않습니다. 흐름은 다음과 같습니다.
- Potato 서버 URL을 가리키는 ExternalQuestion HIT를 MTurk에서 생성합니다
- 작업자가 MTurk에서 HIT를 수락하면 쿼리 매개변수(
workerId,assignmentId,hitId,turkSubmitTo)와 함께 Potato 서버로 리디렉션됩니다 - Potato는
workerId매개변수를 읽어 작업자를 식별합니다(login.type: url_direct를 통해) - 작업자는 Potato 서버에서 어노테이션 작업을 수행합니다
- 작업이 끝나면 Potato가 작업자를 MTurk의 제출 엔드포인트로 다시 리디렉션합니다
구성
MTurk 연동은 한 가지로 귀결됩니다. 로그인 유형을 url_direct로 설정하고 url_argument: workerId를 지정하십시오. 이렇게 하면 Potato가 MTurk가 자동으로 전달하는 URL 쿼리 매개변수에서 작업자의 신원을 가져옵니다.
login:
type: url_direct
url_argument: workerId이것이 Potato에서 유일한 MTurk 전용 설정입니다. HIT 생성, 자격, 지급, 승인은 모두 MTurk 쪽에서 이루어집니다.
전체 구성 예시
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: jsonMTurk에서 설정하기
1단계: Potato 서버 시작
공개적으로 접근 가능한 머신에서 Potato 서버를 실행하십시오.
potato start config.yaml -p 8080서버가 인터넷에서 접근 가능한지 확인하십시오(예: https://your-server.com:8080/).
2단계: ExternalQuestion XML 생성
MTurk는 ExternalQuestion이라는 XML 형식을 사용해 외부 웹사이트를 HIT에 임베드합니다. 필요한 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}&assignmentId=${assignmentId}&hitId=${hitId}&turkSubmitTo=${turkSubmitTo}</ExternalURL>
<FrameHeight>800</FrameHeight>
</ExternalQuestion>중요: XML에서는 & 대신 &를 사용하십시오. 작업자가 HIT를 수락하면 MTurk가 ${...} 자리표시자를 실제 값으로 바꿉니다.
3단계: MTurk에서 HIT 생성
MTurk Requester 콘솔을 통해 또는 AWS SDK(boto3)로 프로그래밍 방식으로 HIT를 생성할 수 있습니다. 제목, 설명, 보상, 기간, 자격 같은 HIT 설정은 모두 Potato가 아니라 MTurk 쪽에 있습니다.
boto3 사용(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}&assignmentId=${assignmentId}&hitId=${hitId}&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 샌드박스에서 전체를 테스트하십시오.
| 서비스 | URL |
|---|---|
| Requester Sandbox | https://requestersandbox.mturk.com |
| Worker Sandbox | https://workersandbox.mturk.com |
| API Endpoint (Sandbox) | https://mturk-requester-sandbox.us-east-1.amazonaws.com |
로컬 테스트
MTurk 없이 로컬에서 URL 매개변수 흐름을 테스트할 수 있습니다.
# 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"assignmentId가 ASSIGNMENT_ID_NOT_AVAILABLE이면 작업자는 HIT를 미리보기만 하고 아직 수락하지 않은 상태입니다.
HIT 및 승인 관리
진행 상황 모니터링이든, 할당 승인 또는 거부든, 보너스 지급이든 HIT는 MTurk의 자체 도구를 통해 관리합니다.
- MTurk Requester 콘솔: HIT 관리, 할당 검토, 작업자 메시지 전송을 위한 웹 인터페이스
- boto3(Python용 AWS SDK): 일괄 작업을 위한 프로그래밍 방식 접근
# 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
해 두면 좋은 것들
- 샌드박스에서 시작하십시오. 돈이 오가기 전에 전체 워크플로를 그곳에서 실행하십시오.
- 공정하게 지급하십시오. 시간당 금액(보상 / 예상 시간 x 60)을 계산하고 시간당 $12에서 $15 또는 그 이상을 목표로 하십시오.
- 명확한 HIT 설명을 작성하십시오. 좋은 제목과 설명은 더 나은 작업자를 끌어들입니다.
- 빠르게 승인하십시오. 작업자는 빠른 지급을 알아차리므로 품질이 괜찮아 보이면 곧바로 승인하십시오.
- 거부에 신중하십시오. 거부는 작업자의 승인율과 본인의 requester 평판에 해를 끼치므로 아껴서 사용하십시오.
- HTTPS를 사용하십시오. 일부 브라우저는 혼합 콘텐츠를 차단하며, HTTPS는 iframe이 계속 작동하도록 합니다.
hide_navbar: true를 설정하여 작업자가 Potato 안에서 작업을 벗어나지 않도록 하십시오.- HIT가 유효한 동안 서버를 계속 가동하십시오.
MTurk vs Prolific
| 항목 | MTurk | Prolific |
|---|---|---|
| 작업자 풀 | 크고 다양함 | 더 작고 연구 중심 |
| 품질 | 가변적 | 대체로 높음 |
| 가격 | 낮은 기본료 + 수수료 | 높지만 투명함 |
| 설정 | 더 복잡함 | 더 단순함 |
| 적합한 용도 | 대규모, 예산 | 연구, 품질 |
| Potato 설정 | url_argument: workerId | url_argument: PROLIFIC_PID |
다음으로 갈 곳
- 이것을 Prolific 연동과 비교해 보십시오
- 품질 관리를 설정하십시오
- 어노테이터 간 일치도를 계산하십시오
MTurk 설정의 전체 세부 사항은 원본 문서를 참고하십시오. 더 큰 규모의 크라우드소싱을 진행한다면 크라우드소싱 가이드에서 플랫폼 전반의 작업자 관리와 품질 모니터링을 다룹니다.
MTurk 전체 문서는 /docs/deployment/mturk-integration에 있습니다.