p09-llm-eval / src /run_eval.py
amarshiv86's picture
Upload folder using huggingface_hub
3732aec verified
Raw
History Blame Contribute Delete
3.55 kB
"""
P09 · Main Eval Runner
Runs full evaluation pipeline:
load test cases → evaluate → save to DB → check regression → generate report
Usage:
python src/run_eval.py # evaluate default dataset
python src/run_eval.py --dataset data/raw/sre_test_cases.jsonl
python src/run_eval.py --run-id my-run-001
python src/run_eval.py --ci # CI gate mode (exit 1 on regression)
"""
import argparse
import json
import sys
import uuid
from datetime import datetime, timezone
from .db import check_regression, save_run
from .evaluator import LLMEvaluator, TestCase
from .reporter import generate_report, run_ci_gate
def load_test_cases(path: str) -> list[TestCase]:
cases = []
with open(path) as f:
for i, line in enumerate(f):
line = line.strip()
if not line:
continue
data = json.loads(line)
cases.append(TestCase(
id=data.get("id", f"tc_{i:03d}"),
question=data["question"],
reference_answer=data["reference_answer"],
generated_answer=data["generated_answer"],
category=data.get("category", "general"),
metadata=data.get("metadata", {}),
))
return cases
def main():
parser = argparse.ArgumentParser(description="LLM Eval Framework")
parser.add_argument("--dataset", default="data/raw/test_cases.jsonl")
parser.add_argument("--run-id", default=None)
parser.add_argument("--db-path", default="data/processed/eval_history.db")
parser.add_argument("--report-path", default="data/processed/eval_report.md")
parser.add_argument("--model-name", default="heuristic")
parser.add_argument("--ci", action="store_true", help="CI gate mode")
parser.add_argument("--threshold", type=float, default=6.0)
parser.add_argument("--regression-threshold", type=float, default=5.0)
args = parser.parse_args()
if args.ci:
sys.exit(run_ci_gate(args.db_path))
run_id = args.run_id or f"run_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}_{uuid.uuid4().hex[:6]}"
print(f"Run ID: {run_id}")
print(f"Dataset: {args.dataset}")
print("Loading test cases...")
test_cases = load_test_cases(args.dataset)
print(f"Loaded {len(test_cases)} test cases")
evaluator = LLMEvaluator(pipe=None, pass_threshold=args.threshold)
print("Evaluating...")
results = evaluator.evaluate_batch(test_cases)
summary = evaluator.summary(results)
summary["model_name"] = args.model_name
summary["dataset"] = args.dataset
print("\nResults:")
print(f" Pass rate: {summary['pass_rate']}%")
print(f" Avg composite: {summary['avg_composite']:.2f}/10")
print(f" Avg ROUGE-1: {summary['avg_rouge1']:.4f}")
print(f" Avg judge: {summary['avg_llm_judge']:.2f}/10")
results_dicts = [r.to_dict() for r in results]
save_run(run_id, summary, results_dicts, args.db_path)
print(f"Saved to DB: {args.db_path}")
regression = check_regression(
summary["avg_composite"],
args.db_path,
args.regression_threshold,
)
print(f"\nRegression: {regression['reason']}")
generate_report(run_id, summary, results_dicts, regression, args.report_path)
print(f"Report: {args.report_path}")
if regression["has_regression"]:
print("\n⚠️ Regression detected!")
sys.exit(1)
print("\n✅ Eval complete — no regression")
if __name__ == "__main__":
main()