Skip to content

核心模块

本文档详细介绍 HeurAMS 各核心模块的功能和实现.

上下文管理模块 (context.py)

功能概述

提供全局上下文管理和隐式依赖注入机制, 基于 Python 的 contextvars 模块.

核心组件

config_var

python
config_var: ContextVar[ConfigFile] = ContextVar(
    "config_var", default=ConfigFile(default_config_path)
)

全局配置上下文变量, 支持嵌套覆盖.

ConfigContext

上下文管理器, 用于临时切换配置:

python
class ConfigContext:
    def __init__(self, config_provider: ConfigFile):
        self.config_provider = config_provider
        
    def __enter__(self):
        self._token = config_var.set(self.config_provider)
        return self
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        config_var.reset(self._token)

使用场景

  1. 测试:临时使用测试配置
  2. 多用户:快速切换不同用户配置
  3. 功能开关:临时启用/禁用特定功能

服务层模块 (services/)

配置服务 (config.py)

ConfigFile

python
class ConfigFile:
    def __init__(self, path: pathlib.Path):
        self.path = path
        self.data = {}
        self._load()
    
    def get(self, key: str, default: Any = None) -> Any:
        return self.data.get(key, default)
    
    def modify(self, key: str, value: Any):
        self.data[key] = value
        self.save()
    
    def save(self):
        with open(self.path, "w") as f:
            toml.dump(self.data, f)

特性

  • TOML 格式支持
  • 自动创建缺失文件
  • 类型安全的访问接口
  • 实时保存更改

日志服务 (logger.py)

功能特性

  • 多级别日志控制 (DEBUG, INFO, WARNING, ERROR)
  • 文件轮转防止过大
  • 结构化日志格式
  • 模块化日志记录器

配置示例

python
logger = get_logger(__name__)
logger.debug("调试信息")
logger.info("操作完成")
logger.warning("警告信息")
logger.error("错误信息")

时间服务 (timer.py)

功能

  • 统一的时区处理
  • 日期戳转换
  • 时间间隔计算
  • 支持时间覆盖(测试用)

核心函数

python
def get_daystamp() -> int:
    """获取当前日期戳(自纪元的天数)"""
    
def get_timestamp() -> float:
    """获取当前时间戳(秒)"""
    
def daystamp_to_date(daystamp: int) -> datetime.date:
    """日期戳转日期对象"""

音频服务 (audio_service.py)

抽象接口

python
class AudioService:
    @abstractmethod
    def play(self, audio_data: bytes) -> bool:
        """播放音频数据"""
        
    @abstractmethod
    def stop(self) -> bool:
        """停止播放"""

TTS 服务 (tts_service.py)

抽象接口

python
class TTSService:
    @abstractmethod
    def synthesize(self, text: str, voice: Optional[str] = None) -> bytes:
        """合成语音"""
        
    @abstractmethod
    def get_available_voices(self) -> List[str]:
        """获取可用语音列表"""

内核层模块 (kernel/)

算法模块 (algorithms/)

基类 BaseAlgorithm

python
class BaseAlgorithm(ABC):
    algo_name: str = ""
    defaults: Dict[str, Any] = {}
    
    @classmethod
    @abstractmethod
    def revisor(cls, algodata: dict, feedback: int, 
                is_new_activation: bool = False):
        """更新算法状态"""
        
    @classmethod
    def get_next_review_date(cls, algodata: dict) -> int:
        """计算下次复习日期"""

SM-2 算法 (sm2.py)

基于 SuperMemo 2.0 算法, Anki 使用的经典算法.

算法参数

  • efactor:易度因子 (1.3-2.5)
  • interval:当前间隔(天)
  • rept:连续正确次数
  • real_rept:实际复习次数

更新规则

  • 评估 quality (0-5)
  • 更新 efactor:efactor = efactor + (0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02))
  • 限制 efactor 在 [1.3, 2.5] 范围内
  • 根据 quality 和 rept 计算新间隔

FSRS 算法 (fsrs.py)

自由间隔重复调度器, 基于机器学习的现代算法.

特点

  • 自适应学习速率
  • 更准确的长期记忆预测
  • 可训练的参数权重

数据模型模块 (particles/)

Atom 类 (atom.py)

python
class Atom:
    """关联 Nucleon、Electron、Orbital 的运行时容器"""
    
    def __init__(self, ident: str = ""):
        self.ident = ident
        self.registry: AtomRegister = {
            "nucleon": None,
            "electron": None,
            "orbital": None,
            "runtime": {"locked": False, "min_rate": 0, "newact": False}
        }

功能

  • 统一管理三者的关联
  • 提供便捷的访问接口
  • 处理持久化操作
  • 支持运行时状态

Nucleon 类 (nucleon.py)

python
class Nucleon:
    """记忆内容容器"""
    
    def __init__(self, data: Dict[str, Any], path: pathlib.Path):
        self.data = data
        self.path = path

字段示例

toml
# data/nucleon/example.toml
id = "math_001"
question = "勾股定理公式是什么?"
answer = "a² + b² = c²"
tags = ["数学", "几何", "定理"]
metadata = {source = "教科书", chapter = "第三章"}

Electron 类 (electron.py)

python
class Electron:
    """算法状态容器"""
    
    def __init__(self, data: Dict[str, Any], path: pathlib.Path):
        self.data = data
        self.path = path

字段示例

json
{
  "SM-2": {
    "efactor": 2.3,
    "interval": 15,
    "rept": 3,
    "last_date": 19657,
    "next_date": 19672
  }
}

Orbital 类 (orbital.py)

