跳到主要內容

LV.05

注意力與工作記憶

讀病歷時,眼睛放在哪裡

BOSS
長病歷健忘症魔像
時間
約 40 分鐘
建議先過
LV.04

讀 30 天病程時,你的眼睛放在哪裡

想像你接了一位住院 30 天的病人,翻開病歷,一路往下讀。讀到第 28 天寫「再次發燒」時,你不會從頭重讀,但你會回頭找:他是不是之前有 central line?上週抗生素有沒有換?前面有沒有培養結果?你的注意力,是依「相關程度」分配給前面不同的段落。

這就是 attention 的直覺。本關 Boss「長病歷健忘症魔像」代表另一件事:不管你多會分配注意力,工作記憶總有上限。讀到後面,前面就開始模糊。模型也是這樣。

Attention:每個位置都在「回頭看」

Transformer 是現在幾乎所有 LLM 的底層架構。它處理一段文字時,對每個 token,都會計算它與前面其他 token 的「相關程度」,再用這些相關程度當權重,把前文的資訊混合起來。這個動作叫 attention。

舉例:句子「病人先前服用 warfarin,今天出現黑便,所以他需要檢查 INR」裡,當模型處理「他」時,attention 會對「病人」給很高的權重,對「黑便」給較低的權重。這不是人寫的規則,而是訓練中自動學到的。

如果你想用圖看懂,建議用這兩個外部資源(選讀,連結皆為外部網站,本站不內嵌):

延續上一關,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/)。簡易流程:

  1. 安裝後,選一個你機器放得下的小模型(LV01 的檔位建議)。這個步驟本站在 LV07 會更詳細地示範。
  2. 在載入模型時的設定中,找到 context length 的選項,先設小一點(例如 2048),再設大一點(例如 8192)。
  3. 準備一份合成長病歷(本站會在資料集關卡提供範例,目前你也可以自己用文字編一份約 3000 字的虛構住院病程)。請模型摘要,並比較兩種設定下,摘要有沒有漏掉後段的事件。
  4. 記錄結果,並觀察記憶體使用量(「活動監視器」可看)。

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)

逐行解釋:

  1. 載入分詞器(同上一關)。
  2. 載入 Qwen3 的 tokenizer。
  3. 用一句虛構的句子重複 200 次,當作「很長的病歷」。真實的病歷會更雜,你可以換成自己編的長文。
  4. 計算 token 總數。
  5. 對 4096 與 8192 兩種上限逐一檢查。
  6. 判斷是否放得進去,並印出實際 token 數。

請你改動重複次數,看看大概到幾次會超過 4096,再換成你自己編的病歷,比較結果。這是最簡單的「Context 截斷」直覺。

本關重點

  1. Attention 讓模型處理每個位置時,依相關程度分配前文的「注意力」,像是臨床讀病歷時回頭對照。
  2. Context window 是模型一次能看到的 token 上限,像工作記憶;超過會被截斷、報錯或需要另外處理。
  3. KV cache 是推論時存放前文中間結果的暫存,長度越長佔越多記憶體,所以長病歷同時受上限與記憶體限制。
  4. 處理長文件的第一步是計算 token 數;放得進 context 不等於讀得好,要用合成資料實測。
  5. 下一站:模型圖鑑館,學習怎麼看模型卡,挑適合背包大小的模型。

BOSS 戰:長病歷健忘症魔像

HP0/4
  1. 用「讀病歷」類比,attention(注意力)機制最貼近下列哪一個描述?

  2. 模型的 context window 是 4096 token,你丟進一份 6000 token 的病歷,常見的結果是什麼?

  3. 關於 KV cache,下列哪個敘述較正確?

  4. 為什麼本站主線在訓練資料中,要注意每筆病歷的 token 長度(例如 max sequence length)?