Formattazione di Gemma e istruzioni di sistema

Formattazione per l'ottimizzazione delle istruzioni

I modelli ottimizzati per le istruzioni vengono addestrati con un formatter specifico che annota tutti gli esempi di ottimizzazione delle istruzioni con informazioni aggiuntive, sia durante il tempo di addestramento che in quello di inferenza. Il formattatore ha due scopi:

  1. Indicare i ruoli in una conversazione, ad esempio i ruoli sistema, utente o assistente.
  2. Definire i turni in una conversazione, specialmente nel caso di una conversazione a turni multipli.

Di seguito specifichiamo i token di controllo utilizzati da Gemma e i relativi casi d'uso. Tieni presente che i token di controllo sono riservati e specifici per il nostro tokenizzatore.

  • Token per indicare il turno di un utente: user
  • Token per indicare una svolta del modello: model
  • Token per indicare l'inizio della svolta della finestra di dialogo: <start_of_turn>
  • Token per indicare la svolta alla fine del dialogo: <end_of_turn>

Ecco un esempio di dialogo:

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

Il token "<end_of_turn>\n" è il separatore di svolta e il prefisso del prompt è "<start_of_turn>model\n". Ciò significa che se vuoi inviare al modello una domanda come "Qual è la regola di Cramer?", devi invece alimentare il modello come segue:

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

Tieni presente che se vuoi ottimizzare i modelli Gemma preaddestrati di base con i tuoi dati, puoi utilizzare qualsiasi schema di questo tipo per i token di controllo, purché sia coerente tra i casi d'uso di addestramento e inferenza.

Istruzioni di sistema

Sia per l'ottimizzazione supervisionata (SFT) che per l'apprendimento per rinforzo con feedback umano (RLHF), i modelli non sono stati addestrati con istruzioni di sistema. Di conseguenza, gli unici token di formattazione pertinenti per Gemma sono <start_of_turn>, <end_of_turn>, user e model. Ad esempio:

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

Formattazione delle attività FIM

Le varianti 2B e 7B di CodeGemma sono ottimizzate appositamente per le attività di riempimento del codice.

In particolare, sono addestrati su quattro token di controllo della formattazione che puoi usare per creare prompt di modelli per le attività di programmazione FIM (fill-in-the-middle).

Contesto Token
Prefisso FIM `<
Suffisso FIM `<
FIM intermedio `<
Separatore di file `<

Utilizza i token FIM per definire la posizione del cursore e il contesto circostante affinché CodeGemma possa eseguire il riempimento del codice. Utilizza il token del separatore di file per contesti con più file.

Esempio: costruire un prompt FIM

Questa sezione riutilizza l'esempio della guida rapida di Keras CodeGemma per mostrarti come creare un prompt per le attività FIM.

Considera il seguente codice:

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

| indica la posizione del cursore in cui deve essere completato il codice. Tieni presente che c'è uno spazio prima del cursore e che le righe 1 e 2 presentano ritorni a capo alla fine.

Il prefisso è quindi

import

con uno spazio alla fine.

Il suffisso è:

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

con una nuova riga all'inizio.

Il prompt deve essere creato come segue:

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

Ricorda:

  • Non devono esserci spazi bianchi aggiuntivi tra i token FIM e il prefisso e il suffisso
  • Il token FIM intermedio deve essere alla fine per preparare il modello affinché continui a compilarlo
  • Il prefisso o il suffisso potrebbero essere vuoti a seconda di dove si trova attualmente il cursore nel file o di quanto contesto vuoi fornire al modello

Informazioni sull'output del modello

La risposta del modello per l'esempio precedente sarebbe:

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

Il modello ripete la richiesta di input e fornisce sys come completamento del codice.

Quando utilizzi i modelli CodeGemma per le attività FIM, trasmetti i token di risposta in modalità flusso e utilizza i token FIM o del separatore di file come delimitatori per interrompere il flusso di dati e ottenere il completamento del codice risultante.