| import argparse |
| import json |
| import sys |
| from datetime import datetime |
| from pathlib import Path |
|
|
| sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) |
|
|
| from server.eval.precision import run_batch_precision_eval_multi_k |
| from server.utils import load_config |
|
|
|
|
| def main(): |
| config = load_config() |
| default_path = config.get("eval", {}).get("ground_truth_path", "data/ground_truth/eval_pairs.json") |
| eval_config = config.get("eval", {}) |
| default_ks = eval_config.get("precision_ks") |
| if default_ks is None: |
| default_ks = [eval_config.get("precision_k", 5)] |
|
|
| parser = argparse.ArgumentParser(description="Run batch Precision@K evaluation") |
| parser.add_argument("--queries", type=str, default=default_path, help="Path to eval_pairs.json") |
| parser.add_argument("--ks", type=int, nargs="+", default=default_ks, help="K values for Precision@K") |
| args = parser.parse_args() |
|
|
| print(f"Running Precision eval for K={args.ks} on queries from {args.queries}...") |
| results = run_batch_precision_eval_multi_k(args.queries, ks=args.ks) |
|
|
| for k in args.ks: |
| metric_key = f"precision@{k}" |
| metric_results = results[metric_key] |
| print(f"\nMean Precision@{k}: {metric_results['mean_precision_at_k']}") |
| print("\nPer-query breakdown:") |
| for r in metric_results["per_query_results"]: |
| print(f" P@{k}={r['precision_at_k']:.2f} | {r['query'][:70]}") |
|
|
| timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
| output_path = f"eval_results_{timestamp}.json" |
| with open(output_path, "w") as f: |
| json.dump(results, f, indent=2) |
| print(f"\nResults saved to: {output_path}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|