shinkan-jinkendo/backend/tests/test_planning_exercise_semantics.py
Lars 5b73d1a1f5
All checks were successful
Deploy Development / deploy (push) Successful in 42s
Test Suite / pytest-backend (push) Successful in 41s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 13s
Test Suite / k6 /health Baseline (push) Successful in 33s
Test Suite / playwright-tests (push) Successful in 1m23s
Enhance Planning Exercise Path Builder and Retrieval Logic
- Updated the path selection logic to incorporate semantic gating, ensuring only relevant exercises are considered based on semantic scores.
- Introduced new functions for building path target profiles and resolving semantic skill weights, enhancing the contextual understanding of exercise suggestions.
- Improved the retrieval process by applying dynamic retrieval weights based on semantic strength, refining the accuracy of exercise recommendations.
- Incremented version to 0.8.188 and updated changelog to document these enhancements in planning AI functionality.
2026-05-23 12:38:38 +02:00

69 lines
2.1 KiB
Python

"""Tests Planungs-KI Phase E — Semantik-Schicht."""
from planning_exercise_semantics import (
apply_dynamic_retrieval_weights,
build_semantic_brief,
score_exercise_semantic_relevance,
step_retrieval_query,
)
def test_build_semantic_brief_mae_geri():
brief = build_semantic_brief(
"Von Erlernen bis zur Perfektion, des Fußtritts Mae Geri"
)
assert brief.primary_topic == "mae geri"
assert brief.must_phrases == ["mae geri"]
assert "mawashi geri" in brief.exclude_phrases
assert "perfektion" not in brief.must_phrases
assert brief.semantic_strength >= 0.8
def test_semantic_score_prefers_mae_over_mawashi():
brief = build_semantic_brief("Mae Geri Perfektion")
mae_score, _ = score_exercise_semantic_relevance(
title="Mae Geri — Frontkick Grundstellung",
summary="Frontkick von vorn",
goal="Sauberer Mae Geri",
variant_names=[],
brief=brief,
)
mawashi_score, _ = score_exercise_semantic_relevance(
title="Mawashi Geri — Rundkick",
summary="Rundkick Technik",
goal="Mawashi Geri Höhe",
variant_names=[],
brief=brief,
)
assert mae_score > mawashi_score
def test_dynamic_weights_boost_semantic_for_query_only():
brief = build_semantic_brief("Mae Geri bis Perfektion")
base = {
"fulltext": 0.45,
"semantic": 0.0,
"progression": 0.08,
"skill": 0.08,
"plan": 0.08,
"profile": 0.15,
"repeat_unit": -0.3,
"repeat_group": -0.15,
}
out = apply_dynamic_retrieval_weights(
base,
brief,
scenario="free_search",
has_planning_reference=False,
)
assert out["semantic"] > 0.25
assert out["fulltext"] < base["fulltext"]
def test_step_retrieval_query_carries_topic_and_phase():
brief = build_semantic_brief("Mae Geri von Einstieg bis Perfektion")
q0 = step_retrieval_query(brief, brief.retrieval_query, 0, 5)
q4 = step_retrieval_query(brief, brief.retrieval_query, 4, 5)
assert "mae geri" in q0.lower()
assert "mae geri" in q4.lower()
assert "einstieg grundübung" not in q0.lower()