Skip to content
Guides7 min read

Auf Amazon Mechanical Turk bereitstellen

Potato-Annotationsaufgaben auf Amazon Mechanical Turk laufen lassen: HITs konfigurieren, Qualifikationstests, Freigabe und Ablehnung, Bonuszahlungen und Qualitätsüberwachung.

Potato Team

Amazon Mechanical Turk (MTurk) verschafft dir kurzfristig viele Arbeitende für Annotationsaufgaben. Potato hängt sich über den HIT-Typ ExternalQuestion an MTurk an: Dein Potato-Server ist die Annotationsoberfläche, MTurk kümmert sich um die Anwerbung, die Verwaltung der Assignments und die Bezahlung. So richtest du das Ganze ein.

Voraussetzungen

  1. Ein AWS-Konto mit aktiviertem MTurk
  2. Ein MTurk-Requester-Konto (Produktion oder Sandbox) unter requester.mturk.com
  3. Ein Potato-Server, der unter einer öffentlichen URL erreichbar ist (nimm HTTPS)
  4. Eine Python-Umgebung mit installiertem Potato
  5. Etwas Vertrautheit mit den MTurk-Begriffen (HITs, Workers, Assignments)

Wie die Anbindung funktioniert

Potato verwaltet die MTurk-HITs nicht selbst. Der Ablauf sieht so aus:

  1. Du legst auf MTurk einen ExternalQuestion-HIT an, der auf die URL deines Potato-Servers zeigt
  2. Eine arbeitende Person nimmt den HIT auf MTurk an und landet per Weiterleitung mit Query-Parametern auf deinem Potato-Server (workerId, assignmentId, hitId, turkSubmitTo)
  3. Potato liest den Parameter workerId aus und identifiziert darüber die Person (über login.type: url_direct)
  4. Die Person bearbeitet die Annotationsaufgabe auf deinem Potato-Server
  5. Am Ende leitet Potato sie zurück an den Submission-Endpunkt von MTurk

Konfiguration

Die MTurk-Anbindung läuft auf eine Sache hinaus: den Login-Typ auf url_direct setzen, mit url_argument: workerId. Damit weiß Potato, dass es die Identität aus dem Query-Parameter der URL zieht, den MTurk automatisch mitgibt.

yaml
login:
  type: url_direct
  url_argument: workerId

Mehr MTurk-Spezifisches gibt es in Potato nicht. HITs anlegen, Qualifikationen, Bezahlung und Freigabe passieren alle auf der MTurk-Seite.

Vollständiges Konfigurationsbeispiel

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

Einrichtung auf MTurk

Schritt 1: Potato-Server starten

Starte deinen Potato-Server auf einer öffentlich erreichbaren Maschine:

bash
potato start config.yaml -p 8080

