| """Train lightweight EmpathRAG Core route and safety-tier classifiers.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import csv |
| from pathlib import Path |
| import sys |
|
|
| ROOT = Path(__file__).resolve().parents[1] |
| sys.path.insert(0, str(ROOT / "src")) |
|
|
| from pipeline.ml_router import DEFAULT_MODEL_DIR, save_models, train_classifier |
|
|
|
|
| DEFAULT_DATASET = ROOT / "eval" / "empathrag_core_supervised.csv" |
|
|
|
|
| def read_rows(path: Path) -> list[dict]: |
| with path.open("r", encoding="utf-8-sig", newline="") as handle: |
| return list(csv.DictReader(handle)) |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--dataset", type=Path, default=DEFAULT_DATASET) |
| parser.add_argument("--model-dir", type=Path, default=ROOT / DEFAULT_MODEL_DIR) |
| args = parser.parse_args() |
|
|
| rows = [row for row in read_rows(args.dataset) if row.get("split") == "train"] |
| if len(rows) < 10: |
| raise SystemExit("Need at least 10 training rows. Run eval/prepare_karthik_dataset.py first.") |
|
|
| texts = [row["query_text"] for row in rows] |
| route_labels = [row["route_label"] for row in rows] |
| tier_labels = [row["safety_tier"] for row in rows] |
| route_model = train_classifier(texts, route_labels) |
| tier_model = train_classifier(texts, tier_labels) |
| save_models(route_model, tier_model, args.model_dir) |
| print(f"Trained router on {len(rows)} rows") |
| print(f"Saved models to {args.model_dir}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|