高级功能
本文介绍 HeurAMS 的高级特性, 包括模板系统、宏、插件架构、自动化脚本等.
模板系统深度指南
模板结构
模板文件 (data/template/*.toml) 定义记忆内容的结构和呈现方式:
toml
# 示例:古诗词模板
[__metadata__]
[__metadata__.attribution]
desc = "古诗词学习模板"
[__metadata__.formation]
tts_text = "eval:nucleon['title'] + ', ' + nucleon['author'] + ', ' + nucleon['content']"
[__metadata__.orbital.puzzles]
"朗读背诵" = {
__origin__ = "recognition",
primary = "eval:nucleon['content']",
secondary = ["eval:nucleon['translation']"]
}
"填空测试" = {
__origin__ = "cloze",
text = "eval:nucleon['content']",
delimiter = "/",
min_denominator = 3
}模板字段说明
元数据部分 ([__metadata__])
attribution:模板描述、版本等信息annotation:字段注释, 用于界面显示formation:内容格式化规则, 如 TTS 文本生成
轨道配置 ([__metadata__.orbital])
puzzles:定义可用的谜题类型及其参数schedule:推荐的学习方案序列
动态表达式 (eval:)
在模板中使用 eval: 前缀执行动态表达式:
toml
# 访问 Nucleon 字段
primary = "eval:nucleon['content']"
# 访问配置默认值
max_riddles_num = "eval:default['mcq']['max_riddles_num']"
# 简单运算
tts_text = "eval:nucleon['title'] + ' by ' + nucleon['author']"
# 条件逻辑
hint = "eval:'提示:' + nucleon['hint'] if 'hint' in nucleon else ''"宏系统
宏定义
宏是运行时替换的动态占位符, 在内容中使用 格式:
toml
# Nucleon 中使用宏
question = "{{random_number}} 的平方是多少?"
answer = "{{eval:str(int(macro_context['random_number'])**2)}}"内置宏
| 宏名称 | 说明 | 示例输出 |
|---|---|---|
| 当前日期 | 2025-12-18 |
| 当前时间 | 14:30:25 |
| 随机整数 (1-100) | 42 |
| 从列表中随机选择 | "选项A" |
| 随机排序列表 | ["B", "A", "C"] |
自定义宏
通过插件系统添加自定义宏(开发中):
python
# 示例:自定义宏插件
from heurams.kernel.macros import register_macro
@register_macro("current_year")
def current_year_macro(context):
import datetime
return str(datetime.datetime.now().year)Provider 插件架构
架构概述
HeurAMS 使用 Provider-Service 架构, 支持可插拔的后端实现:
用户界面 → 服务接口 → Provider 实现 → 外部服务
↓ ↓ ↓ ↓
TUI → TTSService → EdgeTTS → 微软 TTS
AudioService → Playsound → 系统音频实现新的 Provider
- 创建 Provider 类:
python
# providers/tts/my_tts.py
from heurams.providers.tts.base import BaseTTSProvider
class MyTTSProvider(BaseTTSProvider):
name = "mytts"
def synthesize(self, text, voice=None):
# 实现 TTS 合成逻辑
return audio_data- 注册 Provider:
python
# providers/tts/__init__.py
from .my_tts import MyTTSProvider
providers = {
"mytts": MyTTSProvider,
"edgetts": EdgeTTSProvider,
}- 配置使用:
toml
# config/config.toml
[services]
tts = "mytts"脚本与自动化
Python API
HeurAMS 提供 Python API 用于脚本控制:
python
import heurams
# 初始化上下文
with heurams.ConfigContext(config_path):
# 加载内容
atoms = heurams.load_atoms()
# 执行复习
for atom in atoms.get_due():
result = atom.review(feedback=3)
print(f"Reviewed: {atom.nucleon.id}, next: {result.next_date}")
# 导出统计
stats = heurams.get_statistics()
print(f"Retention rate: {stats.retention_rate:.1%}")命令行工具
内置命令行工具:
bash
# 批量导入
python -m heurams.tools.import_csv data.csv --tags "数学,公式"
# 导出统计报告
python -m heurams.tools.export_stats --format json --output stats.json
# 清理缓存
python -m heurams.tools.clean_cache --older-than 30
# 数据迁移
python -m heurams.tools.migrate --from-version 0.3 --to-version 0.4自动化脚本示例
每日备份
bash
#!/bin/bash
# daily_backup.sh
BACKUP_DIR="/backup/heurams/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
cp -r ./data "$BACKUP_DIR/"
cp ./config/config.toml "$BACKUP_DIR/"
echo "Backup completed: $BACKUP_DIR"批量添加标签
python
# add_tags.py
import heurams
import sys
def add_tags_to_directory(dir_path, tags):
with heurams.ConfigContext():
for nucleon in heurams.load_nucleons(dir_path):
current_tags = nucleon.get('tags', [])
nucleon['tags'] = list(set(current_tags + tags))
nucleon.save()
if __name__ == "__main__":
add_tags_to_directory(sys.argv[1], sys.argv[2].split(','))性能优化
缓存策略
TTS 缓存
- 位置:
data/cache/tts/ - 策略:基于文本内容和语音参数哈希
- 清理:自动清理30天前的文件
算法状态缓存
- 内存缓存最近访问的 Electron 状态
- 减少文件 I/O, 提高复习速度
数据库优化
对于大量内容(>1000条), 建议:
- 分目录存储:按主题分成多个子目录
- 定期归档:将已掌握的内容移动到归档目录
- 索引文件:创建内容索引加速搜索
内存管理
- 惰性加载:仅在需要时加载内容文件
- 智能卸载:长时间未访问的内容从内存释放
- 批量操作:减少频繁的磁盘写入
扩展开发
创建新谜题类型
- 定义谜题类:
python
# kernel/puzzles/wordsearch.py
from .base import BasePuzzle
class WordSearchPuzzle(BasePuzzle):
name = "wordsearch"
def generate(self, nucleon, orbital):
# 生成字谜逻辑
pass
def evaluate(self, user_input, correct_answer):
# 评估用户输入
pass- 注册到系统:
python
# kernel/puzzles/__init__.py
from .wordsearch import WordSearchPuzzle
puzzle_types = {
"wordsearch": WordSearchPuzzle,
"mcq": MCQPuzzle,
# ...
}创建新算法
- 实现算法类:
python
# kernel/algorithms/my_algo.py
from .base import BaseAlgorithm
class MyAlgorithm(BaseAlgorithm):
algo_name = "MyAlgo"
@classmethod
def revisor(cls, algodata, feedback, is_new_activation=False):
# 实现间隔计算逻辑
pass- 配置使用:
toml
[algorithm]
default = "MyAlgo"集成与同步
云同步(计划中)
未来版本计划支持:
- WebDAV:与 Nextcloud、OwnCloud 等同步
- Git:版本控制同步, 支持分支和合并
- 自定义 API:通过插件支持其他服务
外部工具集成
Anki 兼容性
- 导入
.apkg文件(开发中) - 导出为 Anki 兼容格式
- 双向同步插件
笔记软件集成
- Obsidian:通过插件同步标记文件
- Logseq:兼容其块引用语法
- Roam Research:导出为 JSON 格式
安全考虑
数据加密
敏感数据(如 API 密钥)建议:
- 环境变量:存储密钥在环境变量中
- 加密配置文件:使用操作系统密钥链
- 访问控制:配置文件权限设置为 600
隐私保护
- 本地处理:所有数据默认在本地处理
- 可选的匿名化:导出时移除个人信息
- 透明数据流:明确记录数据发送到外部服务
故障排除与调试
启用调试模式
toml
# config/config.toml
persist_to_file = 1
daystamp_override = -1 # 或设置具体日期用于测试
quick_pass = 0 # 禁用一键通过日志分析
日志文件 heurams.log 包含详细信息:
bash
# 查看最新日志
tail -f heurams.log
# 搜索错误
grep -i error heurams.log
# 按模块筛选
grep "kernel.algorithms" heurams.log性能分析
bash
# 内存使用
python -m heurams.tools.profile --memory
# 执行时间
python -m heurams.tools.profile --timing
# 生成性能报告
python -m heurams.tools.profile --output profile.html社区贡献
插件开发
欢迎贡献:
- Provider 插件:新的 TTS、音频、LLM 后端
- 谜题插件:创新的评估方式
- 算法插件:新的间隔重复算法
- 工具插件:数据导入导出、分析工具
模板分享
将优秀模板提交到社区仓库, 帮助其他用户.
文档改进
完善本文档, 添加使用案例、教程等.