Formatierung für die Anweisungsoptimierung
Modelle mit Anweisungsabstimmung (Instruction-Tuned, IT) werden mit einem bestimmten Formatierer trainiert, der alle Beispiele für die Anweisungsabstimmung sowohl während des Trainings als auch bei der Inferenz mit zusätzlichen Informationen annotiert. Der Formatierer hat zwei Zwecke:
- Rollen in einer Unterhaltung angeben, z. B. System, Nutzer oder Assistent.
- Die Abgrenzung von Gesprächsrunden, insbesondere in Unterhaltungen mit mehreren Gesprächsrunden.
Unten findest du die von Gemma verwendeten Steuertokens und ihre Anwendungsfälle. Hinweis: Die Kontroll-Token sind für unseren Tokenisierer reserviert und spezifisch für ihn.
- Token für eine Nutzerkurve:
user
- Token für eine Modellkurve:
model
- Token, das den Beginn eines Dialogschritts angibt:
<start_of_turn>
- Token, das das Ende eines Dialogschritts angibt:
<end_of_turn>
Hier ein Beispiel für einen Dialog:
<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>
Das Token "<end_of_turn>\n"
ist das Abbiegeverweiszeichen und das Prompt-Präfix ist "<start_of_turn>model\n"
. Wenn Sie dem Modell also eine Frage wie „Was ist Cramers Regel?“ stellen möchten, sollten Sie es stattdessen so füttern:
"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"
Wenn Sie die vortrainierten Gemma-Modelle mit Ihren eigenen Daten optimieren möchten, können Sie jedes dieser Schemas für Kontrolltokens verwenden, solange es für Ihre Anwendungsfälle für Training und Inferenz konsistent ist.
Systemanweisungen
Sowohl bei der überwachten Feinabstimmung (SFT) als auch beim bestärkenden Lernen durch menschliches Feedback (RLHF) wurden die Modelle nicht mit Systemanweisungen trainiert. Daher sind die einzigen relevanten Formatierungs-Tokens für Gemma <start_of_turn>
, <end_of_turn>
, user
und model
. Beispiel:
<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>
Formatierung für FIM-Aufgaben
Die Varianten CodeGemma 2B und 7B sind speziell für Aufgaben zur Code-Eingabe optimiert.
Insbesondere wurden sie mit vier Formatierungskontroll-Tokens trainiert, mit denen Sie Modellprompts für FIM-Programmieraufgaben (Fill-in-the-Middle) erstellen können.
Kontext | Token |
---|---|
FIM-Präfix | <|fim_prefix|> |
FIM-Suffix | <|fim_suffix|> |
FIM Mitte | <|fim_middle|> |
Dateitrennzeichen | <|file_separator|> |
Verwenden Sie die FIM-Tokens, um die Position des Cursors und den umgebenden Kontext zu definieren, damit CodeGemma Code einfügen kann. Verwenden Sie das Dateitrennzeichen-Token für Kontexte mit mehreren Dateien.
Beispiel: FIM-Prompt erstellen
In diesem Abschnitt wird das Beispiel aus der Keras CodeGemma-Schnellstartanleitung wiederverwendet, um zu zeigen, wie ein Prompt für FIM-Aufgaben erstellt wird.
Betrachten wir den folgenden Code:
import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
sys.exit(0) # Line 3
Das |
gibt die Position des Cursors an, an der der Code fertiggestellt werden muss. Beachten Sie, dass vor dem Cursor ein Leerzeichen steht und dass Zeilen 1 und 2 am Ende einen Wagenrücklauf haben.
Das Präfix lautet dann:
import
mit einem Leerzeichen am Ende.
Das Suffix lautet:
⏎
if __name__ == '__main__':⏎
sys.exit(0)
mit einer neuen Zeile am Anfang.
Die Aufforderung sollte so aufgebaut sein:
<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
sys.exit(0)<|fim_middle|>
Hinweis:
- Zwischen FIM-Tokens und Präfix und Suffix dürfen keine zusätzlichen Leerzeichen vorhanden sein.
- Das mittlere FIM-Token sollte am Ende stehen, damit das Modell die Lücken weiter ausfüllen kann.
- Das Präfix oder Suffix kann leer sein, je nachdem, wo sich der Cursor gerade in der Datei befindet oder wie viel Kontext Sie dem Modell zur Verfügung stellen möchten.
Modellausgabe
Die Modellantwort für das Beispiel oben wäre:
<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n sys.exit(0)<|fim_middle|>sys\n<|file_separator|>
Das Modell wiederholt den Eingabeprompt und gibt sys
als Codevervollständigung aus.
Wenn Sie die CodeGemma-Modelle für FIM-Aufgaben verwenden, streamen Sie Antworttokens und verwenden Sie die FIM- oder Dateitrennzeichen als Trennzeichen, um das Streaming zu beenden und die resultierende Codevervollständigung abzurufen.