🚀 CodeGen2.5-7B-instruct
CodeGen2.5-7B-instruct 是一个用于程序合成的自回归语言模型家族。它基于较小的模型规模,在代码生成任务上取得了具有竞争力的结果,能够根据英文提示生成可执行代码,还能完成部分生成的代码。
🚀 快速开始
前提条件
请安装 OpenAI 的 tiktoken
用于分词器。
pip install tiktoken==0.4.0
因果采样(代码自动补全)
对于常规的因果采样,只需根据上下文生成补全内容:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen25-7b-instruct", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-instruct")
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))
填充采样
对于填充采样,我们遵循 CodeGen2 的格式:
<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/codegen25-7b-instruct", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-instruct")
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 构建,在 StarCoderData 上进行了 1.4T 标记的训练,与 StarCoderBase-15.5B 相比,在不到其一半大小的情况下取得了有竞争力的结果。
- 多种功能:和 CodeGen2 一样,该模型能够进行填充操作,并支持多种编程语言。
- 多模型版本:
- CodeGen2.5-7B-multi:在 StarCoderData 上训练,遵循 Apache-2.0 许可证。
- CodeGen2.5-7B-mono:在额外的 Python 标记上进一步训练,遵循 Apache-2.0 许可证。
- CodeGen2.5-7B-instruct(本仓库):在 CodeGen2.5-7B-mono 的基础上,在指令数据上进一步训练,仅用于研究目的。
📚 详细文档
模型描述
CodeGen2.5 是一个用于程序合成的自回归语言模型家族。该模型基于 CodeGen2 构建,在 StarCoderData 上进行了 1.4T 标记的训练,与 StarCoderBase-15.5B 相比,在不到其一半大小的情况下取得了有竞争力的结果。和 CodeGen2 一样,该模型能够进行填充操作,并支持多种编程语言。之后,我们在 Python 上进一步训练,然后在指令数据上训练。我们发布了以下所有模型:
- CodeGen2.5-7B-multi:在 StarCoderData 上训练,遵循 Apache-2.0 许可证。
- CodeGen2.5-7B-mono:在额外的 Python 标记上进一步训练,遵循 Apache-2.0 许可证。
- CodeGen2.5-7B-instruct(本仓库):在 CodeGen2.5-7B-mono 的基础上,在指令数据上进一步训练,仅用于研究目的。
评估结果
我们在 HumanEval 和 HumanEval-Infill 上对模型进行了评估。更多详细信息请参考 博客。
预期用途和局限性
作为一个自回归语言模型,CodeGen2.5 能够从给定的自然语言和编程语言文本中提取特征,并计算它们的可能性。然而,该模型旨在并最擅长程序合成,即根据英文提示生成可执行代码,提示应采用注释字符串的形式。该模型也可以完成部分生成的代码。
归属和其他要求
该模型的预训练数据集仅过滤了允许使用的许可证。尽管如此,该模型可以从数据集中逐字生成源代码。代码的许可证可能要求归属和/或其他特定要求,必须予以遵守。数据提供者 BigCode 提供了一个 搜索索引,您可以通过该索引搜索预训练数据,以确定生成的代码来自何处,并对您的代码进行适当的归属。
伦理考虑
此版本仅用于支持学术论文的研究目的。我们的模型、数据集和代码并非专门为所有下游用途设计或评估。我们强烈建议用户在部署此模型之前评估并解决与准确性、安全性和公平性相关的潜在问题。我们鼓励用户考虑人工智能的常见局限性,遵守适用法律,并在选择用例时采用最佳实践,特别是在错误或滥用可能对人们的生活、权利或安全产生重大影响的高风险场景中。有关用例的更多指导,请参考我们的 AUP 和 AI AUP。
📄 许可证
该模型的许可证为其他类型。
📚 引用信息
请引用 CodeGen2 论文:
@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}
}