Skip to content
Announcements9 min read

Potato 2.11: लेबलिंग इंजन और प्रमाणित मशीन लेबल

Potato 2.11 मॉडलों से डेटासेट पर लेबल लगाता है, मशीन लेबलों को ब्लाइंड मानव नमूने पर परखता है और प्रमाणपत्र लिखता है। निष्क्रिय सत्र अब 8 घंटे बाद साइन आउट होते हैं।

Potato Team

Potato 2.11 में लेबलिंग इंजन जुड़ा है, जो मॉडलों से किसी डेटासेट पर लेबल लगाता है और मानव लेबलों के एक ब्लाइंड यादृच्छिक नमूने से मापता है कि मॉडल कितनी बार गलत होते हैं। तैयार लेबलों को कौन-सी शर्त पूरी करनी है, यह आप बताते हैं, जैसे कि स्वीकार किए गए मशीन लेबलों में से अधिकतम 10% गलत हों, 90% विश्वास के साथ। इंजन वे मशीन लेबल स्वीकार करता है जिनका समर्थन कोई सांख्यिकीय परीक्षण करता है, बचे हुए आइटम लोगों के पास भेजता है, और एक प्रमाणपत्र लिखता है जिसमें दर्ज होता है कि क्या परखा गया और कितने मानव लेबलों पर। इस रिलीज़ में सहमति रिपोर्ट 3D ऑब्जेक्ट, टेम्पोरल ग्राउंडिंग, टियर्ड एनोटेशन और एजेंट ट्रेस तक भी पहुँचती है, और इमेज की एक गड़बड़ी ठीक की गई है जिसके कारण अनछुए आइटम उत्तर दिए गए गिने जा सकते थे।

bash
pip install --upgrade potato-annotation

अपग्रेड से जुड़ी बातें

निष्क्रिय सत्र अब साइन आउट हो जाते हैं, डिफ़ॉल्ट रूप से 8 घंटे बाद। 2.11 से पहले, चलते हुए ऐप पर session_timeout_minutes का कोई असर नहीं होता था, क्योंकि जाँच एक ऐसे ऐप ऑब्जेक्ट पर दर्ज की जाती थी जिसे potato start छोड़ देता है। अब जो सत्र इस सेटिंग से ज़्यादा देर तक निष्क्रिय रहता है, वह साफ़ हो जाता है, और उसका अगला अनुरोध लॉगिन पेज पर जाता है। जो कियॉस्क और साझा लैब मशीनें रात भर साइन इन रहती हैं, उन पर साइन आउट होने लगेंगे, इसलिए जहाँ किसी अध्ययन को साइन इन बने रहने की ज़रूरत हो, वहाँ session_timeout_minutes बढ़ा दें। पहले से सहेजे गए एनोटेशन पर कोई असर नहीं पड़ता।

तीन पुरानी कुंजियाँ स्टार्टअप पर एक सूचना छापती हैं। icl_labeling, judge_calibration और pre_annotation ठीक पहले की तरह काम करती रहती हैं, और हर एक stderr पर NOTE: से शुरू होने वाली एक पंक्ति छापती है जिसमें उसके इंजन समकक्ष का नाम होता है। ये सूचनाएँ केवल जानकारी के लिए हैं, इसलिए potato validate --strict इन पर विफल नहीं होता। इन कुंजियों को 3.0 में हटाने की योजना है, और potato label migrate-config आपके लिए समकक्ष labeling_engine ब्लॉक लिख देता है।

लेबलिंग इंजन

इंजन उन अध्ययनों के लिए है जिनमें इतने आइटम हैं जितनों पर लोग लेबल नहीं लगा सकते, और एक ऐसा मॉडल है जो ज़्यादातर सही होता है। यह मॉडलों को स्रोत मानता है, जिन्हें आपकी सूची के क्रम में एक कैस्केड में आज़माया जाता है, और आखिरी स्रोत के बाद आइटम किसी व्यक्ति के पास भेजता है। स्रोत LLM, विज़न-लैंग्वेज मॉडल, Laya जैसे निर्णय मॉडल, YOLO डिटेक्टर, LLM जज, ज्यूरी, अध्ययन के अपने लेबलों पर प्रशिक्षित मॉडल, या आपके पास पहले से मौजूद लेबल हो सकते हैं।

