"""分类器单元测试。""" from router_system.classifier import RuleClassifier def test_tie_break_is_deterministic(): """同分决胜:按领域名字典序,与规则表排列顺序无关。""" clf = RuleClassifier() clf.rules = {"zeta": [("x", 1.0)], "alpha": [("x", 1.0)]} r = clf.classify("x") assert r.domain == "alpha" def test_distinctiveness_penalty(): """次高分占比高(语义含混)时置信度被压低;单一领域命中不受影响。""" clf = RuleClassifier() clf.rules = {"a": [("kw", 1.0)], "b": [("kw", 0.9)]} r_ambiguous = clf.classify("kw") clf_clear = RuleClassifier() clf_clear.rules = {"a": [("kw", 1.0)], "b": [("other", 0.1)]} r_clear = clf_clear.classify("kw") assert r_clear.confidence > r_ambiguous.confidence def test_code_classification(): clf = RuleClassifier() r = clf.classify("用 Python 写一个快速排序函数") assert r.domain == "code" assert r.confidence > 0.7 def test_math_classification(): clf = RuleClassifier() r = clf.classify("求解方程 x^2 - 5x + 6 = 0") assert r.domain == "math" assert r.confidence > 0.7 def test_legal_classification(): clf = RuleClassifier() r = clf.classify("劳动合同到期不续签需要支付经济补偿吗") assert r.domain == "legal" def test_medical_classification(): clf = RuleClassifier() r = clf.classify("高血压患者日常饮食需要注意什么") assert r.domain == "medical" def test_general_low_confidence(): clf = RuleClassifier() r = clf.classify("今天天气怎么样") # 未命中任何领域 -> 低置信度,触发 should_fallback assert r.domain == "general" assert clf.should_fallback(r, 0.6) is True def test_difficulty_estimation(): clf = RuleClassifier() easy = clf.classify("1 + 1 = ?") hard = clf.classify("证明费马大定理并推导其推论,给出详细步骤") assert hard.difficulty in ("medium", "hard") assert easy.difficulty == "easy"