Modes de tâche

Le paramètre task de evaluation.run() accepte trois types de valeurs. Chacun répartit les données de façon différente.

ModeValeurRépartitionAdapté à
ActivitéFonction @evaluation.taskUne activité par enregistrementAppel LLM unique ou pipeline court
Classe de workflowClasse @workflow.defineUn workflow enfant par enregistrementTâches multi-étapes dans le même code
Nom de workflowstrUn workflow enfant par enregistrementTâches déployées séparément
Tâche Activité

Tâche Activité

Décorez une fonction async avec @evaluation.task. Le plugin l'exécute comme une activité Temporal pour chaque enregistrement, avec le délai d'expiration, les tentatives et la concurrence définis sur le decorator :

from mistralai.workflows.client import get_mistral_client
from mistralai.workflows.plugins.evaluations import evaluation
from mistralai.workflows.plugins.evaluations.types import TaskContext

@evaluation.task
async def summarize(ctx: TaskContext) -> str:
    client = get_mistral_client()
    response = await client.chat.complete_async(
        model=str(ctx.system.params["model"]),
        messages=[{"role": "user", "content": ctx.input_record["text"]}],
    )
    return str(response.choices[0].message.content)

La tâche peut renvoyer toute valeur sérialisable en JSON : chaînes, dictionnaires ou modèles Pydantic.

Classe de workflow

Classe de workflow

Passez une classe décorée avec @workflow.define quand la tâche est elle-même un workflow multi-étapes. Le plugin le démarre comme un workflow enfant pour chaque enregistrement.

Le point d'entrée reçoit un TaskContext sérialisé (input_record, system et metadata), et non l'enregistrement lui-même. Validez-le en TaskContext pour obtenir un accès typé :

from mistralai.workflows import workflow
from mistralai.workflows.plugins.evaluations.types import TaskContext

@workflow.define(name="research-task")
class ResearchTask:
    @workflow.entrypoint
    async def run(self, params: dict) -> str:
        ctx = TaskContext.model_validate(params)
        sources = await search(ctx.input_record["question"])
        return await write_answer(ctx.input_record["question"], sources)

result = await evaluation.run(
    dataset=dataset,
    task=ResearchTask,
    evaluators=[...],
)
Nom de workflow

Nom de workflow

Passez le nom d'un workflow sous forme de chaîne quand la tâche est déployée séparément et que sa classe n'est pas disponible dans votre code. Le workflow cible reçoit le même TaskContext sérialisé :

result = await evaluation.run(
    dataset=dataset,
    task="research-task",
    evaluators=[...],
)
Limites des tâches de workflow

Limites des tâches de workflow

Les tâches de workflow ne passent pas par @evaluation.task, donc ses options ne s'appliquent pas :

  • Délai d'expiration : une classe de workflow utilise son propre délai d'exécution. Un nom de workflow obtient 10 minutes par enregistrement.
  • Tentatives : le workflow enfant n'est pas relancé. Un enregistrement en échec est consigné comme erreur.
  • Concurrence : jusqu'à 5 enregistrements s'exécutent simultanément.

Les scorers s'exécutent comme des activités dans les trois modes, avec les options définies sur @evaluation.scorer.