すべてのオープンソースパッケージ
AISwift

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 件のレビューを 8 通りの設定で再生し、レビューごとに結果を比較する。
  • SM2Scheduler は SM-2 のデータを引き続き使えるようにし、各カードの期日を保ったまま SM-2 カードを FSRS に変換する。
  • Foundation のみでデバイス上で動作し、Swift 6 の strict concurrency に対応し、ニューラルネットワークは含まない。
  • タグ v2.0.0 で、macOS 27.0.1 上の Swift 6.4 により 11 スイート 124 件のテストが成功した。

EducationAI は、フラッシュカードや学習アプリの学習ロジックを提供します。FSRSScheduler は、Anki の FSRS スケジューラの基盤である記憶モデル FSRS-6 を使って各カードがいつ戻ってくるかを決め、そのテストでは 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 件の復習を 8 つの設定で再生し、復習のたびに安定性、難易度、期限日、想起確率を比較します
  • 学習ステップと再学習ステップ、目標保持率、最大間隔、間隔のファズ、カスタム重み (FSRS-6 の 21 個または FSRS-5 の 19 個)、解答ボタン用に 4 つの評価すべてのプレビュー
  • 公開されたとおりの SM-2 と、各カードの期限日を保ったまま SM-2 のカードを FSRS へ変換する機能
  • デバイスの言語に依存せず、大文字小文字、アクセント、文字幅、句読点を無視し、解答の長さに応じてタイプミスを許容し、悪意ある入力に対しても処理量に上限を設ける入力解答の採点
  • カードから作成する選択式と入力式のクイズ。各結果がスケジューラ向けの評価を提案し、保存したクイズは読み込み時に再採点されます
  • 1 日あたりの上限、日ごとの予測、保持率の統計、学習者のカレンダー日で数えるストリーク、正答率を目標の範囲に保つ難易度調整を備えた学習キュー
  • Sendable かつ Codable の値型: すべての関数は処理に使う日付を引数に取り、乱数はシードを指定できるジェネレータから得られ、保存された値はクラッシュする代わりに使用前に検証されます
  • 依存関係なし、Foundation のみ。4 つのガイドを含む 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 とラベルの付いた 4 つの評価ボタン
入力式のクイズ問題 Capital of Morocco に Raba と答えた画面: フィードバックは Almost で、正しい綴りは Rabat でタイプミスが 1 つあり、カードは Hard として予定される
進捗画面: 21 日間のストリーク、最長ストリーク 21、保持率 91 %、復習 84 件、そして今後 14 日間の各日に期限を迎えるカードの棒グラフ
デッキ一覧: 各首都について、国名、期限、現在どれくらい覚えているかを表示。例として Hanoi は今すぐ期限で 90 %

タイムライン

  1. リポジトリを開設し、8 月 7 日に 1.0.0 をタグ付け: Alamofire、RxSwift、SnapKit、SDWebImage に依存する、学習モデルを持つ EducationAI クラス

  2. 依存関係なしで書き直し、SM-2 スケジューラ、クイズ、進捗、レコメンド、ゲーミフィケーションの各エンジンとして再構成

  3. ローカルフォルダ (../SwiftAI) への依存と、プレースホルダの「neural tutor」型および「enterprise」型が追加され、パッケージは他の人の環境では解決できなくなった

  4. 2.0.0: py-fsrs 6.3.2 と一致する FSRS-6 スケジューラを中心に再構築し、6 月のコードとすべての 1.x の型を削除

リンク

関連記事

記事を読む (English)