Gemma 格式和系统说明

指令调优的格式设置

指令调优 (IT) 模型使用特定的格式化程序进行训练,格式化程序会在训练和推理时使用额外信息对所有指令调优样本进行注释。格式设置工具有两个用途:

  1. 指示对话中的角色,例如系统用户助理角色。
  2. 在对话中划出轮流,尤其是在多轮对话中。

下面,我们指定 Gemma 使用的控制令牌及其用例。请注意,控制令牌预留在标记生成器中,并且是专用的。

  • 用于指示用户轮到的令牌:user
  • 用于指示模型转弯的令牌:model
  • 用于表示对话回合开始时的令牌:<start_of_turn>
  • 用于表示对话结束的令牌:<end_of_turn>

下面是一个对话框示例:

<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
Gemma<end_of_turn>
<start_of_turn>model
Gemma who?<end_of_turn>

令牌 "<end_of_turn>\n" 是转弯分隔符,提示前缀为 "<start_of_turn>model\n"。这意味着,如果您想使用“克莱默规则是什么?”这样的问题提示模型,则应按以下方式馈送模型:

"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"

请注意,如果您要使用自己的数据对基本预训练 Gemma 模型进行微调,可以将任何此类架构用作控制令牌,只要在训练和推断用例之间保持一致即可。

系统指令

对于监督式微调 (SFT) 和基于人类反馈的强化学习 (RLHF),模型未使用系统指令进行训练。因此,Gemma 的相关格式令牌仅有 <start_of_turn><end_of_turn>usermodel。例如:

<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>

FIM 任务的格式设置

CodeGemma 2B 和 7B 变体经过专门调整,适用于代码填充任务。

具体而言,它们基于四种格式设置控制令牌进行训练,您可以使用这些令牌为填充中填充 (FIM) 编码任务构建模型提示。

上下文 词元
FIM 前缀 `<
FIM 后缀 `<
FIM 中间 `<
文件分隔符 `<

使用 FIM 令牌定义光标位置及其周围的上下文,以便 CodeGemma 执行代码填充。文件分隔符令牌可用于多文件上下文。

示例 - 构建 FIM 提示

本部分重复使用 Keras CodeGemma 快速入门中的示例,向您展示如何为 FIM 任务构建提示。

请参考以下代码:

import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
   sys.exit(0) # Line 3

| 指示游标位置,也就是需要完成代码的位置。请注意,光标前有一个空格,并且第 1 行和第 2 行的末尾带有回车符。

前缀是

import

以一个空格结尾

后缀为:

⏎
if __name__ == '__main__':⏎
   sys.exit(0)

并在开头插入一个新行

提示应构建为:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
   sys.exit(0)<|fim_middle|>

请注意:

  • 任何 FIM 令牌与前缀和后缀之间不应有多余的空格
  • FIM 中间令牌应位于末尾,以便为模型做好准备,以便继续填充
  • 前缀或后缀可能为空,具体取决于游标当前在文件中的位置,或者您要为模型提供的上下文数量

了解模型输出

上述示例的模型响应如下:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n    sys.exit(0)<|fim_middle|>sys\n<|file_separator|>

模型会重复输入提示,并提供 sys 作为代码补全。

使用 CodeGemma 模型处理 FIM 任务时,应流式传输响应令牌,并将 FIM 或文件分隔符令牌用作分隔符以停止流式传输并获取生成的代码补全。