数据集:
codeparrot/self-instruct-starcoder
自我教导星编码器是一个由人类编写的种子指令作为输入,通过提示星编码器生成新指令的数据集。其中的生成过程在论文中进行了解释。该算法诞生了著名的机器生成数据集,如 Alpaca 和 Code Alpaca ,这是通过提示OpenAI text-davinci-003引擎获得的两个数据集。
尽管我们的方法与自我教导和斯坦福alpaca相似,但我们对流程进行了一些相关修改以满足我们的需求。
数据集的生成非常耗时,我们选择参数以限制我们方法的计算负担。
星编码器虽然是一个很棒的模型,但它的能力不及text-davinci-003。在生成过程中,模型很快达到了一种创造力的上限。有很多指令彼此相似,但这不应该成为问题,因为它们的措辞不同。
后处理是流程中的重要部分,尽管它意味着要放弃一些示例,但它可以提高数据集的质量。首先,我们需要确定我们要避免的内容:
我们想象了一个我们称之为自一致性的过程。这个想法是反向提示模型,看它是否能够生成与所提示的解决方案(输出)相对应的正确指令。这是一个特别困难的few-shot任务,不幸的是,StarCoder在这方面的表现并不是非常出色。在4个few-shot参数的情况下(都是种子任务),模型能够恢复1135个指令,占原始数据集的22.6%。幸运的是,starcoder无法为某些解决方案生成指令并不意味着我们应该将其丢弃。对于具有生成指令的解决方案(输出),我们可以将其与真实结果进行比较。为此,我们可以使用 Sentence-BERT ,因为比较应该侧重于含义而不是逐字逐句的相似比率。我们有约771个指令(约68%),其与其真实结果的相似度得分>=0.5。这些可以被视为高质量的示例,它们形成了策划集。
另一种用于清理原始数据集的方法是专注于不同的指令。对于给定的指令,我们遍历它之前生成的所有指令,看是否有一个相似度得分>=0.5。如果是这样,我们将删除该指令。这个过程删除了大约94%的原始数据集,剩下的指令形成了独特集。
我们还决定构建一个仅包含使用Python 3编写的、没有编译错误的代码的示例集合。
from datasets import load_dataset dataset = load_dataset("codeparrot/self-instruct-starcoder") DatasetDict({ compile: Dataset({ features: ['instruction', 'output', 'most_similar', 'avg_similarity_score'], num_rows: 3549 }) curated: Dataset({ features: ['instruction', 'output', 'most_similar', 'avg_similarity_score'], num_rows: 771 }) raw: Dataset({ features: ['instruction', 'output', 'most_similar', 'avg_similarity_score'], num_rows: 5003 }) unique: Dataset({ features: ['instruction', 'output', 'most_similar', 'avg_similarity_score'], num_rows: 308 }) }))
Field | Type | Description |
---|---|---|
instruction | string | Instruction |
output | string | Answer to the instruction |
most_similar | string | Dictionnary containing the 10 most similar instructions generated before the current instruction along with the similarity scores |
avg_similarity_score | float64 | Average similarity score |
@misc{title={Self-Instruct-StarCoder}, author={Zebaze, Armel Randy}, doi={https://doi.org/10.57967/hf/0790}, }