कॉन्ट्रैक्ट वह है जिसे इंजन परखता है। मुख्य कॉन्ट्रैक्ट, selective_risk, स्वीकार किए गए उन मशीन लेबलों के हिस्से को सीमित करता है जो गलत हैं। इंजन ब्लाइंड नमूने के आधे हिस्से पर एक विश्वास थ्रेशोल्ड चुनता है और दूसरे आधे पर उसे एकपक्षीय द्विपद परीक्षण से परखता है, जिसमें फ़िक्स्ड-सीक्वेंस Learn-then-Test का उपयोग होता है। हर नया परीक्षण ज़्यादा सख्त स्तर पर चलता है, इसलिए किसी परीक्षण के पास होने तक बार-बार प्रमाणित करने से विश्वास बढ़ा-चढ़ा नहीं दिखता। ppi कॉन्ट्रैक्ट हर लेबल की व्यापकता को prediction-powered inference से बने एक अंतराल के साथ बताता है, जो मॉडल की गुणवत्ता चाहे जैसी हो, मान्य रहता है। no_worse_than_human किसी व्यक्ति या जज की जगह मॉडल रखने के लिए alternative annotator test चलाता है, और distributional मॉडल के लेबल वितरण की तुलना इस बात से करता है कि व्यक्तिपरक आइटमों पर लोग किस तरह बँटते हैं।

किसी सेंटिमेंट स्कीमा पर एक LLM को प्रमाणित करने वाला कॉन्फ़िग एक सामान्य अध्ययन में दो कुंजियाँ जोड़ता है:

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  sources:
    - id: gemma
      kind: llm
      endpoint_type: vllm
      model: google/gemma-4-12B-it-qat-w4a16-ct
      base_url: http://localhost:8001/v1
      confidence: {method: logprob}
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9
  budgets:
    human_labels: 400

confidence: {method: logprob} मॉडल का विश्वास उसकी टोकन प्रायिकताओं से पढ़ता है। इसमें प्रति आइटम एक कॉल लगती है, और इंजन के विश्वास तरीकों में यह आम तौर पर सबसे अच्छी तरह कैलिब्रेटेड होता है। कॉन्ट्रैक्ट स्वीकार किए गए लेबलों में से अधिकतम 10% को गलत होने देता है, और इसका 90% विश्वास Potato का डिफ़ॉल्ट है। budgets.human_labels यह सीमा तय करता है कि इंजन लोगों से कितने अनुरोध खोल सकता है, और 400 वही सीमा है जो Potato के साथ आने वाला टेक्स्ट उदाहरण उपयोग करता है।

Potato के साथ आने वाला टेक्स्ट उदाहरण 481 समीक्षाओं को एक कैस्केड से गुज़ारता है जिसमें Laya, Gemma 12B से पहले है। उस रन में 10% वाला कॉन्ट्रैक्ट 165 मानव लेबलों पर पूरा हुआ, और इंजन ने 316 मशीन लेबल स्वीकार किए। ये सभी Gemma से आए, क्योंकि Laya का थ्रेशोल्ड कभी तय नहीं हुआ। संदर्भ लेबलों के मुकाबले उनकी मापी गई त्रुटि 7.6% थी। एजेंट-ट्रेस उदाहरण में संदर्भ परिणामों वाले 288 सिंथेटिक ट्रेस हैं। जज उनमें से 80% पर सही था, लेकिन उसने हर फ़ैसले को 1.0 का विश्वास दिया, इसलिए selective_risk के पास थ्रेशोल्ड लगाने के लिए कुछ नहीं था और वह अव्यवहार्य बना रहा। उसी डेटा से कार्य-सफलता का PPI अंतराल, [0.57, 0.76], 0.60 की संदर्भ दर को समेटता था, जबकि अकेला जज 0.76 बता रहा था।

पूरे हुए कॉन्ट्रैक्ट की सीमाएँ

