前幾天的 Visual Learning Lab 已經慢慢長出一套完整的分析流程。
丟進一份 PDF 之後,它會整理 Quick Summary、Key Concepts、Relationships,也會去看教材裡面的公式、Diagram、Graph 和 Waveform。接著再根據內容判斷該畫 Concept Map、Visual Flow 還是 Comparison。
Day 9 又加了 Explain This,Day 11 則讓 Concept Map 和 Flow 裡面的節點也能直接往下問。
做到這裡之後,功能其實已經不少了。
但我重新用了一遍自己的東西,發現一個很明顯的問題:
它很會分析教材,但還是不太會「教」。
使用者打開結果之後,會一次看到摘要、概念、關係、Visual Evidence、Concept Map,資訊其實很多。但到底應該先看什麼?哪些概念要先懂?哪一個東西其實是下一個東西的前置知識?
目前都還是使用者自己決定。
所以 Day 12 我決定先不繼續增加另一種圖,也先不做原本排好的 Source Check。
今天直接做一個比較大的功能:
Guided Learning Mode。
也就是把前面 AI 已經理解好的教材,重新整理成一條真的可以一步一步走的學習路徑。
以前 Visual Learning Lab 的流程比較像:
上傳教材
↓
AI 分析
↓
摘要 / 概念 / 圖表 / 視覺化
↓
使用者自己看
Day 12 之後,我想把最後一段改掉。
現在多了一條 Guided Learning:
上傳教材
↓
AI 理解整份內容
↓
安排學習順序
↓
一次只學一個 Step
↓
卡住可以 Explain This
↓
最後 Knowledge Check
這個差別對我來說滿大的。
因為前面幾天做的東西主要是在回答:
AI 可以把教材整理成什麼?
今天開始比較像是在問:
AI 整理完之後,要怎麼讓使用者真的跟著它學?
這次我沒有另外再呼叫一次 API 去產生課程。
Guided Learning 的內容直接被加進原本的 Structured Output,跟 Quick Summary、Key Concepts、Concept Map、Visual Flow 一起,在第一次分析教材時就產生。
新增的核心結構叫做 learning_path,大概長這樣:
{
"learning_path": {
"suitable": true,
"title": "Understanding and Manipulating Sinusoids",
"steps": [
{
"id": "step_1",
"title": "Read the sinusoid model",
"learning_goal": "...",
"explanation": "...",
"source_pages": [2],
"connection_to_previous": "..."
}
],
"checkpoint_questions": [
{
"id": "q1",
"question": "...",
"options": [...],
"correct_option_id": "a",
"explanation": "...",
"source_pages": [2]
}
]
}
}
我特別不希望它只是把 Key Concepts 原封不動排成一個列表。
因為「重要概念有哪些」和「這些概念應該用什麼順序學」其實不是同一件事。
例如這次拿 Sinusoids 的教材測試,它最後安排成 5 個 Step。
第一步先從正弦波最基本的模型開始,理解 V_m、ω、t 和 θ 在 v(t)=V_m cos(ωt+θ) 裡分別代表什麼。

到了第二步才開始進 period 和 phase,接著逐漸碰到三角關係與 sine、cosine 的組合。
這個順序至少是有「前一個概念幫下一個概念鋪路」的,而不是五張互相獨立的卡片。
每一步除了標題之外,現在都有 Goal、Explanation、Why this comes next 和 Source。
其中我最喜歡的其實是 Why this comes next。
因為它不是只告訴我「現在要學這個」,還會解釋為什麼這個東西應該接在前一步後面。
像其中一個 Step 在學如何把 sine 和 cosine 組合成單一 sinusoid 時,它會說這一步是在利用前面剛學過的 identities 和 phase concepts,把更一般的 sinusoidal expression 簡化。
這種內容以前其實也存在教材裡,只是散落在不同頁、不同公式之間。
現在它開始被整理成一條「學習順序」。
這次有一個架構上的點我很在意。
如果每按一次 Next,就重新呼叫 OpenAI 一次,那這個功能一定會又慢又浪費 API。
所以整條 learning path 是第一次分析教材時就一起生成的。
之後的 Step 1 → Step 2 → Step 3 → Step 4,其實都只是 Streamlit 在切換已經存在的 structured data。
目前進度存在 st.session_state 裡,所以 Streamlit rerun 之後也不會突然忘記現在走到哪一步。
畫面上會顯示 Step 2 of 5,上面再放一條 progress bar,讓使用者知道現在大概走到整份教材的哪裡。
所以這部分其實完全沒有額外 AI 成本。
| 操作 | 是否呼叫 OpenAI |
|---|---|
| 第一次 Visualize 教材 | 是 |
| Previous / Next | 否 |
| 切換 Guided Learning Step | 否 |
| Quiz 作答與判分 | 否 |
| Explain this step | 是 |
這也是我今天做這個功能時很想守住的一件事:互動不等於每一個按鈕都要呼叫 AI。
如果東西已經在第一次分析時產生,就應該盡量把後面的互動留在本地完成。
不過 Guided Learning 如果只有 Previous 和 Next,其實很容易變成另一種簡報模式。
所以 Day 9 做的 Explain This 這次也被接進來了。
如果某一步看不懂,可以直接按 Explain this step。
它沒有另外做一套新的 explanation system,而是繼續沿用原本的 Structured Output:
差別只是現在多了一種 learning_path_step target。
系統會把目前這一步的 title、learning goal、原本 explanation、connection_to_previous、source pages,以及前後 learning step 的資訊一起當成 context。
所以它不只是解釋某一句話,而是知道「你現在正在這條學習路徑的哪裡」。

