Skip to content

Configuration du moteur d'étiquetage

Toutes les clés du bloc labeling_engine : sources et méthodes de confiance, pools humains, dépenses de crowdsourcing, budgets, limites d'exécution, fonctionnalités et ce que la validation refuse.

Tout ce que fait le moteur d'étiquetage se règle dans un seul bloc labeling_engine. Un bloc invalide arrête le serveur au démarrage et liste tous les problèmes d'un coup. Pour que les annotateurs reçoivent les demandes du moteur, définissez aussi assignment_strategy: engine. Choisir cette stratégie sans moteur activé est une erreur de validation.

Le bloc comporte les sections suivantes, chacune décrite plus bas :

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  schemas: [sentiment]            # default: every scheme a source can label
  sources: []
  cascade: [laya, gemma]          # default: the first source alone
  contracts: []
  humans: {}
  crowd: {}
  budgets: {}
  runtime: {}
  features: {}
  redaction: {}
  distill: {}

Clés de premier niveau

Cinq clés se placent directement sous labeling_engine :

CléDéfautSignification
enabledfalseActive le moteur. Un moteur activé a besoin d'au moins une source.
schemastousLes schémas d'annotation que le moteur étiquette. Sous assignment_strategy: engine, un schéma omis n'est rempli que sur les items que le moteur envoie à des personnes pour ses propres schémas, et non sur chaque item, et la validation le signale par un avertissement. Un schéma qu'aucune source ne peut étiqueter (le texte libre, par exemple) ne peut pas faire partie du moteur, et sous cette stratégie il n'est donc jamais rempli sur chaque item. Utilisez une autre stratégie d'attribution s'il doit l'être.
sources[]Les modèles. Voir Sources.
cascadepremière sourceIdentifiants des sources dans l'ordre où elles sont essayées. Les personnes viennent après la dernière.
contracts[]Ce que les étiquettes doivent respecter. Voir Contrats.

Sources

Une source est un modèle, ou un ensemble d'étiquettes existantes, qui propose une étiquette et une confiance pour chaque item. Chaque source a un id unique et un kind, et une clé inconnue sur une source est une erreur :

CléDéfautSignification
idobligatoireNom utilisé dans cascade, le journal des appels et le certificat.
kindobligatoireL'un de llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator.
endpoint_typeobligatoire pour llm, vlm, decision, judgeLe point de terminaison IA, par exemple vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya ou systemone. detector vaut yolo par défaut.
modeldéfaut du point de terminaisonNom du modèle.
base_urlaucunURL du serveur pour les points de terminaison auto-hébergés ou compatibles OpenAI.
api_keyaucunJamais inclus dans le hachage d'une version et jamais exporté. ${ENV_VAR} est substitué.
temperature0.0De 0 à 2.
max_tokens256Limite de tokens en sortie par appel.
timeoutdéfaut du point de terminaisonSecondes par appel.
promptconstruit à partir du schémaGabarit de prompt. Le modifier crée une nouvelle version de la source.
confidence{method: auto}La façon dont la source exprime sa confiance. Voir Méthodes de confiance.
concurrencyruntime.concurrencyAppels parallèles vers cette source.
schemastous les schémas du moteurRestreint la source à ces schémas.
options{}Options propres au type de source, listées plus bas.
judge{}judge uniquement. Les mêmes options que options, sous leur propre clé, et options l'emporte quand les deux définissent la même.
membersaucunjury uniquement. Au moins deux identifiants d'autres sources.
aggregationpluralityjury uniquement. La pluralité est la seule règle.
field / predictions_fileaucunstatic uniquement. L'emplacement des étiquettes existantes. Le champ contient {scheme: label}, ou une étiquette seule quand la source étiquette un seul schéma. Un champ de forme incorrecte sur tous les items fait échouer l'exécution avec un message qui le nomme.
error_rate, seedaucunfixture uniquement. Une source synthétique au taux d'erreur connu, pour les tests.
revisionaucunUne révision de modèle à consigner dans la version, par exemple le hachage d'un checkpoint.

