LLM 其實怎麼跑起來的?從 Token 到下一個 Token 迴圈
大型語言模型很會裝。
畫面上看起來像一個人在回訊息:一句一句、有語氣、有停頓,偶爾還會很有自信地講錯。可是把外殼拆掉,裡面其實沒有一個小人在讀文章、思考、再打字。裡面是一條很機械的流水線。
文字先被切成 token。Token 變成數字 ID。數字 ID 查表變成向量。向量被加上位置感。接著一層一層 Transformer 區塊反覆加工:注意力機制讓 token 互相看,FFN 讓每個 token 自己消化,殘差流把中間結果一路累積,正規化防止數字爆炸。最後,模型不是輸出「答案」,而是輸出「下一個 token 可能是誰」的分數。
聽起來冷冰冰,對吧?
但這就是最有趣的地方:一個看起來像聊天的東西,底層其實只是在重複做「下一個字最可能是什麼」。魔法不是某個單一零件,而是這些零件疊到夠大、資料餵到夠多、訓練跑到夠久以後,行為開始像理解。
今天這篇不是要把 Transformer 的數學全部推完。那會變成期末考複習講義,讀者看三段就開始想滑 短影音。今天的目標比較務實:看懂 LLM 模型卡 或 Transformer 論文時,至少知道那些零件名稱在講哪一層。
先看全景。
`Transformer` 架構 LLM 的核心流水線
🏰 第 0 層:Token — 模型讀的不是文字,是編號
第一個殘酷事實:LLM 不直接讀文字。
人類看到 strawberry,腦中會浮出草莓、紅色、甜味、冰淇淋。模型看到的第一步不是這些東西,而是一串整數。這個轉換過程叫 斷詞。
Token 可以先想成「模型世界裡的最小文字積木」。它不一定是一個字,也不一定是一個完整單字。英文的 running 可能被切成 run 和 ning。中文也可能被切成字、詞、或更奇怪的片段。每個 token 都會對應到一個固定編號,叫 詞元編號。
這也是為什麼早期模型常常數錯 strawberry 裡有幾個 r。人類按字母數,模型看到的可能是幾個 子詞詞元。它不是在字母層級工作,所以要求它逐字母數數,就像要求收銀機只看條碼猜商品包裝上有幾個紅色字母。不是不可能,但不是它原生擅長的介面。
斷詞的取捨會直接影響成本。文字被切得越少 token,推論越便宜;切得越碎,模型需要處理的步數越多。不同模型家族用不同斷詞器,帳單、上下文視窗實際可用量、多語言表現,都會被這一步影響。
Mogu 認真說:
這也是 prompt engineering 裡很多怪現象的底層原因。人類覺得「只是多打一點字」,模型看到的是「多了幾百個 token 要進注意力機制」。帳單不是按人類的字數算,是按模型世界的積木數算。這也是為什麼換斷詞器會讓舊 prompt 的成本突然浮動,像換了一把量尺以後發現家裡牆壁變長了。牆沒變,是量法變了。
Tokenization 這一步主要在做什麼?
Tokenization 是文字進模型前的第一道轉換:文字先被切成 token,再映射成詞元編號。模型後面處理的是這些 ID 對應出來的向量。
正確答案是 A
Tokenization 是文字進模型前的第一道轉換:文字先被切成 token,再映射成詞元編號。模型後面處理的是這些 ID 對應出來的向量。
🏰 第 1 層:嵌入向量 — 條碼要先查表,才會變成意思
Token ID 本身沒有意義。
1024 只是一個數字。它不比 1025 更聰明,也不自帶「貓」「程式」「晚餐」的概念。模型要先拿這個 ID 去查一張巨大表格:嵌入矩陣。
嵌入矩陣可以想成「每個 token 的向量字典」。每一列對應一個 token,每一列是一串很長的數字。7B 級模型常見隱藏維度可能是 4096,意思是每個 token 會被換成 4096 個數字組成的向量。
向量 不用想太玄。先想成一張超長的角色能力表:甜度、技術感、名詞感、動詞感、跟 Python 相關的程度、跟法國相關的程度。真實模型裡不是人類手刻這些欄位,但訓練會讓向量空間自然長出語意結構。
常聽到的 king - man + woman ≈ queen,就是 嵌入空間有語意幾何的經典例子。沒有人硬把「國王減男性加女性等於女王」寫進規則裡;模型只是為了預測文字,被迫把語意關係壓進向量位置。
但這裡還缺一件事。
同一個 token 的嵌入,不知道它站在句子的哪裡。dog 出現在第一個位置,和 dog 出現在第十個位置,查到的是同一列向量。可是語言順序很重要。「狗咬人」跟「人咬狗」完全不是同一件事,雖然 token 集合很像。
所以接下來要把「位置」放進來。
嵌入矩陣的角色最接近哪一個?
Token ID 只是索引。嵌入矩陣會把這個索引換成模型可以計算的向量,後面的 `Transformer` 區塊都在處理這些向量。
正確答案是 A
Token ID 只是索引。嵌入矩陣會把這個索引換成模型可以計算的向量,後面的 `Transformer` 區塊都在處理這些向量。
🏰 第 2 層:位置 — 同一個字,站不同位置就不是同一回事
Transformer 的 注意力機制 本身不天然知道順序。
如果只丟一堆 token 嵌入進去,模型看到的是一包向量,不是有順序的一句話。可是語言不是超市購物籃。雞蛋、牛奶、吐司順序換了沒差;「工程師修好了 bug」和「bug 修好了工程師」順序一換,世界觀直接崩壞。
早期 Transformer 用 位置編碼:每個位置有一組數字,直接加到 token 嵌入裡。位置 1 加一種波形,位置 2 加另一種波形。這樣同一個 token 放在不同位置,進模型時就會變成不同向量。
現代 LLM 常見的是 RoPE(旋轉位置嵌入)。這個名字很嚇人,但直覺可以很簡單:不要把位置資訊硬塞進 token 本身,而是在注意力機制比對 Query 和 Key 的時候,根據位置把向量旋轉一下。
RoPE 的好處是比較自然地表達相對位置。注意力機制在意的常常不是「這是第 500 個 token」,而是「這個 token 跟那個 token 距離多遠」。這也是為什麼 RoPE 會出現在 LLaMA、Mistral、Gemma、Qwen 這些現代開放權重模型家族裡。
但位置資訊不是萬靈丹。長 context 裡常見的 中段遺失 問題,意思是模型比較容易用到開頭和結尾,埋在中間的資訊比較容易被忽略。長上下文不是大法師的無限記憶宮殿,比較像塞到爆的冰箱:東西都在裡面,但每次找蛋不一定找得到。
Mogu 畫重點:
這一層很直接連回 prompt 寫法。重要資訊放開頭或結尾,通常比埋在中間可靠,不是玄學,是模型使用長上下文的行為真的有偏差。很多 prompt 技巧看起來像民俗療法,底層其實是架構的副作用。
`RoPE` 的核心直覺是什麼?
`RoPE` 不是單純把位置向量加進嵌入,而是在 `Query` / `Key` 比對時用旋轉方式注入位置資訊,讓相對距離自然出現在注意力機制裡。
正確答案是 A
`RoPE` 不是單純把位置向量加進嵌入,而是在 `Query` / `Key` 比對時用旋轉方式注入位置資訊,讓相對距離自然出現在注意力機制裡。
🏰 第 3 層:注意力機制 — Token 之間開始互相看
前面三步處理的是「每個 token 自己是誰、站在哪裡」。接下來才是 Transformer 最有名的部分:注意力機制。
注意力機制的任務很單純:每個 token 要決定,前面哪些 token 對現在這一步最重要。
這裡有三個角色:Query、Key、Value,簡稱 Q、K、V。
Query 是「正在找什麼」。Key 是「身上掛著什麼標籤」。Value 是「如果被選中,要帶走什麼資訊」。
數學上,Query 會和 Key 做點積,得到相似度分數。分數再經過 softmax,變成加總為 1 的權重。權重越高,對應的 Value 對目前 token 的影響越大。
GPT 風格的純解碼器模型還有一個限制:因果遮罩。生成第 5 個 token 時,只能看第 1 到第 5 個 token,不能偷看第 6 個。因為第 6 個還沒生成。這就是為什麼語言模型是左到右一個 token 一個 token 長出來。
這裡也是 KV 快取出現的地方。生成新 token 時,前面 token 的 Key 和 Value 不需要每次重算,可以先存起來。這個快取讓生成快很多,但長 context 也會讓快取變大,吃掉很多記憶體。
Mogu 吐槽時間:
KV 快取是很多推論成本問題的核心。長 prompt 貴,不只是因為讀很多字,而是因為模型要保留很多過去 token 的 K/V 狀態,後面每生一個 token 都要拿來比對。這就像會議逐字稿越長,秘書要帶在身上的資料夾越厚。不是不能帶,是每走一步都比較重。
在 Q/K/V 裡,哪一個最像「如果匹配成功,就真正被複製過去的資訊」?
`Query` 負責找,`Key` 負責被比對,`Value` 才是匹配後實際被加權帶走的資訊。
正確答案是 C
`Query` 負責找,`Key` 負責被比對,`Value` 才是匹配後實際被加權帶走的資訊。
🏰 第 4 層:多頭注意力 與 GQA — 一雙眼睛不夠,那就開很多雙
一個 注意力機制 頭 只是一種看世界的方式。
語言裡同時存在很多關係:主詞和動詞、代名詞和人名、句子裡的引用、前後文的格式規律、程式碼裡變數和型別的關係。只用一個視角看,太窄。
所以 Transformer 用 多頭注意力:同一層裡平行跑很多個 注意力機制 頭。每個 頭 有自己的 Q/K/V 投影,學會看不同關係。最後再把這些 頭 的輸出合起來,丟回同一條 殘差流。
這裡有一個常見誤解:每個 頭 不是「拿原始向量的一小段固定切片」。比較準確的說法是:每個 頭 都有自己的 學出來的投影,把完整 詞元向量 投影到自己的小空間。
現代模型還常用 GQA(分組查詢注意力)。它的動機很實際:KV 快取很貴。
傳統多頭注意力裡,每個查詢頭都有自己的 Key/Value 頭。GQA 讓多個查詢頭共用比較少組 Key/Value。效果像保留很多種提問視角,但減少需要存的資料夾數量。LLaMA-2 70B、Mistral 7B 這類模型都採用過這種設計。
這不是華麗理論,是推論工程。模型要跑得快、長 context 要扛得住,KV 快取記憶體壓力就得降下來。
Mogu 內心戲:
這是讀模型卡時很值得注意的地方。看到 GQA,不要只想「架構名詞 +1」。它其實在講一個 production 問題:長上下文生成時,記憶體快被 KV 快取吃爆,所以架構要幫推論省錢。很多模型設計不是為了論文好看,是為了資料中心帳單不要好看得太恐怖。
GQA 主要想改善哪個實務問題?
GQA 讓多個查詢頭共用較少的 key/value 頭,主要好處是降低 KV 快取 的記憶體成本,同時保留多個查詢視角。
正確答案是 A
GQA 讓多個查詢頭共用較少的 key/value 頭,主要好處是降低 KV 快取 的記憶體成本,同時保留多個查詢視角。
🏰 第 5 層:FFN、SwiGLU、MoE — 模型的知識倉庫不只在 注意力機制
注意力機制 很有名,所以很多人以為 Transformer 的靈魂都在 注意力機制。
其實每個 Transformer 層裡還有另一個重量級零件:前饋網路(FFN)。
注意力機制負責 token 之間互相交換資訊。FFN 則是每個 token 自己單獨加工。它通常做三件事:先把向量展開到更大的維度,經過非線性,再壓回原本大小。
非線性 是關鍵。沒有它,兩層線性層疊起來還是等於一層線性層,再疊一百層也只是比較會浪費電的一層。非線性讓模型可以表達彎曲、分段、條件式的關係。
現代 LLM 常見的 FFN 啟動函數不是早期 ReLU,而是 GELU、SwiGLU 這些變體。細節先不用死背,重點是:FFN 不是 注意力機制 的配角,它吃掉大量參數,也承載很多模型學到的語意和事實結構。
可解釋性研究裡常看到某些 FFN 神經元 對特定概念很敏感,例如地名、語法、程式語言、某些事實關聯。ROME 這類 模型編輯 方法甚至可以對特定 FFN 權重 做低秩修改,讓模型某些事實關聯改變。這表示模型的「知道」不是一個資料庫欄位,而是分散在權重和啟動值裡的結構。
大型模型還有另一個方向:MoE(專家混合)。密集 FFN 是每個 token 都跑同一套 FFN。MoE 則是準備多個專家,每個 token 只啟動其中幾個。總參數量可以變大,但每個 token 實際跑的運算量不會同比例變大。
這就像公司有 100 個專家,但每個案子只叫 2 個相關的人進會議室。公司總知識很多,單次開會成本不一定爆炸。
Mogu 插嘴:
MoE的直覺很容易被總參數量騙。看到「8x7B」不要直接以為每個 token 都跑 56B。比較像一間有很多部門的公司,不是每封信都全公司逐字審稿。Router會決定哪些專家上場。當然路由器本身也可能出事,像專案經理把資料庫問題丟給設計部門,那就精彩了。
FFN 在 `Transformer` 層裡主要做什麼?
注意力機制 負責跨 token 混合資訊;FFN 則對每個 token 的向量獨立做展開、非線性加工、再壓回原大小。
正確答案是 A
注意力機制 負責跨 token 混合資訊;FFN 則對每個 token 的向量獨立做展開、非線性加工、再壓回原大小。
🏰 第 6 層:殘差流 與 RMSNorm — 深到幾十層還能訓練的原因
Transformer 層一層一層疊上去,問題馬上出現:如果每層都直接覆蓋前一層資訊,訓練會很難穩定。梯度可能消失,數字可能爆炸,模型深一點就開始發瘋。
所以 Transformer 用 殘差連接。
意思是每個子區塊的輸出不會直接取代原本向量,而是加回去。舊向量保留,新資訊疊上去。這條一路累積的通道常被叫做 殘差流。
但一直加東西會有另一個問題:數字可能越加越大,或分布越來越怪。這時候需要 層正規化 或現代模型常見的 RMSNorm。
正規化的任務很務實:把每個詞元向量的數值拉回穩定範圍。沒有它,深層模型很容易訓練不穩。
早期 Transformer 常用 post-正規化,也就是子區塊跑完再正規化。現代 GPT、LLaMA、Mistral 等模型常見 pre-正規化,先正規化再進子區塊,訓練深層模型比較穩。RMSNorm 則是更簡化、更便宜的正規化變體,省掉均值置中,保留重新縮放向量大小的核心功能。
這一層聽起來不華麗,但很重要。沒有殘差連接和正規化,前面那些注意力機制、FFN、MoE 都很難穩定堆到幾十層、上百層。
Mogu 碎碎念:
很多系統設計也是這樣。外面看起來最酷的是 agent、瀏覽器、tool use,真正讓系統不爆炸的常常是檢查點、重試、速率限制、健康檢查。殘差連接和正規化就是
Transformer裡的基礎設施。平常沒人鼓掌,壞掉時全場尖叫。
殘差連接的核心作用是什麼?
殘差連接讓子區塊的結果加回原向量,而不是完全取代它。這讓深層網路更容易保留資訊,也讓訓練訊號更穩定地流動。
正確答案是 A
殘差連接讓子區塊的結果加回原向量,而不是完全取代它。這讓深層網路更容易保留資訊,也讓訓練訊號更穩定地流動。
🎯 魔王關:下一詞元迴圈 — 一整段文字就是一直猜下一格
所有 Transformer 區塊跑完後,模型會拿最後一個 token 的最終向量,轉成詞彙表裡每個 token 的分數。這些原始分數叫 原始分數。
原始分數還不是機率。它們會經過 softmax,變成一個機率分布:下一個 token 可能是逗號、可能是「的」、可能是 function,每個候選都有一個分數。
接著 解碼設定會決定怎麼選。
溫度 會控制分布有多尖銳。低溫比較保守,高溫比較發散。top-k 只從前 k 個候選裡選。top-p 則從累積機率達到 p 的候選集合裡選。這就是為什麼同一個模型可以在某些設定下像嚴謹工程師,在另一些設定下像半夜三點靈感爆棚的寫作者。
選出下一個 token 後,這個 token 會被接到序列後面。模型再跑一次,產生下一個 token。然後再跑一次。再一次。直到遇到結束詞元或長度限制。
一整段回答,就是這個迴圈重複很多次。
下一詞元 生成迴圈
基礎模型的核心訓練目標也是這件事:預測下一個 token。它不是直接被訓練成「誠實」「會聊天」「會寫 code」。那些能力來自大量下一詞元預訓練之後,再加上指令微調、偏好最佳化、安全訓練、工具框架等後處理。
最後再補一個 production 技巧:推測式解碼。
直覺是先找一個小模型快速猜好幾個 token,再讓大模型一次驗證。如果小模型猜得符合大模型分布,就整批接受;猜錯再退回大模型。做對時,輸出分布可以保持等價,但速度變快。
這像讓實習生先草擬三句,資深工程師一次審三句。草稿合理就直接過,不合理再重寫。重點不是實習生比較聰明,而是資深工程師不用每個字都從零開始。
Mogu 想補充:
這也是 LLM 最容易讓人誤會的地方。表面上它像在「想完再回答」,底層卻是一格一格長出來。當然,現代 reasoning model 會用更多隱藏推理、工具呼叫、規劃框架 包住這個迴圈,但核心生成仍然離不開 逐詞元。外面穿西裝,裡面還是流水線。
結語
現在把整條路串起來:
文字先被斷詞器切成詞元編號。ID 查嵌入矩陣變成向量。位置資訊讓模型知道順序。注意力機制讓 token 彼此交換訊息。多頭注意力和 GQA 讓這個交換同時有多種視角,而且比較省 KV 快取。FFN 讓每個 token 自己加工,也承載大量學到的結構。殘差流把一路上的資訊累積起來,RMSNorm 讓數字保持穩定。最後原始分數變成下一個 token 的機率,生成迴圈一格一格往前走。
這就是 Transformer 架構 LLM 的基本骨架。
下次看到 模型卡 寫 RoPE、GQA、SwiGLU、RMSNorm、MoE,不必把它們當成一串咒語。它們只是這條流水線上的零件:有的負責位置,有的負責省記憶體,有的負責非線性加工,有的負責讓深層模型不要爆炸。
LLM 看起來像一顆會思考的大腦,但工程上更像一座巨大工廠。每個 token 都被送進輸送帶,經過一站又一站,最後吐出下一個 token。
魔法感還在,只是現在知道機房在哪裡了。
(๑•̀ㅂ•́)و✧