模型 / 資料集
salesforce/CodeGen avatar
salesforce/CodeGen

CodeGen 三個世代的取捨:從 CodeGen1 到 CodeGen2.5 的模型選擇與部署現實

CodeGen is a family of open-source model for program synthesis. Trained on TPU-v4. Competitive with OpenAI Codex.

5,180 個 Star420 個 ForkPythonApache-2.0
GitHub

秒懂

它是什麼?
Salesforce AI Research 釋出的程式碼生成模型家族,涵蓋 350M 到 16B 參數與 mono、multi 兩種訓練語料。本文整理三個世代的差異、Hugging Face 上的實際載入方式,以及研究授權對生產部署的限制。
適合誰用?
CodeGen 適合三種讀者:要重現 ICLR 論文結果的研究者、需要可自行微調的程式碼生成基線的團隊,以及想研究 TPU 上訓練 LLM 流程的人。不適合直接把模型接進產品介面的團隊,因為 README 的 ethics disclaimer 明確寫著「This release is for research purposes only in support of an academic paper」,這句話與倉庫的 Apache-2.0 授權並存,實際部署前應先請法務確認兩者的關係。
可以商用嗎?
可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 105 天前。
用什麼語言寫的?
主要是 Python(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

CodeGen 想解決的是多輪程式合成,不是單次補全

多數人對程式碼模型的想像是:給一段註解,吐出一段函式。CodeGen 的論文標題把範圍拉得更寬,叫 Multi-Turn Program Synthesis,也就是在同一個會話裡連續生成、修改、再生成。README 引用的 ICLR 2023 論文《CodeGen: An Open Large Language Model for Code with Multi-Turn Program Synthesis》就是這個定位。

這決定了它的目標讀者。如果你只是想在編輯器裡做單行補全,CodeGen 的模型規模與推論成本相對不划算;350M 與 1B 版本存在,但 README 的範例一律以 2B、7B 起跳。真正會用到這個倉庫的人是:想在自己的語料上繼續預訓練或微調的研究團隊、需要一個可審計權重的程式碼生成基線來做對照實驗的人,以及研究 TPU 訓練流程的工程師。

倉庫本身不是一個工具,而是一個發布頁。README 提供的是模型清單、載入範例與論文引用,訓練程式碼另外放在 salesforce/jaxformer。把它當成 pip 安裝的套件來期待,會失望。

三個世代的差異在訓練目標,不在參數量

README 的 News 區塊把時間線寫得很清楚。2022 年 3 月發布 CodeGen1.0,當時的說法是 on par with OpenAI Codex at the time,注意 at the time 這個限定,這是發布當下的比較,不是現在的橫向評比。2023 年 5 月發布 CodeGen2.0,README 強調的是 strong infill sampling capability,也就是填空能力。2023 年 7 月發布 CodeGen2.5,訴求是 7B 參數勝過 16B 模型。

填空能力為什麼重要?程式碼編輯的實際場景多半不是從零生成,而是在既有檔案中間插入一段邏輯,前後文都已經存在。單向的因果語言模型在這種場景下要靠特殊的前後綴排列才能處理,CodeGen2 把這件事當成訓練目標的一部分。如果你要的是編輯器內的中段補全,CodeGen2 或 CodeGen2.5 的設計動機比 CodeGen1 更貼近需求。

參數規模方面,README 開頭列出 350M、1B、3B、7B、16B 五個級距,涵蓋 CodeGen1 與 CodeGen2。命名上還有 mono 與 multi 的分別,範例中出現的是 Salesforce/codegen-2B-mono 與 Salesforce/codegen25-7b-mono,mono 指單一程式語言語料,multi 指多語言。選 mono 還是 multi,取決於你的程式碼庫是否集中在單一語言。

載入模型的三段程式碼,以及藏在其中的 trust_remote_code

README 給的三個範例結構幾乎相同,差異在模型名稱與參數。CodeGen1 的寫法是從 transformers 匯入 AutoTokenizer 與 AutoModelForCausalLM,用 from_pretrained("Salesforce/codegen-2B-mono") 載入,generate 時設 max_length=128。

CodeGen2 的範例多了兩個東西。一是 from_pretrained 加上 trust_remote_code=True 與 revision="main",二是 tokenizer 也走同樣的 AutoTokenizer 路徑。trust_remote_code=True 的意思是允許從 Hub 下載並執行模型倉庫自帶的程式碼,這是安全邊界上的實質讓步,不是形式參數。如果你的執行環境不允許載入外部程式碼,CodeGen2 與 CodeGen2.5 的標準載入路徑就走不通,得改用手動實作模型類別的方式。

第三個差異在解碼。CodeGen1 與 CodeGen2 的範例都呼叫 tokenizer.decode(sample[0], truncate_before_pattern=[r"\n\n^#", "^'''", "\n\n\n"]),用一組正規表達式在生成結果碰到註解或空行時截斷。CodeGen2.5 的範例直接把這個參數拿掉,只寫 tokenizer.decode(sample[0])。這暗示 truncate_before_pattern 在不同版本間的支援狀態不一致,升級 transformers 時要留意這個參數是否還存在。

另外,三個範例都保留了 import torch,但範例本身沒有直接呼叫 torch 的 API。這不影響執行,只是提示這些程式碼是從更大的推論腳本裡節錄出來的。

訓練路徑在 jaxformer,不在這個倉庫

README 的 Training 段落只有一句話,指向 https://github.com/salesforce/jaxformer,說明那裡有資料前處理、訓練與微調 CodeGen 模型的 Jaxformer 函式庫。這代表這個倉庫不包含訓練程式碼,也沒有微調腳本。

對研究團隊來說,這個切分是合理的:模型權重與推論介面放在一處,訓練框架放在另一處,各自獨立演進。但對只想跑一次微調的人來說,這多了一層依賴,你得先確認 jaxformer 的環境需求,再確認它與你手上的模型版本是否對應。README 沒有說明 jaxformer 支援哪些 CodeGen 世代,這個對應關係需要自行到該倉庫確認。

訓練硬體方面,倉庫描述寫的是 Trained on TPU-v4,topics 裡也有 tpu-acceleration。這是原始訓練的硬體條件,不代表推論必須在 TPU 上跑。README 的推論範例走的是 PyTorch 與 transformers,與 JAX 無關。把訓練環境與推論環境混為一談,會高估部署門檻。

研究用途聲明與 Apache-2.0 之間的落差

倉庫的 License 標示為 Apache-2.0,這是寬鬆的開源授權。但 README 底部的 ethics disclaimer 寫著:This release is for research purposes only in support of an academic paper。同一份文件裡還提到模型與程式碼 not specifically designed or evaluated for all downstream purposes,並建議使用者在部署前評估準確性、安全性與公平性,高風險場景要特別謹慎。

兩段文字並置時會產生一個實務問題:Apache-2.0 授予的權利,是否被這句 research purposes only 限縮?這個問題不是本文能回答的,README 也沒有進一步說明兩者的關係。可以確定的是,免責聲明同時指向 Salesforce 的標準 AUP 與 AI AUP 兩份政策文件,這表示使用條件可能不只在倉庫內。

實務上的做法是:如果你要把 CodeGen 放進對外服務,先確認這兩份 AUP 的內容,再請法務判斷 Apache-2.0 與研究用途聲明如何並存。這不是可以靠讀 README 解決的問題。

維護成本方面,這個倉庫沒有檢索到任何 release,最後推送時間為 2026 年 6 月。模型權重託管在 Hugging Face Hub,因此實際可用性取決於 Hub 上的模型頁面是否仍存在,而不是取決於這個倉庫的更新頻率。升級成本主要落在 transformers 版本相容性上,尤其是前面提到的 truncate_before_pattern 與 trust_remote_code 行為。

什麼情況下該選別的方案

如果你的需求是低延遲的編輯器補全,而且團隊沒有自行微調的計畫,那麼直接呼叫商業 API 的程式碼模型會比自架 7B 或 16B 權重更省事。差別在於控制權:API 方案拿不到權重、不能改訓練目標、也不能把模型放進內網。CodeGen 的價值恰好落在相反的方向,它給你權重與論文,代價是你得自己處理推論基礎設施與授權判斷。

如果團隊的程式碼庫以非 Python 語言為主,要注意 README 範例中的 mono 版本對應的是單一語言語料,而倉庫描述只提到主要語言是 Python,並未說明 mono 具體涵蓋哪一種語言、multi 又涵蓋哪些。這個對應關係需要到 Hugging Face Hub 的個別模型頁面確認,不能從這份 README 推得。

還有一個容易被忽略的替代路徑:如果你的目標是研究訓練方法而不是使用模型,jaxformer 可能比這個倉庫更值得先讀。這個倉庫負責發布,jaxformer 負責流程。

編輯結論

CodeGen 適合三種讀者:要重現 ICLR 論文結果的研究者、需要可自行微調的程式碼生成基線的團隊,以及想研究 TPU 上訓練 LLM 流程的人。不適合直接把模型接進產品介面的團隊,因為 README 的 ethics disclaimer 明確寫著「This release is for research purposes only in support of an academic paper」,這句話與倉庫的 Apache-2.0 授權並存,實際部署前應先請法務確認兩者的關係。動手之前先驗證三件事:目標模型在 Hugging Face Hub 上的實際權重是否存在、tokenizer.decode 的 truncate_before_pattern 參數在你的 transformers 版本是否還被支援、以及載入 CodeGen2 或 CodeGen2.5 時 trust_remote_code=True 會執行遠端程式碼這件事你的環境能否接受。這三項任一不成立,整條推論路徑就不會照 README 的範例跑起來。

官方來源

  1. Issues
  2. License: Apache-2.0
  3. README
  4. salesforce/CodeGen on GitHub
社群筆記

社群筆記