Formattazione per l'ottimizzazione delle istruzioni
I modelli ottimizzati per le istruzioni (IT) vengono addestrati con un formattatore specifico che annota tutti gli esempi di ottimizzazione delle istruzioni con informazioni aggiuntive, sia durante l'addestramento sia durante l'inferenza. Il formattatore ha due scopi:
- Indicare i ruoli in una conversazione, ad esempio sistema, utente o assistente.
- Delineare i turni in una conversazione, in particolare in una conversazione con più turni.
Di seguito sono specificati i token di controllo utilizzati da Gemma e i relativi casi d'uso. Tieni conto che i token di controllo sono riservati e specifici per il nostro tokenizzatore.
- Token per indicare una svolta dell'utente:
user
- Token per indicare un turno del modello:
model
- Token per indicare l'inizio del turno di dialogo:
<start_of_turn>
- Token per indicare la fine del turno di 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 chiedere al modello
una domanda come "Che cos'è il teorema di Cramer?", devi invece fornire al
modello quanto 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 con i tuoi dati, puoi utilizzare uno di questi schemi per i token di controllo, a condizione che sia coerente tra i casi d'uso di addestramento e di inferenza.
Istruzioni di sistema
Sia per l'ottimizzazione fine supervisionata (SFT) sia per l'apprendimento per rinforzo con feedback umano (RLHF), i modelli non sono stati addestrati con le 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 per le attività FIM
Le varianti 2B e 7B di CodeGemma sono ottimizzate appositamente per le attività di completamento del codice.
Nello specifico, vengono addestrati su quattro token di controllo della formattazione che puoi utilizzare per creare prompt del modello per le attività di programmazione di tipo FIM (fill-in-the-middle).
Contesto | Token |
---|---|
Prefisso FIM | <|fim_prefix|> |
Suffisso FIM | <|fim_suffix|> |
FIM medio | <|fim_middle|> |
Separatore di file | <|file_separator|> |
Utilizza i token FIM per definire la posizione del cursore e il contesto circostante in modo che CodeGemma possa eseguire il completamento del codice. Utilizza il token separatore file per i contesti con più file.
Esempio: crea un prompt FIM
Questa sezione riutilizza l'esempio nella guida introduttiva 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, ovvero dove deve essere completato il codice. Tieni presente che c'è uno spazio prima del cursore e che le righe 1 e 2 hanno dei 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 costruito 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 a continuare a compilare
- Il prefisso o il suffisso può essere vuoto a seconda della posizione corrente del cursore nel file o della quantità di contesto che vuoi fornire al modello.
Informazioni sull'output del modello
La risposta del modello per l'esempio riportato sopra è:
<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n sys.exit(0)<|fim_middle|>sys\n<|file_separator|>
Il modello ripete il prompt di input e fornisce sys
come completamento del codice.
Quando utilizzi i modelli CodeGemma per le attività FIM, riproduci in streaming i token di risposta e utilizza i token FIM o di separazione dei file come delimitatori per interrompere lo streaming e ottenere il completamento del codice risultante.