Formatowanie Gemma i instrukcje dotyczące systemu

Formatowanie na potrzeby dostrajania instrukcji

Modele dostrojone przez instrukcję są trenowane z użyciem określonego formatu, który dodaje do wszystkich przykładów dostrajania instrukcji dodatkowe informacje – zarówno w czasie trenowania, jak i wywnioskowania. Narzędzie formatujące ma 2 funkcje:

  1. Wskazanie ról w rozmowie, np. ról systemu, użytkownika lub asystenta.
  2. Zaznaczanie skrętów w rozmowie, zwłaszcza w rozmowie wieloetapowej.

Poniżej przedstawiamy tokeny kontrolne używane przez Gemma i ich przypadki użycia. Tokeny kontrolne są zarezerwowane dla naszego tokenizatora i są dla niego zarezerwowane.

  • Token do wskazywania skrętu użytkownika: user
  • Token wskazujący skręt modelu: model
  • Token wskazujący początek skrętu dialogu: <start_of_turn>
  • Token wskazujący koniec skrętu dialogu: <end_of_turn>

Oto przykładowe okno dialogowe:

<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" jest separatorem skrętu, a prefiks promptu to "<start_of_turn>model\n". Oznacza to, że jeśli chcesz zadać modelowi pytanie, np. „Jaka jest reguła Cramera?”, musisz przesłać model w ten 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ć podstawowe, wytrenowane wcześniej modele Gemma przy użyciu własnych danych, możesz użyć dowolnego takiego schematu na potrzeby tokenów kontrolnych, o ile jest on spójny między przypadkami użycia trenowania i wnioskowania.

Instrukcje systemowe

Zarówno w przypadku nadzorowanego dostrajania (SFT), jak i uczenia się przez wzmacnianie na podstawie informacji zwrotnych od człowieka (RLHF) modele nie zostały wytrenowane z wykorzystaniem instrukcji systemowych. Z tego powodu jedynymi odpowiednimi tokenami formatowania dla Gemma są <start_of_turn>, <end_of_turn>, user i model. 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 7 mld są specjalnie dostrojone pod kątem zadań uzupełniania kodu.

W szczególności są one trenowane na 4 tokenach sterujących formatowania, których możesz używać do tworzenia promptów modelu na potrzeby zadań kodowania wypełniania pośrodku (FIM).

Kontekst Token
Prefiks FIM `<
Sufiks FIM `<
Środek FIM `<
Separator plików `<

Użyj tokenów FIM do określenia lokalizacji kursora i otaczającego go kontekstu, aby CodeGemma mogła wypełniać kod. W kontekstach z wieloma plikami używaj tokena separatora plików.

Przykład – utwórz prompt FIM

W tej sekcji ponownie wykorzystano przykład z krótkiego wprowadzenia do Keras CodeGemma pokazujący, jak utworzyć prompt dla zadań FIM.

Weź pod uwagę ten kod:

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

| wskazuje lokalizację kursora, w której należy uzupełnić kod. Zwróć uwagę, że przed kursorem znajduje się spacja, a wiersze 1 i 2 mają zwrot karetki na końcu.

Prefiks to

import

z jedną spacją na końcu.

Sufiks to:

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

nowym wierszem na początku.

Prompt powinien wyglądać tak:

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

Uwaga:

  • Pomiędzy tokenami FIM a prefiksem i sufiksem nie może być żadnych dodatkowych spacji.
  • Pośredni token FIM powinien znajdować się na końcu, aby model mógł dalej wypełniać pola
  • Prefiks lub sufiks mogą być puste w zależności od tego, w którym miejscu w pliku znajduje się aktualnie kursor, oraz od kontekstu, jaki chcesz przekazać modelowi

Interpretowanie danych wyjściowych modelu

Odpowiedź modelu dla powyższego przykładu będzie wyglądać tak:

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

Model powtarza prompt, a jako uzupełnienie kodu podaje sys.

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 separatorów, aby zatrzymać transmisję i uzyskać wynik uzupełnienia kodu.