讀 30 天病程時,你的眼睛放在哪裡
想像你接了一位住院 30 天的病人,翻開病歷,一路往下讀。讀到第 28 天寫「再次發燒」時,你不會從頭重讀,但你會回頭找:他是不是之前有 central line?上週抗生素有沒有換?前面有沒有培養結果?你的注意力,是依「相關程度」分配給前面不同的段落。
這就是 attention 的直覺。本關 Boss「長病歷健忘症魔像」代表另一件事:不管你多會分配注意力,工作記憶總有上限。讀到後面,前面就開始模糊。模型也是這樣。
Attention:每個位置都在「回頭看」
Transformer 是現在幾乎所有 LLM 的底層架構。它處理一段文字時,對每個 token,都會計算它與前面其他 token 的「相關程度」,再用這些相關程度當權重,把前文的資訊混合起來。這個動作叫 attention。
舉例:句子「病人先前服用 warfarin,今天出現黑便,所以他需要檢查 INR」裡,當模型處理「他」時,attention 會對「病人」給很高的權重,對「黑便」給較低的權重。這不是人寫的規則,而是訓練中自動學到的。
如果你想用圖看懂,建議用這兩個外部資源(選讀,連結皆為外部網站,本站不內嵌):
- Jay Alammar 的〈The Illustrated Transformer〉:先看成單一黑盒,再逐層拆開,圖解很清楚(2018-06 發布,https://jalammar.github.io/illustrated-transformer/)。
- 3Blue1Brown 的神經網路系列,其中有一支用動畫講 attention(https://www.3blue1brown.com/topics/neural-networks)。章節順序與年份以該網站為準。
延續上一關,Transformer Explainer 也能讓你在瀏覽器內把滑鼠放在 token 上,直接看到 attention 權重(https://poloclub.github.io/transformer-explainer/)。
Context window:模型的工作記憶
Context window(上下文視窗)指模型一次能「看見」的 token 數量上限。你的提示、病歷內容、模型已經產生的回答,通通算在同一個上限裡。
類比:人腦的工作記憶一次只能放幾個項目,所以我們才會用筆記、檢驗趨勢圖、SOAP 格式來整理資訊。context window 也一樣,只是用 token 計算,而且數字大得多,常見是數千到數十萬不等,各模型不同,請以模型卡為準。
超過上限時會怎樣?依工具而定:
- 有的工具直接報錯。
- 有的默默截斷,通常是把最前面或最後面的部分丟掉。
- 有的由你另外做分段、摘要、檢索(這是進階主題)。
對本站主線的意義很直接:一份長病歷如果被截斷,剛好被截掉的位置上的 PHI,模型是看不到的,當然也抓不到。所以「先算 token 數」是處理長文件的第一步。
另外要提醒:即使放得進 context,模型對很長文件的表現也不一定均勻。這是目前研究很活躍的領域,本章不下結論,只建議:重要的任務,用你自己的合成長病歷實測,不要假設放得進去就等於讀得好。實測結果【實測數據待補】。
KV cache:為什麼長度會吃記憶體
模型是逐 token 生成的。生成第 1001 個 token 時,需要參照前面 1000 個 token 的資訊。如果每次都從頭重算,會非常慢。所以推論引擎會把前文每一層的中間結果(稱為 key 與 value)存起來,這份暫存就叫 KV cache。
它的特性(一般工程認知):
- 隨 token 數增加而增加,大致是線性的:文字越長,暫存越大。
- 只存在於推論時,是暫存,不是長期記憶;關掉對話就沒了。
- 不同模型的架構不同,用量差很多。例如有些模型的部分層共用 KV 以節省記憶體;作者在 Gemma 4 E2B 的匯出實驗中就遇到了這類設計造成的相容性問題(詳見 LV15),但各模型實際省多少,本站尚未量測,標為【實測數據待補】。
所以在 LV01 學的「模型大小 ≈ 參數量 × 位元數 ÷ 8」只算了模型本體;真正使用時,還要加上 KV cache 與系統開銷。截至 2026-10,一個粗略的準則是替 8k 以內的 context 預留約 2 到 4GB 的額外空間(來源:研究筆記 03 D1,屬推論,不同模型差異大)。LV06 的記憶體估算器會把這件事做成互動工具。
實作
🍎 Mac:用 LM Studio 看 context 長度的影響
LM Studio 是一個有圖形介面的本地模型工具,不用打指令。下載與使用方式以官方網站為準(https://lmstudio.ai/)。簡易流程:
- 安裝後,選一個你機器放得下的小模型(LV01 的檔位建議)。這個步驟本站在 LV07 會更詳細地示範。
- 在載入模型時的設定中,找到 context length 的選項,先設小一點(例如 2048),再設大一點(例如 8192)。
- 準備一份合成長病歷(本站會在資料集關卡提供範例,目前你也可以自己用文字編一份約 3000 字的虛構住院病程)。請模型摘要,並比較兩種設定下,摘要有沒有漏掉後段的事件。
- 記錄結果,並觀察記憶體使用量(「活動監視器」可看)。
LM Studio 的介面名稱與選項位置可能隨版本改變,以你看到的畫面為準,結果【實測數據待補】。
☁️ Colab:用 Python 算 token 數
不管你用 Mac 還是 Colab,都可以用下面這段程式,判斷一份病歷會不會超過 4k 或 8k 的上限。如果在 Mac 上跑,請先 python3 -m pip install transformers。
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B-Instruct-2507")
note = "病人於入院第一天發燒,使用 ceftriaxone 治療。" * 200 # 合成:重複同一句,模擬長病歷
n_tokens = len(tok.encode(note))
for limit in (4096, 8192):
print(limit, "OK" if n_tokens <= limit else "會超過", "| tokens =", n_tokens)
逐行解釋:
- 載入分詞器(同上一關)。
- 載入 Qwen3 的 tokenizer。
- 用一句虛構的句子重複 200 次,當作「很長的病歷」。真實的病歷會更雜,你可以換成自己編的長文。
- 計算 token 總數。
- 對 4096 與 8192 兩種上限逐一檢查。
- 判斷是否放得進去,並印出實際 token 數。
請你改動重複次數,看看大概到幾次會超過 4096,再換成你自己編的病歷,比較結果。這是最簡單的「Context 截斷」直覺。
本關重點
- Attention 讓模型處理每個位置時,依相關程度分配前文的「注意力」,像是臨床讀病歷時回頭對照。
- Context window 是模型一次能看到的 token 上限,像工作記憶;超過會被截斷、報錯或需要另外處理。
- KV cache 是推論時存放前文中間結果的暫存,長度越長佔越多記憶體,所以長病歷同時受上限與記憶體限制。
- 處理長文件的第一步是計算 token 數;放得進 context 不等於讀得好,要用合成資料實測。
- 下一站:模型圖鑑館,學習怎麼看模型卡,挑適合背包大小的模型。