e-naxosMAF COURSE / COURS
English

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Demo460 — Candidate Evaluation

Exécuter les fixtures, puis une campagne réelle attribuable dont la calibration peut refuser la qualification.

Objectifs

Préparer suite, prompts et répertoire

Demo460.App distribue evaluation/cases.v1.json, prompt_candidat_v1.txt, prompt_candidat_v2.txt et prompt_juge.txt. Le mode par défaut est fixture, le prompt par défaut v2 et la répétition par défaut 1, paramètres de Program.cs. Choisir un nouveau dossier de sortie pour chaque exécution ; un dossier existant est refusé. Le SiteMAF ne lance aucun modèle pour son lecteur.

dotnet build BaseTechnique.slnx -m:1 -c Release

Exercer le pipeline sans modèle

$fixtureOutput = Join-Path $env:TEMP ("maf-evaluation-fixture-" + [guid]::NewGuid().ToString("N"))
dotnet run --project demos/Demo460_CandidateEvaluation/Demo460.App.csproj -c Release --no-build -- --mode fixture --prompt v2 --repeat 2 --output $fixtureOutput
Get-Content (Join-Path $fixtureOutput "report.json")

La fixture rejoue volontairement la référence correspondant à l’entrée publique et rend un verdict positif scripté. Son lookup interne dans les cas n’est pas le chemin d’inférence du candidat live. Attendre Measurement=ScriptedFixtureOnly, FixtureGatePassed=true, ModelGatePassed=false, CalibrationPassed=null. Deux répétitions sur huit cas produisent seize résultats attendus ; ce calcul vient des paramètres et du corpus, pas d’une mesure de qualité.

FixtureGatePassed = mode == "fixture" && accepted,
ModelGatePassed = mode == "live" && accepted,
CriticalFailures = results.Count(r => r.Critical && r.Status != "Passed"),
ContractErrors = results.Count(r => r.Status == "ContractError"),
CalibrationPassed = mode == "live" ? (bool?)calibrationPassed : null,
Calibrations = calibrations, Results = results

demos/Demo460_CandidateEvaluation/Program.cs · L102–L107 · 9a895c94534c

Code source · Demo460 · Dossier

Lancer une campagne live distincte

$liveOutput = Join-Path $env:TEMP ("maf-evaluation-live-" + [guid]::NewGuid().ToString("N"))
dotnet run --project demos/Demo460_CandidateEvaluation/Demo460.App.csproj -c Release --no-build -- --mode live --prompt v2 --repeat 2 --output $liveOutput

Cette commande exige Ollama avec le modèle commun disponible, ou la connexion API explicitement choisie. Elle calibre sur seize références/contre-exemples avant d’évaluer les réponses réelles. --judge-model accepte un autre modèle déjà installé sur le même endpoint ; il ne sélectionne pas un autre fournisseur. La borne globale du runner est vingt minutes, les répétitions admises de 1 à 10 et les paramètres modèle température 0 / MaxOutputTokens 800, valeurs du code.

Pour comparer v1 et v2, garder suite, juge, modèles/digests, binaires, endpoint et paramètres identiques et utiliser deux nouveaux dossiers. Comparer les statuts par CaseId/Repetition et vérifier les portes de qualification dans chaque rapport. Les scripts historiques Compare-Evaluation ne sont pas distribués ; ne pas les publier comme commande actuelle.

Inspecter la calibration et l’isolement

dotnet test tests/Episode17Demo.Tests/Episode17Demo.Tests.csproj -m:1 -c Release --no-build --no-restore
public static string BuildCandidatePrompt(CandidateInput input) => JsonSerializer.Serialize(input, Contracts.Json);

/// <summary>Supplies expectations only to the judge; embedded text remains untrusted data.</summary>
public static string BuildJudgePrompt(EvaluationCase test, CandidateAnswer answer) =>
    JsonSerializer.Serialize(new { test.Input, test.RequiredBehavior, test.ForbiddenBehavior, Answer = answer }, Contracts.Json);

demos/Demo460_CandidateEvaluation/src/PromptEvaluator.cs · L10–L14 · 9a895c94534c

Code source · Demo460 · Dossier

    var verdict = Contracts.ParseVerdict(raw);
    var observed = verdict.RequiredBehaviorMet == true && verdict.ForbiddenBehaviorAbsent == true;
    status = observed == positive ? "Passed" : "CalibrationFailure";
}
catch (JsonException) { status = "ContractError"; }
catch (Exception ex) when (ex is not OutOfMemoryException) { status = ex.GetType().Name; }
calibrationPassed &= status == "Passed";
calibrations.Add(new { test.Id, Positive = positive, Status = status, Raw = raw });

demos/Demo460_CandidateEvaluation/Program.cs · L76–L83 · 9a895c94534c

Code source · Demo460 · Dossier

Ouvrir report.json, manifest.json et les snapshots cases.json/candidate.txt/judge.txt. Vérifier Mode, Measurement, SharedModel, Calibrations, Results, Stage et sorties brutes. Le code de sortie vaut 1 dès qu’une porte échoue ; conserver les artefacts de cet échec. Pour le profil historique granite4:3b, le refus de qualification décrit dans le chapitre reste le résultat de référence daté, même après des tests applicatifs réussis.

Conserver la réserve de qualification

Aucun modèle n’est qualifié par la fixture ou par cette fiche. Le juge dépendant peut accepter des contre-exemples dangereux ; une campagne sans contrat invalide peut quand même échouer. La revue des références est interne à Codex ; l’approbation humaine métier indépendante n’est pas acquise. Les rapports bruts demandent accès et rétention adaptés si l’on remplace les données synthétiques.

Manipuler les frontières

Prérequis

Pour poursuivre

Dossier complet de la démo · README

lot012-observability-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1