指令调优的格式设置
指令调优 (IT) 模型是使用特定的格式化程序进行训练的,该格式化程序会在训练和推理时为所有指令调优示例添加额外信息注解。该格式化程序有两个用途:
- 指明对话中的角色,例如系统、用户或助理角色。
- 区分对话中的对话回合,尤其是在多轮对话中。
下面,我们指定了 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>
、user
和 model
。例如:
<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 或文件分隔符令牌作为分隔符来停止流式传输并获取生成的代码补全。