做到 Day 13 之後,Visual Learning Lab 已經開始有一條滿完整的學習流程了。
教材丟進去之後,AI 會先分析內容,再決定要畫 Concept Map、Visual Flow 或 Comparison;接著可以進 Guided Learning,一步一步學,最後做 Knowledge Check。答錯之後,Adaptive Review 又會把錯誤對應回原本的 Learning Step,產生 Focused Review,再做一次 Retry Check。
功能其實已經不少。
但我開始遇到另一個問題:
這些功能雖然都在同一個網站裡,彼此卻還是有點像一座一座分開的小島。
Concept Map 是一張圖。
Guided Learning 是另一個區塊。
Focused Review 又在更下面。
PDF 的來源頁碼雖然一直都在,但使用者看到某個概念時,還是很難直接從「這個概念」一路找到它對應的課程、複習內容和原始教材。
所以 Day 14 我決定不再增加新的 AI 功能,而是做一次比較大的整合。
我想把前面累積的所有 stable ID、learning step、source page、review mapping 全部接起來。
這次的主角叫:
Interactive Learning Canvas。
最早做 Concept Map 時,我其實很容易滿足。
AI 可以把 Sinusoids 裡面的 amplitude、frequency、period、phase、trigonometric identities 畫成一張圖,看起來就已經比純文字摘要好多了。
但做到 Day 14 再回頭看,我開始覺得:
如果使用者看到「Amplitude V_m」這個節點,他下一步可以做什麼?
如果答案只有「看完它」,那這張 Concept Map 本質上還是靜態圖片。
所以這次我想把流程改成:
看到 Concept Map 裡的一個概念
↓
選到這個概念
↓
Learning Inspector
↓
看它跟哪些內容相連
↓
跳到相關 Guided Learning Step
↓
Explain This
↓
查看原始教材來源
重點不再只是把圖畫得更漂亮,而是讓圖開始變成整個學習流程的入口。
這次最有感的新東西是 Learning Inspector。
例如我選到 Concept Map 裡面的 Amplitude V_m,Inspector 不只是顯示名稱。
它會告訴我這個 node 的角色,目前是不是需要複習、它跟哪些其他 Concept Map edge 相連、來源是哪幾頁,以及它對應到 Guided Learning 的哪一個 Step。

這張畫面裡可以看到:
Amplitude V_m 被標成 Needs review。
下面的 Context 會列出它跟 standard sinusoid form、equivalent form 之間的關係。
接著還直接找到:
Related lesson: Step 1 — Identify the standard sinusoid and its parameters
下面可以看到這個 lesson 的 learning goal。
這些資訊其實都不是 Day 14 才突然叫 AI 重新想的。
它們很多早就在前面幾天的 Structured Outputs 裡存在:
Day 14 做的事情,是第一次把它們真的接在一起。
以前 Concept Map 告訴我「這些概念彼此怎麼連」,Guided Learning 則告訴我「這些東西應該怎麼學」。
但是它們其實是兩個不同畫面。
現在 Learning Inspector 裡多了一個 Go to lesson step。
如果某個 Concept Map node 有對應的 Guided Learning Step,就可以直接跳過去。

這次我實際跳到 Guided Learning 的最後一個 Step:
Combine sine and cosine components
畫面還是保留昨天做好的 Goal、Explanation、Why this comes next、Source,以及 Explain this step。
重點是這個跳轉完全不用再呼叫 AI。
它只是利用已經存在的 stable ID,把 Concept Map 裡的概念和 learning path 裡的 step 接起來。
這也是前面幾天一直堅持不要只靠文字 label 當 identity 的原因。
如果當初所有東西都只是「找名稱差不多的字串」,做到今天這種跨功能 navigation 大概會非常痛苦。
Day 13 做 Adaptive Review 時,我們已經知道使用者答錯的題目跟哪些 learning steps 有關。
所以 Day 14 又再往前接一層。
如果某個錯誤對應到特定 learning step,而這個 step 又對應到 Concept Map node,那這個 node 就可以被標成「目前需要複習」。
這也是為什麼剛才 Amplitude V_m 在 Learning Inspector 裡會出現:
Needs review
它不是 AI 又重新判斷一次「你可能不會 amplitude」。
而是從實際的 Knowledge Check 錯誤一路追回來:
答錯 Question
↓
related_step_ids
↓
Guided Learning Step
↓
related visualization node
↓
Needs review
整條 mapping 都已經存在。
這比重新問模型「你覺得使用者應該複習什麼?」可靠很多,也不需要額外 API。
Day 13 做好的 Focused Review 這次全部保留。

