Развёртывание на Amazon Mechanical Turk
Запуск задач разметки Potato на Amazon Mechanical Turk: настройка HIT, квалификационные тесты, приём и отклонение работ, бонусные выплаты и наблюдение за качеством.
Amazon Mechanical Turk (MTurk) даёт большую рабочую силу по требованию для задач разметки. Potato подключается к MTurk через тип HIT ExternalQuestion: ваш сервер Potato служит интерфейсом разметки, а MTurk берёт на себя набор исполнителей, учёт заданий и выплаты. Вот как всё это настроить.
Что понадобится
- Аккаунт AWS с включённым MTurk
- Аккаунт заказчика MTurk (боевой или песочница) на requester.mturk.com
- Сервер Potato, доступный по публичному URL (используйте HTTPS)
- Окружение Python с установленным Potato
- Некоторое знакомство с понятиями MTurk (HIT, исполнители, задания)
Как работает интеграция
Potato не управляет HIT'ами MTurk напрямую. Процесс выглядит так:
- Вы создаёте на MTurk HIT типа ExternalQuestion, указывающий на URL вашего сервера Potato
- Исполнитель принимает HIT на MTurk и попадает на ваш сервер Potato с параметрами запроса (
workerId,assignmentId,hitId,turkSubmitTo) - Potato читает параметр
workerId, чтобы опознать исполнителя (черезlogin.type: url_direct) - Исполнитель выполняет задачу разметки на вашем сервере Potato
- По завершении Potato отправляет его обратно на эндпоинт отправки MTurk
Конфигурация
Интеграция с MTurk сводится к одному: задайте тип входа url_direct с url_argument: workerId. Это говорит Potato брать личность исполнителя из параметра URL, который MTurk передаёт автоматически.
login:
type: url_direct
url_argument: workerIdЭто единственная настройка, специфичная для MTurk, на стороне Potato. Создание 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: jsonНастройка на стороне MTurk
Шаг 1: запустите сервер Potato
Поднимите сервер Potato на машине, доступной извне:
potato start config.yaml -p 8080Убедитесь, что сервер доступен из интернета (например, https://your-server.com:8080/).
Шаг 2: подготовьте XML ExternalQuestion
MTurk встраивает внешние сайты в HIT форматом XML под названием ExternalQuestion. Вот нужный вам 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 используйте & вместо &. Подстановки ${...} MTurk заменит реальными значениями, когда исполнитель примет HIT.
Шаг 3: создайте HIT на MTurk
HIT можно создать через консоль заказчика MTurk или программно через AWS SDK (boto3). Настройки HIT — заголовок, описание, вознаграждение, длительность и квалификации — живут на стороне MTurk, а не в Potato.
Через 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)
Квалификации исполнителей задаются на стороне MTurk при создании HIT. Частые фильтры:
- Доля принятых работ: требовать минимальный процент принятых HIT, скажем 97% и выше
- Число принятых HIT: требовать минимальное количество ранее принятых работ, скажем 500 и больше
- Локаль: ограничить исполнителями из определённых стран
- Masters: использовать заранее отобранных исполнителей MTurk уровня Masters (это дороже)
- Свои квалификации: собрать собственные квалификационные тесты через консоль MTurk
Обработка завершения
Когда исполнитель заканчивает все назначенные объекты, Potato должен вернуть его на MTurk, чтобы задание было отправлено. MTurk передаёт параметр URL turkSubmitTo, который говорит Potato, куда слать POST-запрос о завершении.
После выполнения задачи исполнитель видит кнопку «Submit HIT». Клик по ней отправляет задание обратно на MTurk для вашей проверки и приёмки.
Тестирование в песочнице MTurk
Прогоните всё целиком в песочнице MTurk, прежде чем тратить настоящие деньги в бою.
| Сервис | URL |
|---|---|
| Песочница заказчика | https://requestersandbox.mturk.com |
| Песочница исполнителя | https://workersandbox.mturk.com |
| Эндпоинт API (песочница) | https://mturk-requester-sandbox.us-east-1.amazonaws.com |
Локальное тестирование
Поток параметров URL можно проверить локально, без MTurk:
# 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: веб-интерфейс для управления HIT'ами, разбора заданий и переписки с исполнителями
- boto3 (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%
- 10 и более заданий на HIT: ещё 20%
Например, если вы платите $0,50 за задание при 100 заданиях:
- Базовая стоимость: 100 × $0,50 × 1,20 = $60,00
- С Masters: 100 × $0,50 × 1,25 = $62,50
Рекомендации
- Начинайте с песочницы. Прогоните там весь процесс до того, как деньги перейдут из рук в руки.
- Платите справедливо. Посчитайте почасовую ставку (вознаграждение / оценочное время × 60) и целитесь в $12–15 в час или выше.
- Пишите понятные описания HIT. Хорошие заголовки и описания притягивают более сильных исполнителей.
- Принимайте работы быстро. Исполнители замечают скорость оплаты, так что принимайте, как только качество выглядит нормальным.
- С отклонениями будьте осторожны. Они портят исполнителям долю принятых работ и вашу репутацию заказчика, так что пользуйтесь ими редко.
- Используйте HTTPS. Некоторые браузеры блокируют смешанное содержимое, а HTTPS сохраняет работоспособность iframe.
- Поставьте
hide_navbar: true, чтобы исполнители не разбредались по Potato за пределы задачи. - Держите сервер поднятым всё время жизни HIT.
MTurk против Prolific
| Аспект | MTurk | Prolific |
|---|---|---|
| Пул исполнителей | Большой, разнородный | Меньше, ориентирован на исследования |
| Качество | Разное | В целом выше |
| Цены | Ниже база, плюс комиссии | Выше, но прозрачнее |
| Настройка | Сложнее | Проще |
| Для чего лучше | Большие объёмы, ограниченный бюджет | Исследования, качество |
| Конфигурация Potato | url_argument: workerId | url_argument: PROLIFIC_PID |
Что дальше
- Сравните это с интеграцией с Prolific
- Настройте контроль качества
- Посчитайте согласованность разметчиков
Полные подробности настройки MTurk — в исходной документации. Если вы разворачиваете более крупную краудсорсинговую работу, руководство по краудсорсингу разбирает управление исполнителями и наблюдение за качеством на разных платформах.
Полная документация по MTurk — в интеграции с MTurk.