秒杀自动编码Copilot!「动嘴编程」神器StarChat开源,码农狂喜( 二 )

Assistant: 
可以看到,提示的第一部分 「下面是一系列...... 」与系统信息相对应,并指定助手应该有「乐于助人」和「礼貌」等特征 。
然后,对话实例对模型进行了条件限制,使其遵循对话的多回合格式 。
当用户提出问题时,整个提示被输入到模型,并在Assistant: 后生成一个答案 。然后,答案被串联到提示中,并在每个回合中重复这一过程 。令人惊讶的是,这种技术也适用于StarCoder!
这是由模型的8k标记上下文长度促进的,它允许人们包括各种各样的编程实例,并将模型转换为编码助手 。下面是StarCoder提示的摘录:
 
Below are a series of dialogues between various people and an AI technical assistant.The assistant tries to be helpful, polite, honest, sophisticated, emotionally aware, and humble-but-knowledgeable.The assistant is happy to help with code questions, and will do its best to understand exactly what is needed.It also tries to avoid giving false or misleading information, and it caveats when it isn’t entirely sure about the right answer.That said, the assistant is practical and really does its best, and doesn’t let caution get too much in the way of being useful.
The Starcoder models are a series of 15.5B parameter models trained on 80+ programming languages from The Stack (v1.2) (excluding opt-out requests).The model uses Multi Query Attention, was trained using the Fill-in-the-Middle objective and with 8,192 tokens context window for a trillion tokens of heavily deduplicated data.
Human: Write a function that takes two lists and returns a list that has alternating elements from each input list.
Assistant: Sure. Here is a function that does that.
def alternating(list1, list2):results = []for i in range(len(list1)):results.append(list1[i])results.append(list2[i])return results
Human: Can you write some test cases for this function?
Assistant: Sure, here are some tests.
assert alternating([10, 20, 30], [1, 2, 3]) == [10, 1, 20, 2, 30, 3]assert alternating([True, False], [4, 5]) == [True, 4, False, 5]assert alternating([], []) == []
Human: Modify the function so that it returns all input elements when the lists have uneven length. The elements from the longer list should be at the end.
Assistant: Here is the modified function.
def alternating(list1, list2):results = []for i in range(min(len(list1), len(list2))):results.append(list1[i])results.append(list2[i])if len(list1) > len(list2):results.extend(list1[i+1:])else:results.extend(list2[i+1:])return results
  
由上,我们可以看到一个精心设计的提示,如何诱发与ChatGPT中观察到的类似的编码行为 。
你也可以在这个链接汇总找到完整的提示 。
https://huggingface.co/datasets/bigcode/ta-prompt/blob/main/TA_prompt_v1.txt
当然了,对话提示的一个主要缺点是,推理的成本很高:对话的每个回合都需要成千上万的token 。
一种替代方法是,在对话语料库上对基础模型进行微调,使其变得「健谈」 。
再来看看最近上传到Hub中的几个有趣的数据集,它们为今天大多数开源聊天机器人提供动力 。
Chat语言模型的数据集
开源社区正在迅速地创造多样化、且强大的数据集,用于将任何基础语言模型转化为能够遵循指令的对话智能体 。
就比如:
-OpenAssistant数据集,由超过4万个对话组成,是由社区成员轮流模仿用户或人工智能助手的角色 。
-ShareGPT数据集,其中包含人类用户和ChatGPT之间的大约9万个对话 。
而在这篇文章中,研究人员使用了OpenAssistant数据集来微调StarCoder 原始数据集的格式是对话树的集合,所以研究人员对其进行了预处理,使每一行都对应于用户和助手之间的单一对话 。
为了避免偏离StarCoder预训练的数据太远,研究者还过滤了英语对话 。先从Hub上下载经过处理的数据集:
from datasets import load_dataset
dataset = load_dataset("HuggingFaceH4/oasst1_en")print(dataset)DatasetDict({train: Dataset({features: ['messages'],num_rows: 19034test: Dataset({features: ['messages'],num_rows: 2115 
正如我们所见,该数据集包含约21,000个英语会话 。再来看看其中的一个训练例子 。以第一个例子为例:


推荐阅读