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 :
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éfaut | Signification |
|---|---|---|
enabled | false | Active le moteur. Un moteur activé a besoin d'au moins une source. |
schemas | tous | Les 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. |
cascade | première source | Identifiants 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éfaut | Signification |
|---|---|---|
id | obligatoire | Nom utilisé dans cascade, le journal des appels et le certificat. |
kind | obligatoire | L'un de llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator. |
endpoint_type | obligatoire pour llm, vlm, decision, judge | Le 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. |
model | défaut du point de terminaison | Nom du modèle. |
base_url | aucun | URL du serveur pour les points de terminaison auto-hébergés ou compatibles OpenAI. |
api_key | aucun | Jamais inclus dans le hachage d'une version et jamais exporté. ${ENV_VAR} est substitué. |
temperature | 0.0 | De 0 à 2. |
max_tokens | 256 | Limite de tokens en sortie par appel. |
timeout | défaut du point de terminaison | Secondes par appel. |
prompt | construit à partir du schéma | Gabarit 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. |
concurrency | runtime.concurrency | Appels parallèles vers cette source. |
schemas | tous les schémas du moteur | Restreint 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. |
members | aucun | jury uniquement. Au moins deux identifiants d'autres sources. |
aggregation | plurality | jury uniquement. La pluralité est la seule règle. |
field / predictions_file | aucun | static 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, seed | aucun | fixture uniquement. Une source synthétique au taux d'erreur connu, pour les tests. |
revision | aucun | Une 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.method | S'applique à | Ce qu'elle fait |
|---|---|---|
verbalized | llm, vlm, judge | Le modèle indique une valeur de 0 à 100 dans sa réponse. Un appel, et la méthode la moins fiable. |
k_sample | llm | samples 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. |
logprob | llm | Les é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. |
native | decision, detector, trained | Les propres probabilités du modèle. Sur une source llm, c'est une erreur de validation. |
auto | toutes | native là où la source en dispose, sinon verbalized. |
Options propres à chaque type
Cinq types de source lisent leurs propres options :
decisioncouvre Laya dans le processus, ou tout serveur/v1/systemonecomme Jev hébergé ou OpenJev. Un seul passage avant renvoie une probabilité pour chaque option, et il fonctionne sur les schémasradio,select,likertetslider.endpoint_typedoit valoirlayaousystemone, etsystemoneexigebase_url, la racine du serveur (une URL qui se termine par/v1/systemoneest 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èrelaya-serve, etoptions: {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 terminaisonlayadans le processus exigepip install 'potato-annotation[decision]'.detectorlit les boîtes d'un détecteur d'objets sur les schémasimage_annotation.keep_threshold(0.35) fixe le score à partir duquel une boîte fait partie de la prédiction. Les boîtes entrecandidate_threshold(0.05) etkeep_thresholdabaissent la confiance de l'image.label_mapassocie les classes du détecteur aux étiquettes du schéma, et les classes non associées sont ignorées.image_fieldnomme 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.jpgsous lemedia_directoryde la tâche et un chemin relatif soustask_dir.judgeprendrubric(par défaut la description du schéma),fields(les champs de l'item montrés au juge, dans l'ordre) etswap_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.vlmutilise 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, utilisezopenai_visionavecbase_url.trainedprendartifact_dir,trainer(sklearn-textpar défaut) etrun_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éfaut | Signification |
|---|---|---|
pools | [team] | Qui étiquette : team, crowd, solo. |
calibration_rate | auto | Part 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_fraction | 0.5 | Part des étiquettes de calibration utilisée pour choisir les seuils. Le reste les teste. |
min_calibration_per_class | 10 | Minimum par classe avant que les contrats par classe soient testés. |
audit_rate | 0.02 | Part des étiquettes machine nouvellement acceptées renvoyées à des personnes, en aveugle, pour surveiller la dérive. |
overlap | 0.0 | Part des items de calibration étiquetés par plusieurs personnes. |
overlap_k | 3 | Personnes par item en recouvrement. Le contrat no_worse_than_human en exige 3. |
distribution_k | 5 | Personnes par item pour les contrats distributional. |
truth | majority | La façon dont les étiquettes de plusieurs personnes sur un item deviennent l'étiquette contre laquelle les contrats testent, majority ou dawid_skene. |
verify_visibility | shown | Si 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éfaut | Signification |
|---|---|---|
provider | prolific | La plateforme de crowdsourcing. |
study_id | aucun | L'étude Prolific à redimensionner. |
reward_usd | aucun | Rémunération par place, pour les projections de coût. |
per_worker_quota | 20 | Demandes 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_usd | Cesse 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_usd | Plafond des dépenses de crowdsourcing. Obligatoire pour une dépense réelle. |
human_labels | Nombre 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éfaut | Signification |
|---|---|---|
batch_size | 32 | Items par tranche validée. Une exécution interrompue reprend à la tranche suivante sans répéter d'appels. |
concurrency | 4 | Appels parallèles par source, remplacé par le concurrency propre à une source. |
cache | true | Réutilise les réponses aux requêtes identiques d'une même version de source. |
retries | 2 | Tentatives 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_interval | 30 | Secondes entre deux passages du planificateur dans le serveur. |
hold_minutes | 60 | Minutes 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 |
|---|---|
drift | Activé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 ». |
distill | Entraî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_recruit | Laisse le planificateur dimensionner l'étude Prolific, en simulation sauf si crowd_live_spend est activé. |
crowd_live_spend | Modifie réellement l'étude Prolific. Exige le pool crowd et budgets.human_usd. |
pii_redaction | Masque 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_capture | Conserve 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éfaut | Signification |
|---|---|---|
trainer | sklearn-text | Un entraîneur de potato/training. |
min_labels | 200 | N'entraîne qu'une fois ce nombre d'étiquettes atteint. |
include_silver | true | Entraîne aussi sur les étiquettes machine qu'un contrat a certifiées, marquées silver. |
every | 2.0 | Ré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
decisiondont l'endpoint_typen'est pas un modèle de décision, et une sourcellm,vlmoujudgedont l'endpoint_typeen est un ; et no_worse_than_humanavechumans.overlap_kinfé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
- Le moteur d'étiquetage
- Contrats du moteur d'étiquetage
- Ligne de commande, REST API, outils MCP et SDK
- Support IA, pour les types de points de terminaison que les sources partagent avec le reste de Potato
Pour les détails d'implémentation, consultez la documentation source.