Vergewissere dich, dass der Server aus dem Internet erreichbar ist (zum Beispiel unter https://your-server.com:8080/).

Schritt 2: Das ExternalQuestion-XML erstellen

MTurk bindet externe Websites über ein XML-Format namens ExternalQuestion in einen HIT ein. Das brauchst du dafür:

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>

Wichtig: Nimm im XML &amp; statt &. MTurk ersetzt die Platzhalter ${...} durch echte Werte, sobald jemand den HIT annimmt.

Schritt 3: Den HIT auf MTurk anlegen

HITs legst du über die MTurk Requester Console an oder programmatisch mit dem AWS SDK (boto3). Einstellungen wie Titel, Beschreibung, Vergütung, Laufzeit und Qualifikationen liegen auf der MTurk-Seite, nicht in Potato.

Mit 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']}")

Schritt 4: Qualifikationen setzen (auf MTurk)

Die Qualifikationen der Arbeitenden legst du beim Anlegen des HIT auf der MTurk-Seite fest. Übliche Filter:

  • Approval Rate: einen Mindestanteil freigegebener HITs verlangen, etwa 97 % oder mehr
  • Freigegebene HITs: eine Mindestzahl bereits freigegebener HITs verlangen, etwa 500 oder mehr
  • Locale: auf Arbeitende aus bestimmten Ländern beschränken
  • Masters: die von MTurk vorab geprüften Masters einsetzen (kostet mehr)
  • Eigene Qualifikationen: eigene Qualifikationstests über die MTurk-Konsole bauen

Abschluss der Aufgabe

Wenn jemand alle zugeteilten Elemente bearbeitet hat, muss Potato die Person zurück an MTurk leiten, damit das Assignment eingereicht wird. MTurk übergibt dafür den URL-Parameter turkSubmitTo, der Potato sagt, wohin die POST-Anfrage für den Abschluss geht.

Nach dem Ende der Aufgabe erscheint ein Button zum Einreichen des HIT. Ein Klick darauf schickt das Assignment zurück an MTurk, wo du es prüfst und freigibst.

In der MTurk Sandbox testen

Teste den ganzen Ablauf in der MTurk Sandbox, bevor in der Produktion echtes Geld fließt.

Lokal testen

Den Ablauf mit den URL-Parametern kannst du auch lokal ohne MTurk testen:

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"

Steht in assignmentId der Wert ASSIGNMENT_ID_NOT_AVAILABLE, sieht sich die Person den HIT nur in der Vorschau an und hat ihn noch nicht angenommen.

HITs und Freigaben verwalten

HITs verwaltest du mit den Werkzeugen von MTurk selbst, egal ob du den Fortschritt beobachtest, Assignments freigibst oder ablehnst oder Boni auszahlst:

  • MTurk Requester Console: eine Weboberfläche, um HITs zu verwalten, Assignments zu prüfen und Arbeitenden zu schreiben
  • boto3 (das AWS SDK für Python): programmatischer Zugriff für Massenoperationen
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.'
)

Kosten berechnen

MTurk erhebt Gebühren zusätzlich zu der Vergütung, die du auszahlst:

  • Grundgebühr: 20 % der Vergütung
  • Masters-Qualifikation: 5 % obendrauf
  • 10 oder mehr Assignments pro HIT: 20 % obendrauf

Ein Beispiel: Bei $0.50 pro Assignment und 100 Assignments

  • Grundkosten: 100 x $0.50 x 1.20 = $60.00
  • Mit Masters: 100 x $0.50 x 1.25 = $62.50

Was sich lohnt

  1. Fang in der Sandbox an. Spiel den kompletten Ablauf dort durch, bevor Geld fließt.
  2. Zahl fair. Rechne den Stundensatz aus (Vergütung / geschätzte Dauer x 60) und ziel auf $12 bis $15 pro Stunde oder mehr.
  3. Schreib verständliche HIT-Beschreibungen. Gute Titel und Beschreibungen ziehen bessere Arbeitende an.
  4. Gib zügig frei. Schnelle Bezahlung fällt auf, also gib frei, sobald die Qualität passt.
  5. Sei vorsichtig mit Ablehnungen. Sie schaden der Approval Rate der Arbeitenden und deinem eigenen Ruf als Requester, nutze sie also sparsam.
  6. Nimm HTTPS. Manche Browser blockieren gemischte Inhalte, und mit HTTPS funktioniert der Iframe weiter.
  7. Setz hide_navbar: true, damit niemand innerhalb von Potato von der Aufgabe abschweift.
  8. Halte deinen Server über die gesamte Laufzeit des HIT online.

MTurk und Prolific im Vergleich

AspektMTurkProlific
Pool an ArbeitendenGroß, vielfältigKleiner, forschungsnah
QualitätSchwankendMeist höher
PreiseNiedrigere Basis, + GebührenHöher, transparent
EinrichtungAufwendigerEinfacher
Passt zuGroße Mengen, knappes BudgetForschung, Qualität
Potato-Konfigurationurl_argument: workerIdurl_argument: PROLIFIC_PID

Wie es weitergeht

Alle Details zur MTurk-Einrichtung stehen in der Quelldokumentation. Wenn du eine größere Crowdsourcing-Studie fährst, behandelt der Crowdsourcing-Leitfaden den Umgang mit Arbeitenden und die Qualitätsüberwachung über Plattformen hinweg.


Vollständige MTurk-Dokumentation unter MTurk-Integration.