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:
- Indicare i ruoli in una conversazione, ad esempio i ruoli sistema, utente o assistente.
- 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.