🚀 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许可证。