Skip to content
Guides8 min read

Amazon Mechanical Turk पर तैनाती

Amazon Mechanical Turk पर Potato के एनोटेशन कार्य चलाइए, HIT कॉन्फ़िगरेशन, योग्यता परीक्षण, स्वीकृति और अस्वीकृति की प्रक्रिया, बोनस भुगतान और गुणवत्ता की निगरानी।

Potato Team

Amazon Mechanical Turk (MTurk) से आपको एनोटेशन कार्यों के लिए ज़रूरत पड़ने पर बड़ी संख्या में काम करने वाले लोग मिल जाते हैं। Potato MTurk से ExternalQuestion नाम के HIT प्रकार के ज़रिए जुड़ता है: एनोटेशन का इंटरफ़ेस आपका Potato सर्वर होता है, और workers जुटाना, assignment पर नज़र रखना तथा भुगतान करना MTurk सँभालता है। पूरा सेटअप इस तरह होता है।

पहले क्या चाहिए

  1. MTurk चालू किया हुआ एक AWS खाता
  2. requester.mturk.com पर एक MTurk Requester खाता (production या sandbox)
  3. किसी सार्वजनिक URL पर पहुँच में आने वाला Potato सर्वर (HTTPS इस्तेमाल कीजिए)
  4. Potato इंस्टॉल किया हुआ एक Python एनवायरनमेंट
  5. MTurk की अवधारणाओं (HIT, Worker, Assignment) से थोड़ी-बहुत जान-पहचान

इंटीग्रेशन चलता कैसे है

Potato ख़ुद MTurk के HIT नहीं सँभालता। प्रवाह इस तरह चलता है:

  1. आप MTurk पर एक ExternalQuestion HIT बनाते हैं जो आपके Potato सर्वर के URL की ओर इशारा करता है
  2. कोई worker MTurk पर वह HIT स्वीकार करता है और query parameters (workerId, assignmentId, hitId, turkSubmitTo) के साथ आपके Potato सर्वर पर पहुँचा दिया जाता है
  3. Potato workerId parameter पढ़कर worker को पहचानता है (login.type: url_direct के ज़रिए)
  4. worker आपके Potato सर्वर पर एनोटेशन का कार्य करता है
  5. काम ख़त्म होने पर Potato उसे वापस MTurk के submission endpoint पर भेज देता है

कॉन्फ़िगरेशन

MTurk इंटीग्रेशन एक ही बात पर टिका है: login का प्रकार url_direct रखिए और url_argument: workerId दीजिए। इससे Potato समझ जाता है कि worker की पहचान उस URL query parameter से लेनी है जो MTurk अपने आप भेजता है।

yaml
login:
  type: url_direct
  url_argument: workerId

Potato में MTurk से जुड़ी बस यही एक सेटिंग है। HIT बनाना, qualification, भुगतान और स्वीकृति, सब 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 किसी HIT में बाहरी वेबसाइट को ExternalQuestion नाम के XML प्रारूप से जोड़ता है। 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; लिखिए। worker जब HIT स्वीकार करता है, तब MTurk ${...} की जगह असली मान भर देता है।

क़दम 3: MTurk पर HIT बनाइए

HIT आप MTurk Requester Console से बना सकते हैं या AWS SDK (boto3) से प्रोग्राम लिखकर। शीर्षक, विवरण, इनाम, अवधि और qualification जैसी 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: qualification तय कीजिए (MTurk पर)

worker की qualification आप HIT बनाते समय MTurk की तरफ़ तय करते हैं। आम छँटनी इस तरह होती है:

  • Approval rate: HIT स्वीकृति का न्यूनतम प्रतिशत माँगिए, जैसे 97% या उससे ऊपर
  • HITs approved: पहले स्वीकृत हो चुके HIT की न्यूनतम संख्या माँगिए, जैसे 500 या उससे ज़्यादा
  • Locale: कुछ ख़ास देशों के workers तक सीमित कीजिए
  • Masters: MTurk के पहले से परखे हुए Masters workers लीजिए (इसकी क़ीमत ज़्यादा पड़ती है)
  • Custom qualifications: MTurk console से अपने ख़ुद के qualification परीक्षण बनाइए

काम पूरा होने पर

