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
- Observer Demo460 et ses variantes ; relier le résultat aux concepts du chapitre.
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 ReleaseExercer 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 $fixtureOutputGet-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
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 $liveOutputCette 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-restorepublic 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);
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 });
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.
