Formatowanie Gemma i instrukcje dotyczące systemu

Formatowanie na potrzeby dostrajania instrukcji

Modele dostosowywane do instrukcji (IT) są trenowane za pomocą specjalnego formatera, który do wszystkich przykładów dostrajania instrukcji dołącza dodatkowe informacje, zarówno w czasie treningu, jak i wykonywania wnioskowania. Formatowanie służy do 2 celów:

  1. Wskazywanie ról w rozmowie, takich jak system, użytkownik czy asystent.
  2. oddzielanie od siebie poszczególnych wypowiedzi w rozmowie, zwłaszcza w rozmowie wieloetapowej;

Poniżej przedstawiamy tokeny kontrolne używane przez Gemma oraz ich przypadki użycia. Pamiętaj, że tokeny kontrolne są zarezerwowane w tokenizerze i są specyficzne dla niego.

  • Token wskazujący kolejność użytkownika: user
  • Token wskazujący kolejność modelu: model
  • Token wskazujący początek okna dialogowego: <start_of_turn>
  • Token wskazujący koniec tury dialogu: <end_of_turn>

Oto przykład dialogu:

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

Token "<end_of_turn>\n" to separator zdań, a prefiks prompta to "<start_of_turn>model\n". Oznacza to, że jeśli chcesz zadać modelowi pytanie, np. „Co to jest reguła Cramera?”, podaj mu dane w taki sposób:

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

Pamiętaj, że jeśli chcesz dostosować wstępnie wytrenowane modele Gemma do własnych danych, możesz użyć dowolnego schematu dla tokenów kontrolnych, o ile jest on spójny w przypadku przypadków użycia treningu i wykorzystywania wnioskowania.

Instrukcje systemowe

W przypadku dostrajania nadzorowanego (SFT) i uczenia się przez wzmacnianie na podstawie opinii użytkowników (RLHF) modele nie były trenowane przy użyciu instrukcji systemowych. W rezultacie jedynymi odpowiednimi tokenami formatowania dla Gemma są <start_of_turn>, <end_of_turn>, usermodel. Na przykład:

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

Formatowanie zadań FIM

Wersje CodeGemma 2B i 7B są specjalnie dostosowane do zadań polegających na wypełnianiu kodu.

W szczególności są one trenowane na podstawie 4 tokenów sterujących formatowaniem, które możesz wykorzystać do tworzenia promptów modelu na potrzeby zadań polegających na uzupełnianiu kodu.

KontekstToken
Prefiks FIM <|fim_prefix|>
Sufiks FIM <|fim_suffix|>
FIM środkowy <|fim_middle|>
Separator pliku <|file_separator|>

Użyj tokenów FIM, aby określić położenie kursora i otaczający go kontekst, aby CodeGemma mogła wypełnić kod. Użyj tokena separatora plików w kontekście wielu plików.

Przykład: tworzenie promptu FIM

W tej sekcji używamy przykładu z Keras CodeGemma quickstart, aby pokazać, jak tworzyć prompty do zadań FIM.

Rozważ ten kod:

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

| wskazuje kursor, w którym miejscu należy wpisać kod. Zwróć uwagę, że przed kursorem jest spacja, a wiersze 1 i 2 mają na końcu powrotu karetki.

Prefiks jest wtedy,

import

z jedną spacją na końcu.

Sufiks:


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

z nową linią na początku.

Prośba powinna być sformułowana w ten sposób:

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

Uwaga:

  • Nie może być dodatkowych spacji między tokenami FIM a preiksem i sufiksem.
  • Token środkowy FIM powinien znajdować się na końcu, aby model mógł kontynuować wypełnianie
  • W zależności od tego, gdzie kursor znajduje się w pliku, lub od tego, ile kontekstu chcesz przekazać modelowi, prefiks lub sufiks może być pusty.

Interpretowanie danych wyjściowych modelu

Odpowiedź modelu w przypadku tego przykładu:

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

Model powtarza prompt i podaje sys jako uzupełnienie kodu.

Jeśli używasz modeli CodeGemma do zadań FIM, przesyłaj tokeny odpowiedzi strumieniowo i używaj tokenów FIM lub separatorów plików jako ograniczników, aby zatrzymać przesyłanie strumieniowe i uzyskać wynikową funkcję uzupełniania kodu.