जब कोई worker अपने हिस्से के सारे आइटम निपटा लेता है, तो Potato को उसे वापस MTurk पर भेजना पड़ता है, तभी assignment जमा होता है। MTurk एक turkSubmitTo URL parameter भेजता है, जिससे Potato को पता चलता है कि completion वाली POST request कहाँ भेजनी है।

कार्य ख़त्म करने के बाद worker को एक “Submit HIT” बटन दिखता है। उस पर क्लिक करने से assignment आपकी समीक्षा और स्वीकृति के लिए MTurk को वापस चला जाता है।

MTurk Sandbox में परखना

production में असली पैसा ख़र्च करने से पहले पूरी चीज़ MTurk Sandbox में परख लीजिए।

स्थानीय जाँच

URL parameter वाले प्रवाह को आप 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 होता है, तब worker HIT का पूर्वावलोकन कर रहा है और उसने उसे अभी स्वीकार नहीं किया है।

HIT और स्वीकृतियाँ सँभालना

HIT आप MTurk के अपने औज़ारों से सँभालते हैं, चाहे प्रगति पर नज़र रखनी हो, assignment स्वीकार या अस्वीकार करने हों, या बोनस देना हो:

  • MTurk Requester Console: HIT सँभालने, assignment देखने और workers को संदेश भेजने का वेब इंटरफ़ेस
  • 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.'
)

लागत का हिसाब

workers को दिए जाने वाले इनाम के ऊपर MTurk अपना शुल्क लेता है:

  • आधार शुल्क: इनाम की राशि का 20%
  • Masters qualification: अतिरिक्त 5%
  • प्रति HIT 10 या उससे ज़्यादा assignment: अतिरिक्त 20%

मान लीजिए आप 100 assignment पर प्रति assignment $0.50 देते हैं:

  • आधार लागत: 100 x $0.50 x 1.20 = $60.00
  • Masters के साथ: 100 x $0.50 x 1.25 = $62.50

ये काम कर लेना ठीक रहता है

  1. sandbox से शुरू कीजिए। पैसे का लेन-देन शुरू होने से पहले पूरी प्रक्रिया वहीं चलाकर देख लीजिए।
  2. उचित भुगतान कीजिए। प्रति घंटा दर निकालिए (इनाम / अनुमानित समय x 60) और $12 से $15 प्रति घंटा या उससे बेहतर का लक्ष्य रखिए।
  3. HIT का विवरण साफ़ लिखिए। अच्छे शीर्षक और विवरण बेहतर workers खींचते हैं।
  4. जल्दी स्वीकृति दीजिए। workers को जल्दी भुगतान याद रहता है, इसलिए गुणवत्ता ठीक लगते ही स्वीकृति दे दीजिए।
  5. अस्वीकार करते समय सावधान रहिए। इससे workers की approval rate और आपकी अपनी requester साख, दोनों को नुक़सान होता है, इसलिए इसका इस्तेमाल कम कीजिए।
  6. HTTPS इस्तेमाल कीजिए। कुछ ब्राउज़र mixed content रोक देते हैं, और HTTPS से iframe चलता रहता है।
  7. hide_navbar: true रखिए, ताकि workers Potato के भीतर कार्य से भटककर कहीं और न चले जाएँ।
  8. HIT के पूरे जीवनकाल में अपना सर्वर चालू रखिए।

MTurk बनाम Prolific

पहलूMTurkProlific
Worker poolबड़ा, विविधछोटा, शोध पर केंद्रित
गुणवत्ताघटती-बढ़तीआम तौर पर बेहतर
क़ीमतआधार कम, + शुल्कज़्यादा, पारदर्शी
सेटअपज़्यादा उलझा हुआआसान
किसके लिए बेहतरबड़ा पैमाना, कम बजटशोध, गुणवत्ता
Potato configurl_argument: workerIdurl_argument: PROLIFIC_PID

अगले क़दम

MTurk सेटअप के पूरे ब्योरे के लिए स्रोत दस्तावेज़ देखें। अगर आप बड़े पैमाने पर crowdsourcing कर रहे हैं, तो crowdsourcing गाइड में अलग-अलग प्लेटफ़ॉर्म पर worker प्रबंधन और गुणवत्ता की निगरानी का ब्योरा है।


MTurk के पूरे दस्तावेज़ MTurk एकीकरण पर हैं।