EmpathRAG / eval /train_ml_router.py
MukulRay's picture
Implement EmpathRAG Core hybrid router
b2f5c42
Raw
History Blame
1.5 kB
"""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 # noqa: E402
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()