指令调优的格式
指令微调 (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"
。这意味着,如果你想向模型提示
“什么是 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>
、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 或文件分隔符作为分隔符来停止流式传输并获取 代码补全。