A newer version of the Gradio SDK is available: 6.20.0
Reproducibility
What a third-party reviewer or fork can and cannot reproduce from this repo, and the exact commands to do so.
TL;DR
| Evaluation | Inputs in repo? | Reproducible? |
|---|---|---|
| Eval B (74 multi-turn scenarios) | β eval/multiturn_scenarios.jsonl + eval/multiturn_safety_supplement.jsonl |
β Full reproduction |
| Per-layer ablation (5 variants Γ Eval B) | β Same inputs | β Full reproduction |
| Unguarded Llama baseline (Eval B) | β Same inputs | β Full reproduction (requires Groq API key) |
| Drift sweep (29 cells Γ 14 routes Γ 3 stages) | β Probes hard-coded in script | β Full reproduction (requires Groq) |
| F-1 stage Γ ISSS contract (12 cells) | β Probes hard-coded | β Full reproduction (requires Groq) |
| Sycophancy probes (25 cells) | β Probes hard-coded | β Full reproduction (requires Groq) |
| Prompt-injection probes (16 cells) | β Probes hard-coded | β Full reproduction (requires Groq) |
| Fairness spot-check (18 paired prompts) | β Probes hard-coded | β Full reproduction (requires Groq) |
| Eval A (360 single-turn) | β Requires the curated UMD evaluation dataset (intentionally untracked, internal coursework deliverable) | β Inputs needed |
| ML router training | β Trained artifacts under models/router/ are intentionally untracked |
β Re-train from the labeled dataset via eval/train_ml_router.py |
| Curated retrieval index | β FAISS index under data/curated/indexes/ is intentionally untracked |
β Re-build via src/data/build_curated_index.py from data/curated/resources_seed.jsonl |
Commands
After cloning + venv setup + .env with GROQ_API_KEY (and optionally ANTHROPIC_API_KEY):
# Headline safety eval: 0 / 28 missed escalations (rephraser ON)
EMPATHRAG_REPHRASER_ENABLED=1 ./venv/Scripts/python.exe eval/run_multiturn_eval.py
# Same-model unguarded baseline: 9 / 28 missed escalations
./venv/Scripts/python.exe eval/run_unguarded_baseline.py
# Per-layer ablation: ~20 min, ~$1 in Groq calls
EMPATHRAG_REPHRASER_ENABLED=1 ./venv/Scripts/python.exe eval/run_ablation_eval.py
# Targeted failure-mode sweeps (each ~3-5 min, ~$0.05)
./venv/Scripts/python.exe eval/sweep_rephraser_drift.py
./venv/Scripts/python.exe eval/sweep_f1_stage_isss.py
./venv/Scripts/python.exe eval/sweep_sycophancy_probes.py
./venv/Scripts/python.exe eval/sweep_prompt_injection.py
./venv/Scripts/python.exe eval/sweep_fairness_spot_check.py
# Resource URL health
./venv/Scripts/python.exe eval/audit_resource_urls.py
# Regression suite
./venv/Scripts/python.exe -m pytest tests/test_v25_support_navigator.py -v
Expected results at commit 847587d (or newer)
| Eval | Headline |
|---|---|
| Eval B (rephraser ON) | 0 / 28 missed escalation, 0 unsafe, 0 ungrounded, ~570 ms avg latency |
| Ablation (rephraser ON) | baseline 0 / 28; no_stage1_precheck 22 / 28; others 0 / 28 |
| Unguarded Llama 3.3 70B | 9 / 28 missed escalation (CI95 [0.148, 0.494]), 2 harm-endorsement turns |
| Drift sweep | 27-29 / 29 clean (1-2 stochastic LLM-level flags within tolerance) |
| F-1 stage Γ ISSS contract | 12 / 12 pass |
| Sycophancy probes | 25 / 25 clean |
| Prompt-injection probes | 16 / 16 clean |
| Fairness spot-check | 18 / 18 no divergence |
| Resource URL audit | 60 / 63 live (3 SAMHSA TLS quirks are not real outages) |
| Regression tests | 21 / 21 pass |
Numbers from stochastic-LLM evaluations will vary turn-to-turn within the tolerances above. Deterministic-template evaluations are stable across runs.
What's intentionally untracked
- Internal dataset folders β teammate dataset deliveries are not the repo's to redistribute.
data/curated/indexes/β FAISS index + SQLite metadata, regenerable fromresources_seed.jsonl.models/router/β ML router artifacts (TF-IDF vectorizer + logistic regression), regenerable viaeval/train_ml_router.pyonce the labeled dataset is present..envβ API keys.- Generated eval reports under
eval/sweep_*.md,eval/ablation_*.md,eval/unguarded_*.md,eval/audit_*.mdβ regenerable from the scripts.
See .gitignore for the exhaustive list and the rationale per pattern.
Versioning and dataset provenance
This evaluation set is based on the curated UMD Student Support Conversational Dataset (216/72/72 train/dev/test split for Eval A; 50 + 24 multi-turn = 74 scenarios for Eval B). The planned next dataset pull extends coverage with authority-misconduct scenarios, sycophancy probes, topic-shift scenarios, incomplete-message scenarios, and real anonymized student turns.
Honest caveats
- n = 28 escalation scenarios is small enough that absolute claims like "0% missed escalation in deployment" are not warranted by this evaluation alone. The meaningful claim is the comparison against the unguarded baseline (0/28 vs 9/28, non-overlapping CIs).
- Synthetic data structurally differs from real student phrasing. Numbers here are prototype evidence, not deployment claims.
- Stochastic LLM components mean drift / sycophancy / injection sweeps will vary by 1-2 cells run-to-run. The patterns are stable; individual cells are not.
- Provider availability affects all rephraser-ON results. Groq Llama 3.3 70B is the primary path; Anthropic Haiku 4.5 is the fallback. With both unavailable, the system falls through to deterministic templates and the rephraser metrics become identical to the deterministic baseline.