पूरा हुआ कॉन्ट्रैक्ट उन लोगों से सहमति के बारे में एक कथन है जिन्होंने नमूने पर लेबल लगाए। इंजन यह नहीं जाँचता कि वे लोग सही हैं, इसलिए लापरवाह एनोटेटरों पर परखा गया कॉन्ट्रैक्ट लापरवाह एनोटेटरों से सहमति को प्रमाणित करता है। तीन नियम उस कथन को सही ठहराते हैं। कैलिब्रेशन अनुरोध ब्लाइंड होते हैं, इसलिए जब तक किसी व्यक्ति के पास ऐसा अनुरोध है, पेज कोई प्री-एनोटेशन, जज का फ़ैसला या AI सहायता नहीं दिखाता। थ्रेशोल्ड नमूने के एक आधे हिस्से पर चुने जाते हैं और दूसरे पर परखे जाते हैं। केवल मानव लेबल प्रमाणित करते हैं, और किसी स्रोत, प्रॉम्प्ट या स्कीमा में कोई भी बदलाव प्रभावित कॉन्ट्रैक्टों को stale चिह्नित कर देता है, जब तक उन्हें दोबारा परखा न जाए।

इंजन के इंटरफ़ेस

हर इंटरफ़ेस के पीछे वही engine.sqlite फ़ाइल है, इसलिए आप किसी अध्ययन को एक इंटरफ़ेस में शुरू करके दूसरे में प्रमाणित कर सकते हैं:

  • कमांड लाइन पर potato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config;
  • /api/engine/v1 के तहत एक REST API;
  • MCP सर्वर में पाँच engine_* टूल;
  • Python में potato.labeling_engine.sdk.Study; और
  • /admin/labeling-engine पर एक एडमिन पेज, जिसमें कॉन्ट्रैक्ट की स्थिति, त्रुटि बनाम कवरेज वक्र, हर स्रोत के लिए एक विश्वसनीयता आरेख, और मॉडल-कॉल लॉग है।

potato label export लेबलों को उनके स्रोत-विवरण के साथ लिखता है, साथ में JSON, Markdown और HTML में प्रमाणपत्र, एक डेटासेट कार्ड और कॉल लॉग। लेबलिंग इंजन पहले अध्ययन को कदम-दर-कदम समझाता है, और लेबलिंग इंजन कॉन्ट्रैक्ट बताता है कि हर कॉन्ट्रैक्ट क्या परखता है और कैसे विफल होता है।

Solo Mode

Solo Mode अब अपना सुझाव छिपा सकता है। solo_mode.suggestions हर आइटम पर या एक यादृच्छिक नमूने पर LLM का लेबल रोक कर रखता है। स्क्रीन पर दिखता सुझाव उत्तर को अपनी ओर खींचता है, इसलिए हैंडऑफ़ ब्लाइंड आइटमों पर सहमति पढ़ता है। निर्णय मॉडल (laya और कोई भी /v1/systemone सर्वर) एक तेज़ पहला स्तर बन सकते हैं, और Solo Mode लेबलिंग शुरू होने से पहले और हर बैच से पहले प्रोजेक्ट का ai_budget.cap_usd जाँचता है। एक गोल्ड सेट, एक लेबलिंग ज्यूरी और करिकुलम क्रम भी नए हैं। जब इंजन चालू होता है, तो Solo Mode अपनी भविष्यवाणियाँ इंजन के स्टोर में लिखता है, ताकि इंजन उन्हें कैलिब्रेट और प्रमाणित कर सके। कॉन्फ़िग Solo Mode में हैं।

सहमति

/admin/iaa अब spatial_annotation, temporal_grounding, tiered_annotation और पाँच एजेंट-ट्रेस स्कीमा पर सहमति बताता है, जिन्हें वह पहले असमर्थित बताकर छोड़ देता था। 3D ऑब्जेक्ट और समय सेगमेंट को एक औसत मैच्ड-सेट सहमति मिलती है, जो संयोग-संशोधित नहीं है, और एजेंट-ट्रेस के चरणों को Krippendorff's alpha और Cohen's kappa मिलते हैं, जिनमें हर ट्रेस का हर चरण एक इकाई है। /admin/api/agreement अब संरचित स्कीमा की रिपोर्ट नहीं देता और इसके बजाय /admin/iaa की ओर इशारा करता है, क्योंकि लेबल नामों तक सिमटकर वे स्कीमा एनोटेटरों की हर जोड़ी के बीच पूर्ण सहमति दिखाते थे। दो एक जैसे शून्य-लंबाई वाले सेगमेंट अब सहमत गिने जाते हैं। Publishing और Paper Mode मशीन रेटरों को गोल्ड लेबलों और सहमति के आँकड़ों से बाहर रखते हैं।

