""" Evaluation script for DeepPragma Classifier. Runs the labeled test set against GroqClient.classify() and reports: - overall accuracy - per-category accuracy - a confusion list of misclassified examples (for manual inspection) Usage: python run_eval.py Requires GROQ_API_KEY to be set in the environment. Place this file at the project root (same level as app.py), and test_set.json inside an eval/ folder (or adjust TEST_SET_PATH below). """ import json import os import time from collections import defaultdict from src.llm_client import GroqClient TEST_SET_PATH = os.path.join("eval", "test_set.json") def load_test_set(path): with open(path, "r", encoding="utf-8") as f: return json.load(f) def run_evaluation(): if not os.environ.get("GROQ_API_KEY"): print("ERROR: GROQ_API_KEY not set in environment.") return test_cases = load_test_set(TEST_SET_PATH) llm = GroqClient() total = len(test_cases) correct = 0 per_category_total = defaultdict(int) per_category_correct = defaultdict(int) errors = [] for i, case in enumerate(test_cases, start=1): text = case["text"] expected = case["expected"] result = llm.classify(text) predicted = result["label"] per_category_total[expected] += 1 is_correct = predicted == expected if is_correct: correct += 1 per_category_correct[expected] += 1 else: errors.append({ "text": text, "expected": expected, "predicted": predicted, "reasoning": result.get("reasoning", ""), }) print(f"[{i}/{total}] {'OK ' if is_correct else 'FAIL'} " f"expected={expected!r} predicted={predicted!r}") # small delay to be gentle with API rate limits time.sleep(0.5) print("\n" + "=" * 60) print(f"OVERALL ACCURACY: {correct}/{total} ({100 * correct / total:.1f}%)") print("=" * 60) print("\nPER-CATEGORY ACCURACY:") for category in per_category_total: cat_total = per_category_total[category] cat_correct = per_category_correct[category] print(f" {category}: {cat_correct}/{cat_total} " f"({100 * cat_correct / cat_total:.1f}%)") if errors: print(f"\nMISCLASSIFIED EXAMPLES ({len(errors)}):") for err in errors: print(f"\n Text: {err['text']}") print(f" Expected: {err['expected']}") print(f" Predicted: {err['predicted']}") print(f" Reasoning: {err['reasoning']}") # Save results to a JSON report for later reference (e.g. in your CV/interview prep) report = { "total": total, "correct": correct, "accuracy": round(100 * correct / total, 1), "per_category": { cat: { "total": per_category_total[cat], "correct": per_category_correct[cat], "accuracy": round(100 * per_category_correct[cat] / per_category_total[cat], 1), } for cat in per_category_total }, "errors": errors, } with open("eval_report.json", "w", encoding="utf-8") as f: json.dump(report, f, indent=2, ensure_ascii=False) print("\nFull report saved to eval_report.json") if __name__ == "__main__": run_evaluation()