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:
- Wskazanie ról w rozmowie, np. ról systemu, użytkownika lub asystenta.
- 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.