像這次走到 phasors、impedance 和 admittance 時,Explain This 不只介紹 phasor 是什麼,也有接回前面剛學過的 amplitude-and-phase representation,說明為什麼前面的三角處理會成為後面電路分析的基礎。
這就跟 Day 11 的 Visual Flow 有點像。
我現在越來越不想讓 Explain This 只收到一個孤立的名詞,而是希望它知道:
「使用者是在什麼脈絡下卡住的。」
Guided Learning 的最後不是「恭喜完成」。
我加了一個 Knowledge Check。
目前預設是 3 題選擇題,每一題通常有 4 個選項,而且題目也是第一次分析教材時就跟 learning path 一起產生。
這代表使用者選答案後,系統根本不需要再問 AI「他答對了嗎?」
因為 Structured Output 裡面已經有 correct_option_id 和 explanation。
所以按 Check answer 時只是本地判斷。
答對會直接顯示:
Correct
答錯則會顯示:
Not quite
接著再把原本生成好的解釋顯示出來。
我測試時還刻意答錯。
例如其中一題問:
把
sin(ωt)改成sin(ωt+φ),但 amplitude 和 frequency 都不變,會造成什麼效果?
我故意選「週期會從 T 變成 T/2」。
系統直接判定 Not quite,然後再顯示原本準備好的 explanation,而不是為了糾正我重新打一個 API request。
三題都回答完之後,最後會直接得到這次 Knowledge Check 的結果。

我這次故意答錯兩題,所以最後是 1 / 3 correct。
目前我沒有把這個分數拿去判斷「你很弱」、「你已經精通」之類的東西。
因為三題測驗根本沒有資格替一個人的能力貼標籤。
它現在就只是很單純地告訴使用者:
這三題你答對了幾題。
我覺得這樣反而比較合理。
Day 12 這次算是目前改動比較大的一天。
最後 commit 顯示 4 個檔案總共大約有 830 行新增、20 行刪除,除了 app.py 之外,README、AGENTS 和 PRODUCT_VISION 也一起更新。
但真正讓我覺得這一天比較重要的,不是因為多了 800 多行,也不是因為終於有 Quiz。
而是前面幾天做的那些東西,開始真的串起來了。
Quick Summary 不再只是摘要。
Key Concepts 不再只是條列。
Concept Map 和 Flow 不再只是圖片。
Explain This 也不再只是掛在某幾段文字下面。
現在它們開始共同支撐一個完整一點的學習流程:
AI 理解教材
↓
整理教材結構
↓
選擇合適的視覺化
↓
安排 Guided Learning
↓
逐步學習
↓
卡住就 Explain This
↓
Knowledge Check
我覺得這才比較接近 Visual Learning Lab 一開始真正想做的事情。
不是把一份 PDF 壓縮成另一份比較短的文字,而是把原本不好進入的教材,重新整理成一個比較容易理解、可以互動、也可以逐步往下走的學習介面。
如果只看功能名稱,Guided Learning 好像只是又新增一個區塊。
但對整個專案來說,我覺得它比較像一次方向上的改變。
前十一天,大部分時間都在想:
AI 能不能更完整地理解教材?
現在開始,我想問的是:
理解完之後,產品要怎麼幫人學?
今天這個版本當然還很初階。
學習路徑目前是一次生成的,還不會根據 Quiz 結果動態改變;答錯也不會自動把你送回對應的 Step;Source Check 還沒真正做進來;Guided Learning 也還沒有把 Concept Map 裡的節點直接嵌進每一步。
但至少它第一次不只是把所有答案攤在螢幕上。
它開始試著說:
先看這個。
懂了之後,再往下一步。
如果這裡卡住,就直接問。
最後,再確認一次自己到底有沒有理解。
我覺得這比再多做一種 visualization,更接近我現在想把 Visual Learning Lab 做成的樣子。
GitHub Repo:
https://github.com/f24131128-lgtm/visual-learning-lab