Tout ce qui peut changer une réponse (modèle, prompt, température, options) entre dans le hachage de version de la source. Une nouvelle version fait passer à stale chaque contrat qui dépend de la source.

Une réponse qui n'est pas une valeur que le schéma peut contenir, comme une étiquette absente de sa liste, un champ numérique qui n'est pas un nombre ou une liste sur un schéma à choix unique, est enregistrée comme une erreur et jamais comme une étiquette, et le message de l'exécution compte ces erreurs. Un item dont les appels échouent est redemandé lors des exécutions suivantes, au plus trois fois par version de source, puis il attend une source modifiée (une clé ou un prompt corrigé constitue une nouvelle version). Une exécution où une source échoue n'arrête pas les autres niveaux. Le niveau suivant étiquette chaque item, et potato label run se termine avec le statut 1 en nommant la source en échec.

Méthodes de confiance

Les règles d'acceptation du moteur fixent un seuil sur la confiance de chaque prédiction, donc la façon dont une source exprime sa confiance détermine ce que le moteur peut accepter. confidence.method prend l'une de cinq valeurs :

confidence.methodS'applique àCe qu'elle fait
verbalizedllm, vlm, judgeLe modèle indique une valeur de 0 à 100 dans sa réponse. Un appel, et la méthode la moins fiable.
k_samplellmsamples réponses (5 par défaut) à sample_temperature (0.7 par défaut). L'étiquette est la réponse la plus fréquente et la confiance est sa part. Coûte k appels.
logprobllmLes étiquettes reçoivent une lettre et le modèle répond par une seule lettre, et la confiance se lit dans les probabilités du premier token. Un appel, en général la mieux calibrée. Exige un backend qui renvoie les logprobs (vLLM, compatible OpenAI) et au plus 20 étiquettes, un schéma qui en a davantage étant une erreur de validation.
nativedecision, detector, trainedLes propres probabilités du modèle. Sur une source llm, c'est une erreur de validation.
autotoutesnative là où la source en dispose, sinon verbalized.

Options propres à chaque type

Cinq types de source lisent leurs propres options :

  • decision couvre Laya dans le processus, ou tout serveur /v1/systemone comme Jev hébergé ou OpenJev. Un seul passage avant renvoie une probabilité pour chaque option, et il fonctionne sur les schémas radio, select, likert et slider. endpoint_type doit valoir laya ou systemone, et systemone exige base_url, la racine du serveur (une URL qui se termine par /v1/systemone est aussi acceptée). L'état est envoyé sous la forme {"text": ...} dans les deux cas, si bien qu'un même checkpoint donne les mêmes réponses dans le processus et derrière laya-serve, et options: {state_key: ""} envoie la chaîne seule à la place. Sur les échelles de notation (likert, slider), les scores de Laya suivent à peine l'échelle, alors vérifiez quelques items avant de vous y fier. Le point de terminaison laya dans le processus exige pip install 'potato-annotation[decision]'.
  • detector lit les boîtes d'un détecteur d'objets sur les schémas image_annotation. keep_threshold (0.35) fixe le score à partir duquel une boîte fait partie de la prédiction. Les boîtes entre candidate_threshold (0.05) et keep_threshold abaissent la confiance de l'image. label_map associe les classes du détecteur aux étiquettes du schéma, et les classes non associées sont ignorées. image_field nomme le champ de l'item qui contient le chemin ou l'URL de l'image. Les chemins se résolvent comme sur la page d'annotation, /media/x.jpg sous le media_directory de la tâche et un chemin relatif sous task_dir.
  • judge prend rubric (par défaut la description du schéma), fields (les champs de l'item montrés au juge, dans l'ordre) et swap_order, qui pose la question deux fois en inversant l'ordre des étiquettes et transforme un verdict qui s'inverse en abstention. Sur les schémas de traces d'agents (process_reward, trajectory_eval, ...), le juge étiquette chaque étape.
  • vlm utilise un point de terminaison de vision (openai_vision, anthropic_vision, ollama_vision). Pour un modèle auto-hébergé derrière un serveur compatible OpenAI, utilisez openai_vision avec base_url.
  • trained prend artifact_dir, trainer (sklearn-text par défaut) et run_id. C'est en général la distillation qui crée cette source, plutôt qu'une configuration écrite à la main.

