2026 年 7 月 27 日晚間,月之暗面(Moonshot AI)正式釋出了 Kimi K3 的完整模型權重,並同步發表了技術報告。這款模型成為全球首個實現落地的三兆參數量級開放權重模型,總參數高達 2.8 兆,原生支援多模態,並具備一百萬 token 的上下文處理能力。權重在 Hugging Face 上線後,迅速攀升至總趨勢榜首位。
回顧過去,開源模型領域的參數上限,此前由 DeepSeek V4 Pro 的 1.6 兆參數所保持,而 GLM-5.2 則為 7440 億參數。K3 的問世,直接將開放權重模型的規模上限,提升了將近一倍。
然而,這次開源最引人注目的,並非單純的參數規模。對於程式設計師而言,真正值得細細探究的,是 K3 如何在架構上實現以下三大核心設計,以驅動 2.8 兆參數的龐大模型,並將一百萬 token 融入上下文之中:
- KDA(Kimi Delta Attention)混合線性注意力機制:解決長上下文處理下的算力成本問題。
- Stable Latent MoE 極端稀疏路由:在 896 個專家模型中,僅激活 16 個,稀疏率低於 2%。
- AttnRes 注意力殘差設計:確保資訊能夠在極深的網路結構中有效傳遞。
更重要的是,官方這次除了釋出模型權重外,也一併開源了高效能注意力算子、MoE 通訊庫,以及大規模 Agent 環境基礎設施程式碼。這表示此次開源所提供的,不僅僅是一個模型,而是一套「如何訓練與執行超大型稀疏模型」的完整工程解決方案。
這篇文章將以程式設計師的視角,深入剖析 K3 的各項技術細節,力求將每個技術點解釋到「能自己動手寫出一個玩具版」的程度。
---
背景:開放權重競賽邁入三兆參數時代
首先,讓我們釐清這次事件的時間線:
- 7 月 16 日,Kimi K3 作為旗艦模型正式發布,並先行提供 API 服務。
- 7 月 27 日晚間,模型的完整權重開放原始碼,同時釋出技術報告,以及注意力算子、MoE 通訊庫、Agent 環境基礎設施等配套程式碼。
- 權重發布後,K3 迅速登頂 Hugging Face 的總趨勢榜首位。
從規模格局來看,情況也相當明朗:
| 模型 | 總參數 | 上下文 | 開源狀態 |
|---|---|---|---|
| Kimi K3 | 2.8 兆(MoE) | 100 萬 token | 開放權重 |
| DeepSeek V4 Pro | 1.6 兆(MoE) | 100 萬 token | MIT 開源 |
| GLM-5.2 | 7440 億 | — | 開源 |
在第三方評測機構 Artificial Analysis 的綜合智能指數排名上,K3 位列全球第三,僅次於兩個閉源模型:Claude Fable 5 和 GPT-5.6 Sol。然而,在 Frontend Code Arena(前端程式碼競技場)這項評測中,K3 以 1679 分反超 Claude Fable 5(1631 分)和 GPT-5.6 Sol(1618 分),一舉奪得全球第一。
作為一個開放權重模型,K3 能夠在特定細分場景中超越兩個最強大的閉源模型,這正是其引發熱烈討論的直接原因。然而,從工程角度來看,更具深意的一個問題是:一個擁有 2.8 兆參數的模型,究竟憑藉什麼才能夠高效運行,並降低使用成本?
答案,正隱藏在其獨特的架構設計之中。
---
核心架構總覽:K3 的設計哲學
根據官方技術報告與公開資料,K3 的核心規格重點如下:
- 總參數量:高達 2.8 兆(約為上一代 K2.5 的三倍)。
- 架構:採用 Stable Latent MoE 稀疏專家系統,內含 896 個專家模型,每個 token 僅激活其中 16 個。
- 注意力機制:整合了 KDA(Kimi Delta Attention)混合線性注意力,並輔以 AttnRes 注意力殘差設計。
- 上下文窗口:支援 100 萬 token 的超長上下文;最大輸出長度為 128K token。
- 多模態能力:原生支援視覺理解,而非傳統的外部視覺編碼器拼接的「膠水方案」。
- 訓練方式:採用 MXFP4 量化訓練;官方宣稱在相同算力條件下,整體擴展效率比 K2 提升約 2.5 倍。
將這些規格串聯起來,我們可以發現 K3 的設計哲學呈現出高度的一致性:所有的架構決策,都在嘗試回答同一個核心問題——如何在既定算力不變的前提下,進一步提升模型的有效智能上限。
具體而言:
- 追求大參數規模:模型需要足夠的參數來承載複雜的知識與能力。→ 但推論算力不能因此暴增。→ 解決方案是採用極端稀疏的 MoE 架構,使得 2.8 兆的總參數中,每次推論只動用一小部分。
- 支援超長上下文:對於理解複雜情境和處理大量資訊至關重要。→ 但注意力機制的計算成本不能呈平方級增長。→ 解決方案是採用混合線性注意力 KDA。
- 構建深層網路:有助於提取更高層次的特徵。→ 但資訊在深層網路中不能發生衰減。→ 解決方案是加入注意力殘差 AttnRes。
- 優化訓練成本:對於大規模模型訓練至關重要。→ 解決方案是採用 MXFP4 低精度量化訓練。
接下來,我們將逐一深入剖析這些核心技術。
---
Stable Latent MoE:896 選 16 的稀疏經濟學
3.1 為何選擇極端稀疏設計
MoE(Mixture of Experts,專家混合)的核心思想已廣為人知:將傳統的 FFN(Feed-Forward Network)層分解為 N 個獨立的「專家」,每個 token 經由一個路由器(router/gate)的引導,僅選擇其中 k 個專家進行處理。這樣一來,模型的總參數量等於所有專家參數的總和,而實際激活的參數量則約為 k/N 的比例。
K3 的配置是從 896 個專家中激活 16 個,其激活比例約為 1.8%。我們可以對比幾個常見的 MoE 模型配置:
- Mixtral 8x7B:在 8 個專家中激活 2 個,激活比例為 25%。
- DeepSeek-V3 系列:約在 256 個專家中激活 8 個,激活比例約為 3%。
- Kimi K3:在 896 個專家中激活 16 個,比例約為 1.8%。
從這些數據中可以觀察到一個明顯的趨勢:專家的數量正在呈指數級增長,而激活的比例則持續降低。這背後的原因,是一條被反覆驗證的經驗規律——在激活算力(FLOPs)保持不變的前提下,增加模型的總參數量(即增加專家數量)依然能夠帶來模型能力的顯著提升。因此,稀疏度可以被視為一種「白白撿到的容量」。
然而,極端稀疏的 MoE 設計面臨著兩個主要的工程挑戰:
- 路由不穩定性:當專家數量越多時,路由器越容易出現「偏科」現象——某些熱門專家可能因過度擁擠而過載,而另一些冷門專家則可能長期處於閒置狀態,這會導致訓練過程中的震盪與不穩定。
- 通訊開銷:專家模型通常分佈在數百甚至數千張加速卡上。當 token 需要跨卡分發(all-to-all)給不同的專家時,專家的數量越多,通訊的拓撲結構就越複雜,進而導致通訊開銷大幅增加。
K3 所採用的「Stable Latent MoE」架構,其名稱中的「Stable」正是針對第一個問題的解決方案,而「Latent」則暗示了路由決策是在一個壓縮的潛在空間中進行的。這表示模型會先將 token 的表示投影到一個低維度的潛在空間,然後再進行路由決策。這種方法不僅降低了路由計算的成本,也使得路由訊號更加平滑,減少了被單一維度雜訊干擾的風險。儘管官方尚未完全公開路由的詳細細節,但這個方向與近年來「路由應在解耦的低維空間進行」的研究共識是相符的。
3.2 建立直覺:玩具版 top-k 路由實作
為了幫助讀者建立對 top-k MoE 層的直觀理解,我們可以用 PyTorch 撰寫一個最小可用的簡化版本(此處省略了負載均衡損失與容量因子的複雜性):
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class Expert(nn.Module):
"""單個專家:本質上就是一個標準的 FFN 層"""
def __init__(self, d_model: int, d_ff: int):
super().__init__()
self.w1 = nn.Linear(d_model, d_ff, bias=False)
self.w2 = nn.Linear(d_ff, d_model, bias=False)
def forward(self, x):
return self.w2(F.silu(self.w1(x)))
class TopKMoE(nn.Module):
def __init__(self, d_model=1024, d_ff=4096,
n_experts=64, top_k=4, d_latent=128):
super().__init__()
self.d_model = d_model
self.n_experts = n_experts
self.top_k = top_k
# 路由器:將 token 投影到潛在空間,然後透過線性層選擇專家
self.router = nn.Linear(d_model, n_experts, bias=False)
# 定義多個專家模型
self.experts = nn.ModuleList([Expert(d_model, d_ff) for _ in range(n_experts)])
# Latent Router 的額外層,如果需要更複雜的潛在空間路由
# self.latent_projection = nn.Linear(d_model, d_latent, bias=False)
# self.latent_router = nn.Linear(d_latent, n_experts, bias=False)
def forward(self, x):
batch_size, seq_len, d_model = x.shape
x_flat = x.view(-1, d_model) # (Batch*SeqLen, d_model)
# 步驟一:計算路由分數
# 這裡簡化為直接從 d_model 路由,K3 的 Latent 概念會在此處引入一個低維投影
routing_logits = self.router(x_flat) # (Batch*SeqLen, n_experts)
routing_weights = F.softmax(routing_logits, dim=-1) # (Batch*SeqLen, n_experts)
# 步驟二:選取 Top-K 專家
top_k_weights, top_k_indices = torch.topk(routing_weights, self.top_k, dim=-1) # (Batch*SeqLen, top_k)
# 正規化 Top-K 權重,確保總和為 1
top_k_weights_normalized = top_k_weights / top_k_weights.sum(dim=-1, keepdim=True)
# 步驟三:將 token 分配給專家並進行計算
output = torch.zeros_like(x_flat) # (Batch*SeqLen, d_model)
# 為了效率,通常這裡會進行 batching,將相同專家的 token 收集起來批量處理
# 為了簡潔,這裡使用迴圈遍歷每個 token 和其選定的專家
for i, (weights_i, indices_i) in enumerate(zip(top_k_weights_normalized, top_k_indices)):
expert_output_i = torch.zeros(d_model, device=x.device)
for j in range(self.top_k):
expert_idx = indices_i[j]
weight = weights_i[j]
expert_output_i += weight * self.experts[expert_idx](x_flat[i])
output[i] = expert_output_i
return output.view(batch_size, seq_len, d_model)
<h1>範例使用</h1>
if __name__ == "__main__":
d_model = 1024
d_ff = 4096
n_experts = 896 # K3 的專家數量
top_k = 16 # K3 的激活專家數量
moe_layer = TopKMoE(d_model=d_model, d_ff=d_ff, n_experts=n_experts, top_k=top_k)
# 模擬輸入:一個批次,序列長度為 128
input_tensor = torch.randn(2, 128, d_model)
output_tensor = moe_layer(input_tensor)
print(f"輸入形狀: {input_tensor.shape}")
print(f"輸出形狀: {output_tensor.shape}")
# 驗證激活參數量
total_params = sum(p.numel() for p in moe_layer.parameters())
print(f"MoE 層總參數量: {total_params / 1e6:.2f} M")
# 這裡的 "激活參數量" 概念對於 MoE 需要更精確的定義
# 一般指的是 Inference 時實際被計算的參數量,難以直接從上面的簡易程式碼中直接統計
# 實際激活參數量約為 (d_model n_experts + n_experts d_model) for router + top_k (d_model d_ff + d_ff * d_model) for experts
# 相較於一個單一 FFN (d_model d_ff + d_ff d_model),總參數規模是巨大的,但激活計算量可控。
這個玩具範例展示了 MoE 層的核心邏輯:一個路由器負責為每個輸入 token 計算分配給各個專家的分數,然後選擇分數最高的 top_k 個專家。每個選定的專家獨立處理 token,最終將這些專家的輸出根據路由分數進行加權求和。K3 的 Stable Latent MoE 在此基礎上,進一步將路由過程引入低維潛在空間,並強調了路由的穩定性,這在實際大規模訓練中至關重要。
---
KDA(Kimi Delta Attention):長上下文的算力平衡術
對於 Transformer 架構而言,注意力機制是其核心所在。然而,標準的自注意力(Self-Attention)機制,其計算複雜度會隨著上下文長度 N 的增加,呈 O(N^2) 的平方級增長。這意味著在處理百萬級 token 的超長上下文時,傳統注意力機制的計算成本會變得極其高昂,甚至無法承受。
KDA(Kimi Delta Attention)正是為了解決這個問題而設計的混合線性注意力機制。它的目標是將注意力機制從 O(N^2) 的複雜度,降低到接近 O(N) 的線性或準線性複雜度,從而能夠在可控的算力下處理超長序列。
KDA 的具體實作細節,官方技術報告中雖未完全揭露其所有層次,但從「混合線性注意力」這個描述可以推斷,它很可能整合了多種線性注意力技術的優點,例如:
- 基於核函數的方法(Kernel-based methods):這類方法通過引入特定的核函數,將注意力機制的
Q和K向量投影到一個高維空間,並在該空間中計算其內積,從而避免了直接計算Q K^T矩陣乘法,將複雜度從O(N^2)降至O(N)。常見的例子包括 Performer、Linear Transformer 等。 - 稀疏注意力(Sparse Attention):不對所有
Q和K進行計算,而是基於某些策略(如固定模式、局部關注、或基於內容的稀疏化)只計算部分相關的注意力權重。
O(L^2) (L為片段長度),整體則為 O(N) 或 O(N log N)。
KDA 的「Delta Attention」部分可能暗示了其在計算注意力時,並非每次都從頭計算所有 token 的交互,而是可能利用增量更新或差異計算的方式,特別是在處理長序列時,可以只關注與當前 token 相關的「delta」(變化量)資訊,或者利用已經計算過的資訊來加速後續計算。
結合「混合」這個詞,KDA 最有可能的做法是:在不同的層次或不同的任務中,彈性地選擇和組合不同的注意力機制。例如,在處理局部上下文或關鍵資訊時,可能仍然採用傳統的自注意力來保持高精度;而在處理遠距離依賴或冗餘資訊時,則切換到計算效率更高的線性注意力機制。這種混合策略能夠在保持模型性能的同時,大幅降低長序列處理的算力開銷。
K3 能夠實現 100 萬 token 的上下文,KDA 絕對是其核心支撐技術之一。它解決了 Transformer 模型在處理超長序列時最根本的計算瓶頸,使得大規模語言模型能夠在實際應用中處理更廣闊的資訊視窗。
---
AttnRes 注意力殘差:深層網路中的資訊傳遞
隨著模型層數的增加,深度網路面臨的一個普遍問題是資訊衰減。在 Transformer 模型中,每經過一個層,資訊都會被重新轉換和傳遞。當網路足夠深時,早期的輸入資訊可能會在層層傳遞的過程中逐漸「稀釋」或「遺失」,導致模型難以捕捉到長距離的依賴關係,也可能讓訓練變得困難。
殘差連接(Residual Connection),即著名的「殘差網路(ResNet)」,正是為了解決這個問題而引入的。它允許資訊在網路中直接「跳過」一些層,從而保證原始資訊能夠直接傳遞到更深層次,有助於梯度在反向傳播時更順暢地流動,緩解梯度消失問題,並使得訓練深層網路變得可行。
K3 所採用的「AttnRes 注意力殘差」是這種殘差連接概念在注意力機制上的特定應用。它並非簡單地將注意力層的輸出加到輸入上,而是在注意力模塊內部或注意力模塊間設計了特定的殘差路徑。
傳統的 Transformer 層結構通常是:
Output = LayerNorm(Input + Attention(Input))
Output = LayerNorm(Output + FFN(Output))
而 AttnRes 可能意味著在注意力機制內部,或者注意力與後續的 FFN 之間,引入了額外的殘差路徑,例如:
- 注意力模塊內部的殘差:可能是在計算 Q、K、V 之後,輸出與輸入在某個階段進行殘差連接,以確保原始特徵在注意力計算過程中不完全被轉換。
- 注意力輸出與 FFN 輸入之間的殘差強化:除了傳統的殘差,可能還有額外的通道,將注意力機制處理過的部分資訊或原始輸入特徵更直接地傳遞給 FFN,確保 FFN 能夠同時接收到轉換後的注意力特徵和未經注意力轉換的原始特徵。
- 多頭注意力(Multi-Head Attention)各頭之間的殘差或共享機制:這可以確保不同注意力頭捕捉到的資訊能夠有效整合,避免某些頭的資訊被其他頭完全覆蓋。
AttnRes 的目標非常明確:在 K3 這種擁有數百層的超深網路中,確保資訊能夠高效、無損地從輸入層傳遞到輸出層,特別是對於百萬 token 的長上下文,更需要保證模型能夠在數百個注意力層的處理後,依然保留對上下文各部分的精確理解。
透過 AttnRes,K3 能夠在維持其龐大而深邃的網路結構的同時,確保資訊的有效流動,這對於模型的訓練穩定性和最終的性能表現,尤其是在處理長距離依賴和複雜推理任務時,具有關鍵性的作用。這也是 K3 能夠實現高性能的另一個重要基石。
---
結論:不只模型,更是完整的工程解決方案
綜觀 Kimi K3 的核心技術,無論是 2.8 兆參數的 Stable Latent MoE、處理長上下文的 KDA 混合線性注意力,還是確保深層網路資訊流暢的 AttnRes 注意力殘差,這些設計都圍繞著一個核心目標:在保持或提升模型能力的同時,極大化算力效率。
月之暗面此次開源的不僅僅是一個強大的模型權重。更重要的是,它提供了一整套「如何訓練和運行超大型稀疏模型」的工程解決方案。配套開源的高性能注意力算子、MoE 通訊庫和大規模 Agent 環境基礎設施程式碼,為廣大開發者和研究者提供了一個前所未有的視角,去理解和實踐如何在大規模 AI 時代,平衡模型性能、算力成本與工程複雜度。
這次開放,不僅將開源模型的參數規模推向了新的高峰,更為整個業界展示了在超大模型時代,如何通過精巧的架構設計和底層優化,突破算力瓶頸,將模型的智能上限再度提升。這對於開放原始碼社群而言,無疑是一份極具價值的技術寶藏,將深刻影響未來大型語言模型的研究與發展。