Sage / tests /test_evaluation_script.py
vxa8502's picture
Apply ruff format across codebase
effafc0
Raw
History Blame Contribute Delete
4.98 kB
"""Tests for scripts.evaluation artifact assembly."""
from sage.core.models import EvalCase, EvalCaseProvenance, MetricsReport
import scripts.evaluation as evaluation_script
def _case(
*,
query: str,
query_id: str,
source_type: str,
category: str,
intent: str,
subset_tags: tuple[str, ...],
query_slice_tags: tuple[str, ...],
origin_family: str,
curation_mode: str,
) -> EvalCase:
return EvalCase(
query=query,
relevant_items={"ASIN1": 3.0},
query_id=query_id,
source_type=source_type,
category=category,
intent=intent,
subset_tags=subset_tags,
query_slice_tags=query_slice_tags,
provenance=EvalCaseProvenance(
schema_version="query_provenance_v1",
origin_family=origin_family,
curation_mode=curation_mode,
source_dataset="amazon_esci",
source_split="test",
selection_policy="corpus_overlap_min_relevant_items_v1",
subset_assignment_policy="normalized_query_sha256_v1",
),
)
def test_build_primary_evaluation_artifact_adds_metadata_breakdowns(monkeypatch):
cases = [
_case(
query="wireless keyboard",
query_id="qb_001",
source_type="amazon_esci",
category="keyboards",
intent="use_case",
subset_tags=("retrieval_eval",),
query_slice_tags=(),
origin_family="amazon_esci_overlap",
curation_mode="pure_import",
),
_case(
query="latest earbuds to avoid",
query_id="qb_002",
source_type="manual_seed",
category="audio",
intent="problem_solving",
subset_tags=("retrieval_eval", "special_probe"),
query_slice_tags=(
"recency_sensitive_query",
"negative_problem_query",
),
origin_family="manual_seed",
curation_mode="candidate_bootstrap",
),
]
case_results = []
for case, recommended_ids, metrics in [
(
cases[0],
["ASIN1", "ASIN3"],
{
"ndcg": 1.0,
"hit": 1.0,
"mrr": 1.0,
"precision": 0.5,
"recall": 1.0,
"diversity": 0.2,
"novelty": 2.0,
},
),
(
cases[1],
["ASIN4", "ASIN1"],
{
"ndcg": 0.6309,
"hit": 1.0,
"mrr": 0.5,
"precision": 0.5,
"recall": 1.0,
"diversity": 0.6,
"novelty": 3.0,
},
),
]:
row = case.to_dict()
row["recommended_product_ids"] = recommended_ids
row["relevant_item_count"] = 1
row["relevant_hits"] = [
{
"product_id": "ASIN1",
"rank": recommended_ids.index("ASIN1") + 1,
"relevance": 3.0,
}
]
row["first_relevant_rank"] = recommended_ids.index("ASIN1") + 1
row["metrics"] = metrics
case_results.append(row)
monkeypatch.setattr(
evaluation_script,
"evaluate_recommendations_with_details",
lambda **_kwargs: (
MetricsReport(
n_cases=2,
ndcg_at_k=0.8154,
hit_at_k=1.0,
mrr=0.75,
precision_at_k=0.5,
recall_at_k=1.0,
diversity=0.4,
coverage=0.6,
novelty=2.5,
k=10,
),
case_results,
),
)
artifact = evaluation_script.build_primary_evaluation_artifact(
cases,
item_embeddings={},
item_popularity={},
total_items=5,
)
assert artifact["metrics"]["ndcg_at_10"] == 0.8154
assert artifact["case_metadata_summary"]["total_cases"] == 2
assert artifact["case_metadata_summary"]["by_origin_family"] == {
"amazon_esci_overlap": 1,
"manual_seed": 1,
}
assert artifact["case_metadata_summary"]["by_query_slice_tag"] == {
"recency_sensitive_query": 1,
"negative_problem_query": 1,
}
assert (
artifact["metric_breakdowns"]["by_curation_mode"]["candidate_bootstrap"][
"n_cases"
]
== 1
)
assert (
artifact["metric_breakdowns"]["by_query_slice_tag"]["recency_sensitive_query"][
"n_cases"
]
== 1
)
assert (
artifact["metric_breakdowns"]["by_query_slice_tag"]["recency_sensitive_query"][
"coverage"
]
== 0.4
)
assert (
artifact["metric_breakdowns"]["by_subset_tag"]["retrieval_eval"]["n_cases"] == 2
)
assert "subset_tags" in artifact["breakdown_methodology"]["multi_membership_fields"]