Files
projectAIpopular/tests/test_inference.py
tzt ce0f6170d3 chore: T-P-1 工作区收敛——并行会话成果与历史未入库文件整理入库
- 入库历史遗漏源码/测试:router_system 9 模块(agent/executors/inference/knowledge/
  memory/planner/skills/trace)、tests 11 个测试文件、config/knowledge 领域知识
- 入库根目录方案文档(v2/v3/可行性×2)、references 文献(arxiv 14-18/cnki_open/
  参考文献清单)、research 论文素材(routerarena/paper/中文文献 PDF)
- 前端构建产物刷新(新 hash);webapp 误写文档删除
- gitignore 增补:deepseek-harness、research/_refs、.mimosa/.zcode、网关日志/pid、
  临时调试脚本、tests/e2e/node_modules、AI代理功能开发/prefix
- 基线确认:318 passed
2026-09-05 08:28:25 +08:00

69 lines
2.3 KiB
Python

"""前向链推理机(InferenceEngine)单元测试。"""
from router_system.inference import InferenceEngine, render_template
from router_system.knowledge import KnowledgeBase, Rule
from router_system.memory import WorkingMemory
def _engine():
return InferenceEngine(KnowledgeBase())
def test_forward_chain_fires_rules():
eng = _engine()
mem = WorkingMemory()
eng.initialize("求解方程 x^2 - 5x + 6 = 0", "math", "medium", 0.9, mem)
fired = eng.run("求解方程 x^2 - 5x + 6 = 0", "math", mem)
assert fired, "数学查询应触发规则"
# 优先级最高的 math-equation 最先触发
assert fired[0] == "math-equation"
# 轨迹包含规则记录
assert any(t.startswith("rule:") for t in mem.trace)
def test_no_match_terminates():
eng = _engine()
mem = WorkingMemory()
eng.initialize("今天天气怎么样", "general", "medium", 0.5, mem)
fired = eng.run("今天天气怎么样", "general", mem)
assert fired == []
def test_max_steps_limit():
eng = _engine()
mem = WorkingMemory()
eng.initialize("求解方程 x^2 - 5x + 6 = 0", "math", "medium", 0.9, mem)
fired = eng.run("求解方程 x^2 - 5x + 6 = 0", "math", mem, max_steps=1)
assert len(fired) == 1
def test_blackboard_facts_written():
eng = _engine()
mem = WorkingMemory()
eng.initialize("求解方程 x^2 - 5x + 6 = 0", "math", "hard", 0.95, mem)
assert mem.get_fact("domain") == "math"
assert mem.get_fact("difficulty") == "hard"
assert "init:" in mem.trace[0]
def test_rule_output_renders_section():
kb = KnowledgeBase()
# 注入一条带 output 模板的规则
kb._rules["test-rule"] = Rule(
id="test-rule", domain="general", priority=10,
patterns=["测试渲染"], output="领域={facts.domain} 查询={query}",
)
eng = InferenceEngine(kb)
mem = WorkingMemory()
eng.initialize("测试渲染一下", "general", "easy", 0.6, mem)
fired = eng.run("测试渲染一下", "general", mem)
assert "test-rule" in fired
section = mem.section("test-rule")
assert section is not None
assert "领域=general" in section
assert "查询=测试渲染一下" in section
def test_render_missing_placeholder():
out = render_template("你好 {query} {facts.缺失字段}", "世界", {})
assert "你好 世界 [未提供]" == out