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"。这意味着,如果你想向模型提示 “什么是 Cramer 法则?”这样的问题,您应该使用 如下所示:

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

请注意,如果您想使用自己训练的 Gemma 模型对基础预训练 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_prefix|>
FIM 后缀 <|fim_suffix|>
FIM 中间 <|fim_middle|>
文件分隔符 <|file_separator|>

使用 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 或文件分隔符作为分隔符来停止流式传输并获取 代码补全。