像這次複習的重點包含 sinusoid parameters、phase 和 equivalent forms。
Review 裡還是會明確指出:
Do not use ω to identify the waveform's peak magnitude.
以及:
Do not interpret an added phase term as a change in amplitude.
下面再接 Focused explanation 和 Intuition or example。
也就是說,Day 14 並不是再做一套新的複習系統,而是把原本已經存在的 Adaptive Review 接回 Learning Canvas。
這個方向我現在越來越喜歡。
因為如果每天都只是增加一個新的 AI feature,很快就會變成:
有摘要、有圖、有 Quiz、有 Explain、有 Review……
但每一個功能都各自做自己的事情。
今天比較像是在做另一件事:
讓同一個 concept 成為所有功能共用的中心。
Focused Review 做完之後,下面原本的 Retry Check 也還在。

這些題目仍然不是原題直接重播,而是針對剛才的錯誤概念重新換一個方式測。
作答、判斷 Correct / Not quite、最後算 Retry result 一樣全部在本地完成,不會每選一個答案就再打一個 API request。
所以 Day 14 雖然畫面變得更互動,API 的原則其實沒有改:
| 操作 | OpenAI API |
|---|---|
| 點選 Concept / Flow node | 否 |
| Learning Inspector | 否 |
| Go to lesson step | 否 |
| View source | 否 |
| Guided Learning Previous / Next | 否 |
| Review navigation | 否 |
| Quiz / Retry grading | 否 |
| Explain this | 必要時才呼叫 |
| Build focused review | 必要時才呼叫 |
我還是希望「互動」和「AI request」是兩件不同的事情。
Day 14 原本其實還有一個更大的目標:
把 Graphviz 換成真正可以直接點 node、pan、zoom 的 interactive canvas。
我沒有自己從頭做一套前端,而是嘗試接現成的 interactive graph component,同時保留原本 Graphviz 當 fallback。
結果這次實際跑起來,interactive canvas 沒有成功載入。
畫面直接顯示:
The interactive canvas is unavailable. Showing the Graphviz view.
以前的我可能會覺得這代表 Day 14 失敗了。
但這次反而讓我很慶幸一開始沒有把原本的 Graphviz renderer 整個砍掉。
因為整個 Learning Inspector、Guided Learning mapping、Adaptive Review、來源關聯都還是可以繼續運作。
壞掉的只有「最漂亮的互動畫布」。
不是整個產品。
我覺得這反而是這次很重要的一個工程結果。
原本想做的是:
Interactive Canvas
↓
如果成功就使用
現在實際變成:
Interactive Canvas
↓
可以使用 → Interactive renderer
不能使用 → Graphviz fallback
使用者至少永遠還看得到圖。
而不是第三方 component 一掛,整個學習流程跟著消失。
做到這裡後,Concept Map 對我來說已經跟 Day 7 完全不一樣了。
Day 7 的 Concept Map 是:
AI 幫我畫了一張概念圖。
Day 14 想做的是:
這張概念圖知道我現在正在學哪一課、剛剛哪一題答錯、哪些概念需要複習、可以跳去哪一個 lesson,也知道自己的來源在哪裡。
即使這次真正 clickable 的 interactive renderer 還沒有順利跑起來,我覺得底層最重要的連接已經開始成形了。
Visual Learning Lab 現在的資料其實慢慢變成一張很大的網:
PDF source
↕
Key Concepts
↕
Concept Map / Flow
↕
Guided Learning
↕
Knowledge Check
↕
Adaptive Review
↕
Focused Review
而這些東西不再只是按照頁面順序一塊一塊往下排。
它們開始知道彼此是同一個 concept。
前面幾天我一直在增加能力。
Day 6 可以看 PDF 裡面的圖。
Day 7、8 開始知道該畫什麼。
Day 9 可以 Explain This。
Day 11 可以探索 visualization。
Day 12 開始 Guided Learning。
Day 13 開始根據錯誤做 Adaptive Review。
到了 Day 14,我反而第一次覺得「再增加一個新功能」不是最重要的事情。
真正重要的是:
前面這些東西是不是同一個產品。
今天的 Interactive Learning Canvas 還沒有完全做到我腦中想像的樣子。
真正直接點 Concept Map node 的 interactive renderer 還需要再處理,目前仍然會 fallback 回 Graphviz;Source Lens 也還有很多可以繼續做的地方。
但 Learning Inspector、lesson mapping、review state 和 source connection 已經開始把前十三天做的東西拉回同一條線上。
這次我覺得最值得留下來的不是一個新按鈕。
而是這句:
同一個概念,不應該在摘要、圖、課程、測驗和複習裡各自活一次。
它們應該是同一個東西,只是在不同學習情境裡,用不同方式出現。
Visual Learning Lab 到 Day 14,開始往這個方向走了。
GitHub Repo:
https://github.com/f24131128-lgtm/visual-learning-lab