所有开源包
人工智能Swift

educationai

面向学习类应用的 Swift 包:FSRS-6 间隔重复、学习队列、键入答案匹配与测验。

2星标数最新版本: v2.0.0 · 更新时间: 2026年10月15日
支持平台:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

许可证: MIT

摘要

  • 面向闪卡应用的学习逻辑:FSRS-6 间隔重复、学习队列、输入答案评分和测验。
  • 测试在八种配置下重放来自 py-fsrs 6.3.2 的 2,400 次复习,并在每次复习后比较结果。
  • SM2Scheduler 让 SM-2 数据继续可用,并在保留每张卡片到期日的同时将 SM-2 卡片转换为 FSRS。
  • 仅依赖 Foundation 在设备上运行,适配 Swift 6 严格并发,且不包含任何神经网络。
  • 在标签 v2.0.0 上,于 macOS 27.0.1 使用 Swift 6.4 通过了 11 个套件中的 124 项测试。

EducationAI 承载了闪卡或学习类应用的学习逻辑。FSRSScheduler 使用 FSRS-6(Anki 的 FSRS 调度器背后的记忆模型)决定每张卡片何时再次出现,其测试将 2,400 次复习与参考实现 py-fsrs 6.3.2 进行比对。SM2Scheduler 让 SM-2 数据继续可用,并将其转换为 FSRS。围绕调度器,还提供学习队列、支持拼写容错的键入答案评分、测验、难度调节器、工作量预测、复习统计和学习连续天数。它在设备上运行,只使用 Foundation,并针对 Swift 6 strict concurrency 编写。其中没有神经网络:FSRS 是一种统计记忆模型。

功能特性

  • FSRS-6 已对照参考实现验证:测试在八种配置下重放由 py-fsrs 6.3.2 计算的 2,400 次复习,并在每次复习后比较稳定性、难度、到期日和可提取性
  • 学习与重新学习步骤、期望保留率、最大间隔、间隔模糊(fuzz)和自定义权重(FSRS-6 的 21 个或 FSRS-5 的 19 个);为答题按钮提供四种评级的预览
  • 按已发布规范实现的 SM-2,以及将 SM-2 卡片转换为 FSRS 并保留每张卡片到期日的转换功能
  • 键入答案评分:忽略大小写、重音、字符宽度和标点,且不依赖设备语言;按答案长度容忍拼写错误;面对恶意输入时只做有界的工作量
  • 由卡片生成的选择题和键入题测验;每个结果都会为调度器建议一个评级,已保存的测验在加载时会重新评分
  • 学习队列:包含每日上限、逐日预测、保留率统计、按学习者的自然日计算的连续天数,以及将正确率保持在目标区间内的难度调节器
  • Sendable、Codable 值类型:每个函数都接收其所用的日期,随机数来自可设置种子的生成器,已存储的值在使用前会先校验,而不是直接崩溃
  • 无依赖,仅使用 Foundation;DocC 参考文档含四篇指南,另有适用于 iOS 和 macOS 的示例应用 StudyDeck

快速开始

swift
1struct FlashcardsView: View {
2 @State private var cards = [
3 Flashcard(front: "Capital of Japan", back: "Tokyo"),
4 Flashcard(front: "Capital of Kenya", back: "Nairobi"),
5 Flashcard(front: "Capital of Peru", back: "Lima")
6 ]
7 @State private var showsAnswer = false
8 private let scheduler = FSRSScheduler.default
9 
10 var body: some View {
11 if let card = StudyQueue.cards(from: cards).first,
12 let index = cards.firstIndex(where: { $0.id == card.id }) {
13 VStack(spacing: 24) {
14 Text(card.front).font(.title)
15 if showsAnswer {
16 Text(card.back).font(.title2).bold()
17 HStack {
18 ForEach(Rating.allCases, id: \.self) { rating in
19 Button(String(describing: rating).capitalized) {
20 if let outcome = try? scheduler.review(card.review, rating: rating) {
21 cards[index].review = outcome.state
22 }
23 showsAnswer = false
24 }
25 .buttonStyle(.bordered)
26 }
27 }
28 } else {
29 Button("Show Answer") { showsAnswer = true }
30 .buttonStyle(.borderedProminent)
31 }
32 }
33 .padding()
34 } else {
35 Text("All done for now")
36 }
37 }
38}

安装

Xcode (File › Add Package Dependencies…)

text
1https://github.com/muhittincamdali/educationai.git

Swift Package Manager (Package.swift)

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/educationai.git", from: "2.0.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "EducationAI", package: "educationai")
7 ])
8]

截图

示例应用的复习界面:卡片 Capital of Vietnam,答案为 Hanoi,记忆度 90 %,以及四个评级按钮,标签分别为 10m Again、1mo Hard、2mo Good 和 3mo Easy
一道键入答案的测验题 Capital of Morocco,回答为 Raba:反馈为 Almost,正确拼写是 Rabat,有一处拼写错误,该卡片按 Hard 安排复习
进度界面:连续 21 天,最佳连续纪录 21,保留率 91 %,84 次复习,以及未来 14 天每天到期卡片数量的柱状图
牌组列表:每个首都及其所属国家、到期时间和当前的记忆程度,例如 Hanoi 现已到期,记忆度 90 %

时间线

  1. 仓库创建;8 月 7 日打上 1.0.0 标签:一个带有学习模型的 EducationAI 类,依赖 Alamofire、RxSwift、SnapKit 和 SDWebImage

  2. 去除依赖后重写,拆分为 SM-2 调度器以及测验、进度、推荐和游戏化引擎

  3. 新增了对本地文件夹(../SwiftAI)的依赖,以及占位的“neural tutor”和“enterprise”类型;该包对其他任何人都无法再解析

  4. 2.0.0:围绕与 py-fsrs 6.3.2 一致的 FSRS-6 调度器重新构建;6 月的代码和所有 1.x 类型均已移除

相关链接

相关文章

阅读文章 (English)