humans

Le bloc humans définit qui étiquette et comment le moteur échantillonne ces personnes :

CléDéfautSignification
pools[team]Qui étiquette : team, crowd, solo.
calibration_rateautoPart des items tirés pour la calibration en aveugle. auto choisit un taux d'après les projections des contrats, assez d'étiquettes par classe pour pouvoir tester, au plus la moitié d'une petite étude et un cinquième d'une étude de plus de 1 000 items.
dev_fraction0.5Part des étiquettes de calibration utilisée pour choisir les seuils. Le reste les teste.
min_calibration_per_class10Minimum par classe avant que les contrats par classe soient testés.
audit_rate0.02Part des étiquettes machine nouvellement acceptées renvoyées à des personnes, en aveugle, pour surveiller la dérive.
overlap0.0Part des items de calibration étiquetés par plusieurs personnes.
overlap_k3Personnes par item en recouvrement. Le contrat no_worse_than_human en exige 3.
distribution_k5Personnes par item pour les contrats distributional.
truthmajorityLa façon dont les étiquettes de plusieurs personnes sur un item deviennent l'étiquette contre laquelle les contrats testent, majority ou dawid_skene.
verify_visibilityshownSi une demande de vérification montre la réponse de la machine (shown) ou non (blind).

crowd

Le bloc crowd s'applique quand crowd figure dans humans.pools, et Prolific est la seule plateforme de crowdsourcing que le moteur peut piloter :

CléDéfautSignification
providerprolificLa plateforme de crowdsourcing.
study_idaucunL'étude Prolific à redimensionner.
reward_usdaucunRémunération par place, pour les projections de coût.
per_worker_quota20Demandes par travailleur. Le nombre de places vaut ceil(open requests / quota).

Le recrutement de crowdsourcing est une simulation par défaut, et le planificateur indique ce qu'il ferait. Dépenser de l'argent exige features.crowd_live_spend: true et un plafond budgets.human_usd, et une configuration qui active la dépense réelle sans ce plafond est rejetée. Intégration du crowdsourcing explique comment mettre en place l'étude Prolific elle-même.

budgets

Le bloc budgets arrête les dépenses avant qu'une limite soit dépassée :

CléSignification
model_usdCesse d'appeler les modèles payants une fois cette somme dépensée. Chaque appel réserve d'abord son coût projeté. Les modèles sans prix et les modèles auto-hébergés sur localhost n'y sont pas soumis.
human_usdPlafond des dépenses de crowdsourcing. Obligatoire pour une dépense réelle.
human_labelsNombre maximal de demandes humaines que le moteur peut ouvrir, compté à l'ouverture de chaque demande.

runtime

Le bloc runtime règle le traitement par lots, la concurrence et la durée pendant laquelle une personne peut détenir une demande :

CléDéfautSignification
batch_size32Items par tranche validée. Une exécution interrompue reprend à la tranche suivante sans répéter d'appels.
concurrency4Appels parallèles par source, remplacé par le concurrency propre à une source.
cachetrueRéutilise les réponses aux requêtes identiques d'une même version de source.
retries2Tentatives supplémentaires après un dépassement de délai, une erreur de connexion, un 429 ou un 5xx. Chaque tentative est journalisée.
planner_interval30Secondes entre deux passages du planificateur dans le serveur.
hold_minutes60Minutes pendant lesquelles une personne peut détenir une demande sans répondre avant qu'elle retourne dans le pool. L'item quitte aussi sa page, de sorte qu'un onglet resté ouvert ne peut pas y répondre plus tard.

features