python
class Orbital:
    """策略配置容器"""
    
    def __init__(self, data: Dict[str, Any], path: pathlib.Path):
        self.data = data
        self.path = path

字段示例

toml
# data/orbital/quick_review.toml
name = "快速复习"
puzzles = [
    {type = "cloze", weight = 1.0},
    {type = "mcq", weight = 0.5}
]
schedule = "daily"

谜题模块 (puzzles/)

基类 BasePuzzle

python
class BasePuzzle(ABC):
    name: str = ""
    
    @abstractmethod
    def generate(self, nucleon: Nucleon, orbital: Orbital) -> PuzzleData:
        """生成谜题数据"""
        
    @abstractmethod
    def evaluate(self, user_input: str, correct_answer: str) -> Tuple[bool, str]:
        """评估用户输入"""

选择题 (mcq.py)

特性

  • 支持多个干扰项
  • 随机选项顺序
  • 可配置最大干扰项数量
  • 支持解析说明

配置

toml
[puzzles.mcq]
max_riddles_num = 3
shuffle_options = true
show_explanation = true

填空题 (cloze.py)

特性

  • 自动检测填空位置
  • 可配置最小分母(影响空格数量)
  • 支持提示级别
  • 大小写敏感选项

配置

toml
[puzzles.cloze]
min_denominator = 3
hint_level = 1  # 0=无,1=首字母,2=长度
case_sensitive = false

识别题 (recognition.py)

特性

  • 快速识别判断
  • 时间限制选项
  • 确认要求选项
  • 适合快速复习

配置

toml
[puzzles.recognition]
time_limit = 30
require_confirmation = true

调度反应器 (reactor/)

fission.py - 原子分裂处理

处理 Atom 的拆分和重组, 用于复杂内容的分解学习.

phaser.py - 阶段处理器

管理学习的不同阶段:新学、复习、巩固、测试.

procession.py - 队列处理器

管理复习队列的排序、优先级和调度.

states.py - 状态管理

跟踪应用和学习的全局状态.

提供者层模块 (providers/)

音频提供者 (audio/)

playsound_audio.py

基于 playsound 库的跨平台音频播放.

特性

  • 支持常见音频格式
  • 简单易用的 API
  • 跨平台兼容性

termux_audio.py

Android Termux 专用的音频播放.

特性

  • 针对移动设备优化
  • 终端环境适配
  • 低资源消耗

TTS 提供者 (tts/)

edge_tts.py

基于微软 Edge TTS 服务的语音合成.

特性

  • 高质量的神经网络语音
  • 多语言支持
  • 可调节语速、音调
  • 本地缓存机制

配置

toml
[providers.tts.edgetts]
voice = "zh-CN-XiaoxiaoNeural"
rate = "+0%"
pitch = "+0Hz"

LLM 提供者 (llm/)

openai.py

OpenAI 兼容的 API 接口.

特性

  • 支持 GPT 系列模型
  • 可配置参数(温度、最大令牌数等)
  • 错误处理和重试机制

配置

toml
[providers.llm.openai]
url = "https://api.openai.com/v1"
key = "sk-..."
model = "gpt-3.5-turbo"
temperature = 0.7

界面层模块 (interface/)

应用入口 (__main__.py)

python
def main():
    """TUI 应用主函数"""
    app = HeurAMSApp()
    app.run()

屏幕模块 (screens/)

dashboard.py - 主仪表板

显示学习统计、进度、快捷操作.

memorizor.py - 记忆界面

核心复习界面, 显示谜题和收集反馈.

nucreator.py - 内容创建

创建和编辑记忆内容的界面.

intelinote.py - 智能笔记

集成 LLM 的智能内容生成界面.

preparation.py - 准备屏幕

复习前的准备和设置界面.

组件模块 (widgets/)

base_puzzle_widget.py

谜题组件的基类, 定义通用接口和行为.

具体谜题组件

  • mcq_puzzle.py:选择题组件
  • cloze_puzzle.py:填空题组件
  • recognition.py:识别题组件

工具模块 (utils/)

哈希工具 (hasher.py)

python
def hash_text(text: str) -> str:
    """生成文本的哈希标识"""
    return hashlib.md5(text.encode()).hexdigest()

文件工具

文件操作、路径处理、格式转换等实用函数.

模块间依赖关系

编译时依赖

interface → services → providers
         ↓        ↓
       kernel → particles

运行时依赖

通过上下文管理器动态注入, 减少硬编码依赖.

数据流依赖

用户输入 → 界面层 → 服务层 → 内核层 → 数据层

                            提供者层 → 外部服务

扩展点

1. 新算法

继承 BaseAlgorithm 并注册到 algorithm_registry.

2. 新谜题

继承 BasePuzzle 并注册到 puzzle_registry.

3. 新提供者

实现服务接口并注册到相应的提供者注册表.

4. 新模板

data/template/ 目录添加 TOML 模板文件.

5. 新界面组件

继承 Textual 组件并集成到相应屏幕.

性能优化

内存优化

  • 惰性加载大文件
  • 缓存频繁访问数据
  • 及时释放未使用资源

磁盘优化

  • 批量读写操作
  • 使用高效序列化格式
  • 定期清理临时文件

网络优化

  • 请求合并和批处理
  • 本地缓存策略
  • 异步网络操作

测试策略

单元测试

  • 每个模块独立的测试
  • 模拟外部依赖
  • 边界条件覆盖

集成测试

  • 模块间接口测试
  • 数据流验证
  • 端到端功能测试

性能测试

  • 内存使用监控
  • 响应时间测量
  • 并发处理能力

相关文档