Format de la gemma et instructions système

Mettre en forme le réglage des instructions

Les modèles informatiques à réglage des instructions sont entraînés avec un outil de mise en forme spécifique qui annote tous les exemples de réglage d'instructions avec des informations supplémentaires, au moment de l'entraînement et de l'inférence. L'outil de mise en forme a deux objectifs:

  1. Indiquer des rôles dans une conversation, par exemple système, utilisateur ou assistant
  2. Délimiter le tour d'une conversation, en particulier dans une conversation multitours.

Vous trouverez ci-dessous les jetons de contrôle utilisés par Gemma et leurs cas d'utilisation. Notez que les jetons de contrôle sont réservés et spécifiques à notre service de tokenisation.

  • Jeton indiquant le tour de l'utilisateur: user
  • Jeton indiquant un virage du modèle: model
  • Jeton indiquant le début du tour de dialogue: <start_of_turn>
  • Jeton indiquant la fin du tour de dialogue: <end_of_turn>

Voici un exemple de boîte de dialogue:

<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>

Le jeton "<end_of_turn>\n" est le séparateur de tour et le préfixe d'invite est "<start_of_turn>model\n". Cela signifie que si vous souhaitez poser une question telle que "Qu'est-ce que la règle de Cramer ?", vous devez alimenter le modèle de la manière suivante:

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

Notez que si vous souhaitez affiner les modèles Gemma pré-entraînés de base avec vos propres données, vous pouvez utiliser n'importe quel schéma pour les jetons de contrôle, à condition qu'il soit cohérent entre vos cas d'utilisation d'entraînement et d'inférence.

Instructions système

Pour l'ajustement supervisé (SFT) et l'apprentissage par renforcement à partir du feedback humain (RLHF), les modèles n'ont pas été entraînés avec des instructions système. Par conséquent, les seuls jetons de mise en forme pertinents pour Gemma sont <start_of_turn>, <end_of_turn>, user et model. Exemple :

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

Formatage des tâches FIM

Les variantes 2B et 7B de CodeGemma sont spécialement conçues pour les tâches de remplissage de code.

Plus précisément, ils sont entraînés sur quatre jetons de contrôle de formatage que vous pouvez utiliser pour créer des invites de modèle pour les tâches de codage de remplissage FIM.

Contexte Jeton
Préfixe FIM `<
Suffixe FIM `<
FIM middle `<
Séparateur de fichier `<

Utilisez les jetons FIM pour définir l'emplacement du curseur et le contexte autour de celui-ci afin que CodeGemma effectue le remplissage du code. Utilisez le jeton de séparateur de fichiers pour les contextes multifichiers.

Exemple - Créer une invite FIM

Cette section réutilise l'exemple du guide de démarrage rapide de Keras CodeGemma pour vous montrer comment créer une requête pour des tâches FIM.

Prenons l'exemple de code suivant :

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

| indique l'emplacement du curseur, c'est-à-dire l'endroit où le code doit être finalisé. Notez qu'il y a un espace avant le curseur, et que les lignes 1 et 2 ont des retours chariot à la fin.

Le préfixe est alors,

import

avec un espace à la fin.

Le suffixe est le suivant:

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

avec une nouvelle ligne au début.

La requête doit se présenter comme suit:

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

Remarques :

  • Il ne doit pas y avoir d'espace blanc supplémentaire entre les jetons FIM et le préfixe et le suffixe.
  • Le jeton central FIM doit se trouver à la fin pour amorcer le modèle et poursuivre le remplissage
  • Le préfixe ou le suffixe peut être vide en fonction de la position actuelle du curseur dans le fichier, ou de la quantité de contexte que vous souhaitez fournir au modèle.

Comprendre la sortie du modèle

La réponse du modèle pour l'exemple ci-dessus serait la suivante:

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

Le modèle répète l'invite d'entrée et fournit sys comme complétion de code.

Lorsque vous utilisez les modèles CodeGemma pour les tâches FIM, diffusez des jetons de réponse et utilisez les jetons de séparateur FIM ou de séparateur de fichier comme délimiteurs pour arrêter la diffusion et obtenir l'achèvement de code qui en résulte.