架构: - Router:低置信度直连/专家异常两条兜底路径的收尾逻辑(回退→finalize→record)提取为 _fallback_result 公共方法,消除三处重复收尾块 算法: - RouterCache:语义条目写入时预计算向量范数(原每次两两比较重算)、 语义查找单遍完成(原命中后二次 O(N) 查找)、相似度=1.0 提前终止扫描; 微基准(3000 条目×200 查询):3986ms -> 1685ms,2.37x - RuleClassifier:同分决胜改为按领域名字典序(与规则表排列顺序无关的确定性)、 次高分由全排序改 O(n) 扫描 测试:新增 5 项(缓存范数一致性/提升后无残留/淘汰同步清理、决胜确定性、区分度惩罚) pytest 25 passed(原 20 全绿 + 新增 5) 基线检查点:66b6fd8(操作前已提交,20 passed)
64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""分类器单元测试。"""
|
|
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"
|