2.10 के अध्ययनों पर असर डालने वाले सुधार

तीन सुधार उन संख्याओं को बदल सकते हैं जो आप पहले ही एकत्र कर चुके हैं या रिपोर्ट कर चुके हैं:

  • इमेज पेज पहले से भरा उत्तर अपने आप सहेज लेता था। pre_annotation वाली image_annotation स्कीमा पर, लोड होने के बाद कैनवस जब अपना लेआउट दोबारा बनाता था, तो वह पहले से भरी आकृतियों को एनोटेटर के उत्तर के रूप में सहेज लेता था, इसलिए अनछुआ आइटम उत्तर दिया गया गिना जाता था। प्री-एनोटेशन वाले 2.10 के इमेज अध्ययन में, जिस आइटम की सहेजी गई आकृतियाँ उसके प्री-एनोटेशन से हूबहू मेल खाती हैं, उसे शायद कभी छुआ ही न गया हो, इसलिए ऐसे आइटमों को बिना समीक्षा वाला मानें, जब तक कि आपका टाइमिंग डेटा कुछ और न दिखाए।
  • Paper Mode अपने कोड से kappa निकालता था। Paper Mode और सहमति मॉड्यूल अब Cohen's kappa उसी फ़ंक्शन से निकालते हैं जिससे /admin/iaa, इसलिए 2.11 से पहले Paper Mode से रिपोर्ट किया गया kappa उसी डेटा के लिए /admin/iaa के दिखाए kappa से अलग हो सकता है।
  • न्यायनिर्णयन और Prolific ऑटो-स्केलिंग मशीन रेटरों को गिनते थे। मशीन एनोटेटर किसी आइटम को न्यायनिर्णयन के लिए भेज सकते थे, min_human_annotations को अनदेखा किया जाता था, और Prolific ऑटो-स्केलिंग मशीन एनोटेशन को प्रति-आइटम सीमाओं में गिनती थी।

बाकी सुधार यह बदलते हैं कि कोई अध्ययन क्या कर सकता है। ऐसे होस्ट की इमेज, जो कोई CORS हेडर नहीं भेजते, जैसे cocodataset.org, अब लोड होती हैं। ऐसी इमेज पर, फ़्लड फ़िल, SAM और टेक्स्ट-प्रॉम्प्ट सेगमेंटेशन अब बताते हैं कि वे उसे क्यों नहीं पढ़ सकते। बिना color वाली प्री-एनोटेटेड आकृति हटाए जाने के बजाय अपने लेबल का रंग ले लेती है। Solo Mode का "Generate prompt" अब पहला प्रॉम्प्ट लिखने के लिए रिविज़न मॉडल से कहता है। potato mcp connect पर इनकार अब सफलता के बजाय टूल त्रुटियों के रूप में लौटते हैं। एज-केस खोज अब vLLM पर काम करती है, जो एज-केस फ़ील्ड तब तक नहीं लौटाता था जब तक उन्हें रिस्पॉन्स स्कीमा में नहीं जोड़ा गया।

2.11 इंस्टॉल करना

pip install --upgrade potato-annotation से अपग्रेड करें, या ghcr.io/davidjurgens/potato:2.11.0 पुल करें। इन-प्रोसेस Laya निर्णय मॉडल को नया decision एक्स्ट्रा चाहिए, pip install 'potato-annotation[decision]', जो all से बाहर रहता है क्योंकि वह torch खींच लाता है। रिलीज़ नोट्स में हर बदलाव की सूची है, और What's New में हर 2.x रिलीज़ का सारांश है।