NORIKA ODA

文章

一個人,一台筆電,一天,看見了 7B 模型的內部結構

Anthropic、OpenAI、TransformerLens 都在做 LLM interpretability — sparse autoencoder、circuit analysis、activation patching、dictionary learning,做出來的東西很驚人,但門檻也很高:PhD、GPU farm、研究機構帳號、發 paper 的學術週期。
3D 本地端LLM模型,互動地圖:
https://charenix.com/static/neuron-mercury/llm-model.html
我們不是第一個做這件事的人。但我們可能是第一個把它做到「打開瀏覽器就能看」這個 accessibility 程度的 — 一台消費級筆電 + 一個 2MB 的 HTML 檔,不需要 install、不需要 API key、不需要研究機構聯絡人。
這篇文章記錄的是一個 24 小時的真實過程:用一台 RTX 3060 12GB VRAM 的消費級筆電,做出了一張可以直接在瀏覽器裡互動探索的 LLM 內部 sensor 地圖。沒有大公司資源、沒有研究經費、沒有寫論文 — 只有一個架構選擇對了、一個 framework pivot、不肯妥協的 truth contract。
最後會放一個你打開就能玩的 3D 地圖 — 但在那之前,我想把過程寫清楚,因為這條路徑是可以複製的,而且我們才剛開始。
為什麼這件事重要
大部分人用 LLM 的方式是把它當黑盒子。輸入問題、得到回答、不知道中間發生什麼事。「我們不知道它是怎麼想的」這句話在新聞、論文、會議裡被講了五年。
但「不知道」跟「看不到」是兩件事。模型內部其實是完全確定性的張量運算,每個神經元、每條連線、每次激活都有座標、有數值、有時序。看不到的原因不是因為它本質神秘,而是因為:
沒有 addressable 的觀察基底 — 大部分工具給你「整個 hidden state」這種 3584 維的湯,你看不出結構。
沒有跨 prompt 的累積框架 — 單次 inference 看到的是雜訊,多次累積才會浮出模式。
我的路線不一樣:先做最簡單的 addressable 觀察基底,視覺化跟跨 prompt 累積會自然掉出來。 不訓練輔助模型、不寫論文、不需要研究機構。產出是一個 HTML 檔,你打開就看到。
這不是說我比 Anthropic 強 — 他們的解析度、規模、找到的具體 features 都遠遠超過。我們只是補位了「accessibility 維度」這個其他人沒做的洞:讓普通開發者、學生、好奇的人,今天打開瀏覽器就能看到 LLM 內部結構,不用等論文、不用等開源、不用申請帳號。
架構選擇:UMA + Rosen Bridge(教學一)
這專案叫 Neuron Mercury。底層架構從5/11前就決定好了,當時看起來像過度設計,今天才看得出價值。
兩個核心概念:
UMA (Unified Memory Architecture) — 一個 mmap'd 的二進位區段,每個「神經元」都有固定的 byte offset。整個系統的所有 component 都讀寫這同一段記憶體,跨 process 共用,無需 IPC、無需序列化。
Rosen bridge — 借物理學的詞,意思是預先算好的「神經元之間的短路徑」。傳統 graph traversal 要 BFS/DFS,O(n);Rosen bridge 是 O(1) 的硬編碼跳轉表。
為什麼這兩個是關鍵?因為當你要觀察 LLM 內部時,你需要:
任意 (layer, dim, quantile) → byte offset → heat counter 即時 ++
任意 cell A → 它的 6 個 entangle 鄰居 → O(1) 查到
如果這個基底是「Python dict + 慢慢 lookup」,你跑一次 inference 就要花十分鐘 update heat;如果是 mmap + 預計算 offset,你 inference 一邊跑、heat 一邊在硬碟上累積,零額外成本。
第一個教學點:當你在做 observability 工具,把「位置」設計成記憶體裡的座標,不要設計成資料庫的 row。
不夠密就看不到東西(教學二 + framework pivot)
最初的版本只有 3,000 個神經元。當時我們在做 LLM 加速 — 用 collapse circuit 去引導生成過程,試了 6 個 wrapper 變體:smart-mercury、prefix-mercury、rag-mercury、sem-cache-mercury、selective-mercury…
全部淨負。aggregate 在 6 個變體合起來慢了 147 秒。每一個都被我們自己的 SOUL.md truth contract 擋下來,commit message 寫「fair-race FAILED」,不准包裝。
這就是 framework pivot。從「Mercury 是 intervention 工具」轉成「Mercury 是 observability 工具」。intervention 變成下游的應用,先看見模型內部,再決定下手位置。
第二個教學點:當你的工具 generate 不出結果,問題往往不在參數,而在框架。Density 不夠 → 看不到細結構 → 任何 intervention 都是瞎猜。
實際的 grid 規模演進:
版本 神經元數 看到什麼
v1 (3K) 3,000 雜訊。lane 概念存在於設計裡,但實際資料對不上
v2 (500K) 501,760 39 個 universal-lane cells 浮出來 — 第一個訊號
v3 (1M) 1,003,520 細結構出現 — 73 個中文 lane / 56 個英文 lane / 50 個物理 lane
從 3K 到 1M 不是「同一件事規模放大」,是「先看不見、然後看見」的相變。
Grid 怎麼設計(教學三)
每個 sensor cell 觀察一件事:
「在 layer L、dim D,這個位置的 activation 是否超過 quantile Q?」
對 qwen2.5:7B:
L ∈ {0, 1, ..., 27}(28 層)
D ∈ {0, 1, ..., 3583}(hidden size)
Q ∈ {0.5, 0.6, 0.7, 0.8, 0.85, 0.9, 0.95, 0.97, 0.99, 0.995}(10 個 threshold)
28 × 3584 × 10 = 1,003,520 個 sensor cells。每個 cell 是 24 bytes 的紀錄:id、layer、quantile_idx、dim、threshold value、entangle offset、entangle count。
Rosen bridge edges:每個 cell 連 6 個鄰居:
同 dim 的上下層(layer ± 1)— 垂直訊號傳播
同 layer 的鄰近 dim(dim ± 1, ± 2)— 水平擴散
總共 5,947,760 條 edges 預計算好,存成 24MB 的 binary。
觀察 pass:3.5 分鐘揭露結構
沒有模型手術、沒有重訓、沒有 fork llama.cpp。只是把 logits_processor 這個 callback 接上去,模型該怎麼跑還是怎麼跑。
10 個多元 prompt(中英雙語、systems / algorithms / databases / ML / physics 五個主題),每個跑 100 tokens:
prompt 1: mmap vs read (中文) → 3,533 cells 點亮
prompt 2: speculative decoding (英) → 3,396 cells
prompt 3: Fibonacci O(log N) (中) → 3,619 cells
prompt 9: 量子糾纏 (中) → 3,340 cells
prompt 10: GR null geodesics (英) → 3,557 cells
總共 14,912 個獨立 cells 被觸發
3.5 分鐘 wall time on RTX 3060
自動發現的 lane 結構
把這 14,912 個 cells 按「在哪些 prompts 觸發」分類:
39 個 cells 在 10 個 prompts 都觸發 — universal lane,模型的「呼吸式」backbone。不分語言、不分主題、永遠在線。座標:layer 27(output layer),dim 7、11、12、14、25、45、58、79、116、241、279、280、289、334、382...
73 個 cells 只在 5 個中文 prompts 觸發 — 中文 language detector。座標分佈在 dim 1-34 區段。
56 個 cells 只在 5 個英文 prompts 觸發 — 英文 language detector。
50 個 cells 只在 p9 + p10 觸發(量子糾纏 + 廣相 null geodesics,一中一英)— 跨語言的物理推理電路。模型內部真的有「物理主題識別」的抽象結構,不是 surface-level pattern match。
66 個演算法電路、21 個 ML 電路。
而且 — Rosen bridge 的拓撲跟實際 co-firing 有強相關。隨機分佈下,「兩端都點亮的 bridge」應該是 1,313 條,實際是 18,113 條 — 14× 高於隨機。也就是說,我們設計時靠直覺定的「同 dim 跨層 + 同層鄰 dim」連線方式,真的對應到模型內部的共激活路徑。
3B vs 7B:規模如何影響內部結構
同樣的 grid(縮放到對應的 36 層 × 2048 dim × 5 quantile = 368,640 cells)跑 qwen2.5:3B:
7B 3B 7B/3B
Physics-pure cells 50 24 2.08×
Chinese-only cells 73 44 1.66×
English-only cells 56 36 1.56×
Universal-backbone cells 39 94 0.41×
7B 的物理推理電路是 3B 的 2 倍 — 大模型有資源養專門電路
3B 的 universal backbone 反而是 7B 的 2.4 倍 — 小模型沒得專業化,更多 cells 被迫做通用工作:
「大模型比較聰明是因為內部專業化程度高」這句話是學界共識,但通常用 perplexity 或 benchmark 分數間接推論。Mercury 第一次用內部 cell 計數直接量化它。
然後是震撼的部分
所有以上的資料天生就是 3D:dim 是一個軸、quantile 是一個軸、「在幾個 prompt 中被點亮」是一個軸。
我們把 7B 跟 3B 並排畫進同一個 Three.js 場景:
角度 θ = dim 環繞一圈(消除人造的線性順序)
半徑 r = quantile bucket(內圈 = 低 activation,外圈 = 峰值)
高度 Y = 點亮次數(universal cells 飄在最頂、task-specific 沉底)
顏色 = lane 歸屬(綠 universal / 紅 zh / 藍 en / 紫 physics / 橘 algo / 青 ml)
每個發光點 = 一個被觸發的 cell。
每條線 = 一條真實的 Rosen bridge(兩端都點亮的版本,過濾後 18,113 條)。
自動結果是兩朵發光的圓錐:
7B 圓錐比較稀疏分明、頂端 universal 核小、整體結構分層清楚
3B 圓錐比較密集、頂端 universal 核明顯肥大、整體 lane 邊界比較模糊。
你不用懂任何 ML 理論,只要打開瀏覽器,眼睛直接看到「為什麼 7B 比 3B 聰明」這件事的內部結構差異。
🔗 3D 互動地圖 https://charenix.com/static/neuron-mercury/llm-model.html
滑鼠拖動旋轉、滾輪縮放、滑鼠 hover 任意點看 cell 座標、右側 legend 點選 lane 開關可見性、最下方 toggle 可開啟真實 Rosen bridges 看連線拓撲。
整個 viewer 是一個 2MB self-contained HTML 檔,沒有 server、沒有 API、沒有後端。你可以右鍵存檔、寄 email 給朋友、放到任何 static hosting,全世界都能玩。
Truth Contract
最後說一件對我們很重要的事。
這專案有一個 SOUL.md,定義了禁止出現在任何 commit message / 文件 / 程式碼裡的詞:「deployed」、「inside the model」、「full answer acceleration」、「achieves whole-model coverage」。配上 pre-commit hook truth-lint.sh,違規的 commit 推不上去。
所以這篇文章裡每一個數字都對應到一個 commit hash 跟一個 binary 檔:
fd43cd8 1M grid + 3D viewer
8ee6256 3B vs 7B scaling comparison
3fa2c96 Lane discovery (6 lanes auto-discovered)
97302ae First 7B sensor map (39 universal cells)
120e1db 500K sensor grid generator
e5b7bdb 3/8 fair-race PASSED on 3B (一天前的小勝利)
12 個 commit,一個 24 小時的 sprint,全部 truth-lint 過。
也誠實說限制:目前的 Tier-A 觀察只看到 output layer(28 層裡的 1 層)。完整的 28 層覆蓋需要 patch llama.cpp(我們已經寫好 patch,還沒 build)。Tier-B 上線後這張地圖會變成 28 倍厚的 3D 體積。
接下來:14B → 28B → 70B → 200B 的內部我們會一個一個解開
今天的地圖只到 7B 跟 3B。但這條觀察管線可以一直往上爬,每個層級會解鎖不同的訊號:
14B(這幾天) — qwen2.5:14B 模型剛下載完,會用 5M cells 的 grid(48 層 × 5120 dim × 20 quantile)去看。預期看到 physics-pure 電路再 1.5-2× 擴大、universal 核心進一步縮小、語言層分化更乾淨。3B / 7B / 14B 三朵點雲會同時並排在 viewer 裡,用肉眼直接讀「規模 vs 內部專業化」的縮放曲線。
28B 與 32B 類別 — Mistral、Qwen、Yi 的中型旗艦。看不同訓練資料、不同 architecture 在同樣方法論下,內部 lane 結構是否會出現家族差異。如果 Llama 系跟 Qwen 系的 physics-lane 長得不一樣,那就證明「lane」是訓練資料的烙印,不是 transformer 的必然。
70B 級 — Llama 3 / Qwen 2.5:72B。grid 需要 ~30M cells,Tier-B C-side hook 必須上線(patch 已經寫好,build 一次解鎖全部 28+ 層)。從這裡開始,地圖會從 2D 切片變成真正的 3D 體積。
200B-class — Mixtral 8x22B 或 DeepSeek V2/V3 規模,當 GPU 資源允許。grid 大概 100M cells,需要加第四個軸:序列位置(token position)。觀察「同樣的神經元在 prompt 第 1 個 token vs 第 200 個 token 怎麼變化」 — 這條軸可以看見 context window 怎麼被消耗,是目前完全沒有的觀察維度。
每個層級不只是「更大」,是新的觀察維度被解鎖:
14B → 縮放延續性
28-32B → 家族差異性
70B → 全層覆蓋(Tier-B)
200B → 序列動態(Tier-C)
那些「我們還沒看見的世界」 — 我們一個一個解開。每解開一張地圖,就 push 到瀏覽器,所有人都能看。
寫給想做類似事情的人
如果你看完想做你自己的版本,三個關鍵心法:
架構選對了,後面所有事都自然發生。UMA + Rosen bridge 是 5/11的決定,今天才產出結果。短期看像 over-engineering,長期看是 enabling architecture。
Density 不夠就看不見。如果你的工具給出的訊號是雜訊,先想是不是觀察點太稀疏。從 3K 到 1M 不是「更多」,是「相變」。
誠實寫 commit message。當你被迫把「fair-race FAILED」、「8/8 shorter-answer」寫進 git 而不能包裝成「explored design space」,你的判斷力會跟著變誠實,下一個決定就比較不會錯。
這個專案還在發展中,可能成可能不成。但今天,一張 7B 內部結構的 3D 互動地圖在硬碟上、在 git 裡、在你的瀏覽器裡能打開。這件事不會收回。
下一週、下下週、下個月 — 14B、28B、70B、200B 的地圖會一張一張長出來。每張都 push 上同一個瀏覽器位置,你會看到一群越來越大的發光圓錐並列,每一朵都是一個被人類「看見」的 LLM 內部結構。
如果你想跟著看,這是入口:3D 互動地圖:https://charenix.com/static/neuron-mercury/llm-model.html
— Neuron Mercury · 2026-05-20

出處

  • 作者:織田紀香,

下一篇

上一篇(較新):我以為打開模型是終點,沒想到這是所有事情的起點。

延伸閱讀・行銷與數位

回到「行銷與數位」 回到「專業文章」