Toutes les fonctionnalités sont désactivées par défaut, sauf drift :

CléCe qu'elle active
driftActivée par défaut. Agit sur les résultats des audits. Quand les audits montrent que le taux d'erreur des étiquettes acceptées dépasse la cible, le contrat passe à violated, les étiquettes machine de ce schéma ne sont plus acceptées et de nouvelles étiquettes de calibration sont tirées. Chaque certification ouvre une nouvelle séquence d'audits, si bien que certifier de nouveau après une correction rétablit l'acceptation. Réglez-la sur false pour seulement signaler un dépassement, et le contrat indique alors « met, audits breached ».
distillEntraîne un modèle sur les étiquettes de l'étude et le place en tête de la cascade (voir distill).
optimizeÀ chaque passage, le planificateur évalue chaque sous-ensemble de la cascade sur les étiquettes dev et indique le moins coûteux qui conserve la couverture des contrats, à GET /api/engine/v1/schemes/<name>/optimize. Rien n'est appliqué, car adopter une cascade est un changement de configuration et une nouvelle certification.
crowd_recruitLaisse le planificateur dimensionner l'étude Prolific, en simulation sauf si crowd_live_spend est activé.
crowd_live_spendModifie réellement l'étude Prolific. Exige le pool crowd et budgets.human_usd.
pii_redactionMasque les adresses e-mail, URL, adresses IP, numéros de carte, numéros de sécurité sociale américains (SSN), numéros de téléphone et @identifiants avant que le texte parte vers une API tierce. Le journal des appels consigne ce qui a été masqué sous forme de catégories et de hachages, jamais le texte.
payload_captureConserve les prompts et réponses complets sous <task_dir>/engine_payloads/. Désactivée par défaut, et le journal des appels ne garde que des hachages.

redaction

redaction.categories liste lesquels de email, url, ip, card, ssn, phone et handle masquer, et vaut tous par défaut. Le masquage ne s'applique qu'avec features.pii_redaction, et seulement aux API tierces. Les types de points de terminaison auto-hébergés (vllm, ollama, laya, yolo, ...) ne sont pas masqués, où qu'ils tournent, pas plus que tout point de terminaison dont la base_url se trouve sur la même machine.

distill

Avec features.distill activé, le moteur entraîne un modèle peu coûteux sur les étiquettes de l'étude et le place en tête de la cascade :

CléDéfautSignification
trainersklearn-textUn entraîneur de potato/training.
min_labels200N'entraîne qu'une fois ce nombre d'étiquettes atteint.
include_silvertrueEntraîne aussi sur les étiquettes machine qu'un contrat a certifiées, marquées silver.
every2.0Réentraîne quand le nombre d'étiquettes a été multiplié par ce facteur.

Les items des partitions cert et audit n'entrent jamais dans le jeu d'entraînement, si bien que le modèle distillé n'est jamais testé sur des étiquettes qui ont servi à l'entraîner.

Validation

potato validate config.yaml vérifie le bloc labeling_engine en même temps que le reste de la configuration, et chaque erreur nomme sa clé, par exemple labeling_engine.sources[1].kind must be one of ... ou labeling_engine.contracts[0].error is required for selective_risk. La validation refuse aussi :

  • une clé de contrat que le type de contrat ne lit pas, comme une faute de frappe dans error ;
  • un contrat sur un schéma qu'aucune source de la cascade ne peut étiqueter, avec la raison propre à chaque source ;
  • un contrat sur un schéma que le moteur ne sait pas évaluer (texte libre, paires) ;
  • une source decision dont l'endpoint_type n'est pas un modèle de décision, et une source llm, vlm ou judge dont l'endpoint_type en est un ; et
  • no_worse_than_human avec humans.overlap_k inférieur à 3.

La validation avertit aussi quand budgets.human_labels est trop faible pour certifier un contrat selective_risk, même si chaque réponse machine était juste. Augmentez le budget, ou assouplissez error, jusqu'à ce que cet avertissement disparaisse.

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.