🚀 CodeGen2 (CodeGen2-1B)
CodeGen2是用於程序合成的自迴歸語言模型家族,旨在根據英文提示生成可執行代碼,還能補全部分生成的代碼。
🚀 快速開始
本模型可以使用AutoModelForCausalLM
功能輕鬆加載。
✨ 主要特性
- 與最初的CodeGen模型家族(即CodeGen1)不同,CodeGen2能夠進行填充,並支持更多編程語言。
- 發佈了四種模型大小:
1B
、3.7B
、7B
、16B
。
💻 使用示例
基礎用法
對於常規的因果採樣,只需根據上下文生成補全內容:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen2-1B")
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-1B", trust_remote_code=True, revision="main")
text = "def hello_world():"
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=128)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
高級用法
對於填充採樣,我們引入了三種新的特殊標記類型:
<mask_N>
:第N個要被掩碼的跨度。實際上,使用 <mask_1>
來指定要進行填充採樣的位置。
<sep>
:後綴和填充樣本之間的分隔標記。
<eom>
:“掩碼結束”標記,模型在填充結束時會輸出此標記。您可以使用此標記來截斷輸出。
例如,如果我們想為以下函數的光標位置生成填充內容:
def hello_world():
|
return name
我們可以通過以下步驟構建模型的輸入:
- 在光標位置插入
<mask_1>
標記。
- 追加
<sep>
標記以指示邊界。
- 插入另一個
<mask_1>
以指示我們要填充的掩碼。
最終的代碼片段如下:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen2-1B")
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-1B", trust_remote_code=True, revision="main")
def format(prefix, suffix):
return prefix + "<mask_1>" + suffix + "<|endoftext|>" + "<sep>" + "<mask_1>"
prefix = "def hello_world():\n "
suffix = " return name"
text = format(prefix, suffix)
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=128)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=False)[len(text):])
您可能需要使用 <eom>
來截斷模型的輸出。
📚 詳細文檔
模型描述
CodeGen2 是用於程序合成的自迴歸語言模型家族,在以下論文中被提出:
CodeGen2: Lessons for Training LLMs on Programming and Natural Languages ,作者為 Erik Nijkamp*、Hiroaki Hayashi*、Caiming Xiong、Silvio Savarese、Yingbo Zhou。
訓練數據
此檢查點是在 Stack數據集的去重版本(v1.1) 的更嚴格許可子集上進行訓練的。支持的語言(和框架)如下:
c
、c++
、c-sharp
、dart
、go
、java
、javascript
、kotlin
、lua
、php
、python
、ruby
、rust
、scala
、shell
、sql
、swift
、typescript
、vue
。
訓練過程
CodeGen2使用交叉熵損失進行訓練,以最大化順序輸入的似然性。
輸入序列以兩種方式進行格式化:(1)因果語言建模和(2)文件級跨度損壞。
更多詳細信息請參考論文。
評估結果
我們在HumanEval和HumanEval-Infill上對模型進行了評估。更多詳細信息請參考 論文。
預期用途和侷限性
作為自迴歸語言模型,CodeGen2能夠從給定的自然語言和編程語言文本中提取特徵,並計算它們的似然性。
然而,該模型旨在並最擅長程序合成,即在給定英文提示的情況下生成可執行代碼,提示應採用註釋字符串的形式。該模型也可以補全部分生成的代碼。
倫理考量
本次發佈僅用於支持學術論文的研究目的。我們的模型、數據集和代碼並非專門為所有下游用途而設計或評估。我們強烈建議用戶在部署此模型之前評估並解決與準確性、安全性和公平性相關的潛在問題。我們鼓勵用戶考慮人工智能的常見侷限性,遵守適用法律,並在選擇用例時採用最佳實踐,特別是在錯誤或濫用可能會對人們的生活、權利或安全產生重大影響的高風險場景中。有關用例的更多指導,請參考我們的AUP和AI AUP。
BibTeX引用和引用信息
@article{Nijkamp2023codegen2,
title={CodeGen2: Lessons for Training LLMs on Programming and Natural Languages},
author={Nijkamp, Erik and Hayashi, Hiroaki and Xiong, Caiming and Savarese, Silvio and Zhou, Yingbo},
journal={arXiv preprint},
year={2023}
}
📄 許可證
本項目採用Apache-2.0許可證。