Format de la gemma et instructions système

Mise en forme pour le réglage des instructions

Les modèles à réglage par instruction (IT) sont entraînés avec un formateur spécifique qui annoté tous les exemples de réglage par instruction avec des informations supplémentaires, à la fois au moment de l'entraînement et de l'inférence. Le formateur a deux fonctionnalités:

  1. Indique les rôles dans une conversation, tels que les rôles système, utilisateur ou assistant.
  2. Délimiter les tours de 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 tokenizer.

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

Voici un exemple 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 virage, et le préfixe de l'invite est "<start_of_turn>model\n". Cela signifie que si vous souhaitez demander au modèle une question comme "Qu'est-ce que la règle de Cramer ?", vous devez plutôt lui fournir les données suivantes:

"<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 avec vos propres données, vous pouvez utiliser n'importe quel schéma de ce type 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 le réglage supervisé (SFT) et l'apprentissage automatique par renforcement qui utilise le 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 formatage 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>

Mise en forme des tâches FIM

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

Plus précisément, ils sont entraînés sur quatre jetons de contrôle de mise en forme que vous pouvez utiliser pour créer des requêtes de modèle pour les tâches de codage de type "fill-in-the-middle" (FIM).

ContexteJeton
Préfixe FIM <|fim_prefix|>
Suffixe FIM <|fim_suffix|>
FIM au milieu <|fim_middle|>
Séparateur de fichiers <|file_separator|>

Utilisez les jetons FIM pour définir l'emplacement du curseur et le contexte environnant afin que CodeGemma puisse effectuer le remplissage du code. Utilisez le jeton de séparateur de fichiers pour les contextes multifichiers.

Exemple : Créer une requête FIM

Cette section réutilise l'exemple de la présentation rapide de Keras CodeGemma pour vous montrer comment créer une invite pour les 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 terminé. Notez qu'un espace se trouve avant le curseur et que les lignes 1 et 2 comportent des retours à la ligne à la fin.

Le préfixe est alors :

import

avec un espace à la fin.

Le suffixe est:


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

avec une nouvelle ligne au début.

La requête doit être construite comme suit:

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

Remarques :

  • Il ne doit pas y avoir d'espaces blancs supplémentaires entre les jetons FIM et le préfixe et le suffixe.
  • Le jeton du milieu FIM doit être placé à la fin pour préparer le modèle à continuer à remplir
  • Le préfixe ou le suffixe peut être vide en fonction de l'emplacement actuel 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 est 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 la requête d'entrée et fournit sys comme complétion de code.

Lorsque vous utilisez les modèles CodeGemma pour les tâches FIM, diffusez les jetons de réponse et utilisez les jetons FIM ou les séparateurs de fichiers comme séparateurs pour arrêter le streaming et obtenir la complétion de code obtenue.