Skip to content
Guides6 min read

Развёртывание на Amazon Mechanical Turk

Запуск задач разметки Potato на Amazon Mechanical Turk: настройка HIT, квалификационные тесты, приём и отклонение работ, бонусные выплаты и наблюдение за качеством.

Potato Team

Amazon Mechanical Turk (MTurk) даёт большую рабочую силу по требованию для задач разметки. Potato подключается к MTurk через тип HIT ExternalQuestion: ваш сервер Potato служит интерфейсом разметки, а MTurk берёт на себя набор исполнителей, учёт заданий и выплаты. Вот как всё это настроить.

Что понадобится

  1. Аккаунт AWS с включённым MTurk
  2. Аккаунт заказчика MTurk (боевой или песочница) на requester.mturk.com
  3. Сервер Potato, доступный по публичному URL (используйте HTTPS)
  4. Окружение Python с установленным Potato
  5. Некоторое знакомство с понятиями MTurk (HIT, исполнители, задания)

Как работает интеграция

Potato не управляет HIT'ами MTurk напрямую. Процесс выглядит так:

  1. Вы создаёте на MTurk HIT типа ExternalQuestion, указывающий на URL вашего сервера Potato
  2. Исполнитель принимает HIT на MTurk и попадает на ваш сервер Potato с параметрами запроса (workerId, assignmentId, hitId, turkSubmitTo)
  3. Potato читает параметр workerId, чтобы опознать исполнителя (через login.type: url_direct)
  4. Исполнитель выполняет задачу разметки на вашем сервере Potato
  5. По завершении Potato отправляет его обратно на эндпоинт отправки MTurk

Конфигурация

Интеграция с MTurk сводится к одному: задайте тип входа url_direct с url_argument: workerId. Это говорит Potato брать личность исполнителя из параметра URL, который MTurk передаёт автоматически.

yaml
login:
  type: url_direct
  url_argument: workerId

Это единственная настройка, специфичная для MTurk, на стороне Potato. Создание 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: подготовьте XML ExternalQuestion

MTurk встраивает внешние сайты в HIT форматом XML под названием ExternalQuestion. Вот нужный вам 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; вместо &. Подстановки ${...} MTurk заменит реальными значениями, когда исполнитель примет HIT.

Шаг 3: создайте HIT на MTurk

HIT можно создать через консоль заказчика MTurk или программно через AWS SDK (boto3). Настройки HIT — заголовок, описание, вознаграждение, длительность и квалификации — живут на стороне MTurk, а не в Potato.

Через 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)

Квалификации исполнителей задаются на стороне 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:

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"

Когда assignmentId равен ASSIGNMENT_ID_NOT_AVAILABLE, исполнитель просматривает HIT и ещё не принял его.

Управление HIT'ами и приёмкой

HIT'ами вы управляете собственными средствами MTurk — будь то наблюдение за прогрессом, приём или отклонение заданий или начисление бонусов:

  • Консоль заказчика MTurk: веб-интерфейс для управления HIT'ами, разбора заданий и переписки с исполнителями
  • boto3 (AWS SDK для Python): программный доступ для пакетных операций
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

Рекомендации

  1. Начинайте с песочницы. Прогоните там весь процесс до того, как деньги перейдут из рук в руки.
  2. Платите справедливо. Посчитайте почасовую ставку (вознаграждение / оценочное время × 60) и целитесь в $12–15 в час или выше.
  3. Пишите понятные описания HIT. Хорошие заголовки и описания притягивают более сильных исполнителей.
  4. Принимайте работы быстро. Исполнители замечают скорость оплаты, так что принимайте, как только качество выглядит нормальным.
  5. С отклонениями будьте осторожны. Они портят исполнителям долю принятых работ и вашу репутацию заказчика, так что пользуйтесь ими редко.
  6. Используйте HTTPS. Некоторые браузеры блокируют смешанное содержимое, а HTTPS сохраняет работоспособность iframe.
  7. Поставьте hide_navbar: true, чтобы исполнители не разбредались по Potato за пределы задачи.
  8. Держите сервер поднятым всё время жизни HIT.

MTurk против Prolific

АспектMTurkProlific
Пул исполнителейБольшой, разнородныйМеньше, ориентирован на исследования
КачествоРазноеВ целом выше
ЦеныНиже база, плюс комиссииВыше, но прозрачнее
НастройкаСложнееПроще
Для чего лучшеБольшие объёмы, ограниченный бюджетИсследования, качество
Конфигурация Potatourl_argument: workerIdurl_argument: PROLIFIC_PID

Что дальше

Полные подробности настройки MTurk — в исходной документации. Если вы разворачиваете более крупную краудсорсинговую работу, руководство по краудсорсингу разбирает управление исполнителями и наблюдение за качеством на разных платформах.


Полная документация по MTurk — в интеграции с MTurk.