ჩატის მოდელები გაწვრთნილია ძალიან განსხვავებული ფორმატებით, რომლებიც საუბრებს აქცევს ერთ ტოკენიზებად სტრიქონად. მოდელის გაწვრთნისას გამოყენებული ფორმატისგან განსხვავებული ფორმატის გამოყენება, როგორც წესი, იწვევს მუშაობის სერიოზულ, ჩუმ გაუარესებას, ამიტომ გაწვრთნის დროს გამოყენებული ფორმატის შეხამება უაღრესად მნიშვნელოვანია! Hugging Face-ის ტოკენიზატორებს ახლა აქვთ `chat_template` ატრიბუტი, რომელიც შეიძლება გამოყენებულ იქნას იმ ჩატის ფორმატის შესანახად, რომლითაც მოდელი გაწვრთნეს. ეს ატრიბუტი შეიცავს Jinja-ს შაბლონს, რომელიც საუბრების ისტორიებს სწორად ფორმატირებულ სტრიქონად აქცევს. გთხოვთ, იხილოთ ტექნიკური დოკუმენტაცია იმის შესახებ, თუ როგორ უნდა დაწეროთ და გამოიყენოთ ჩატის შაბლონები თქვენს კოდში. თუ თქვენ იცნობთ 🤗 Transformers ბიბლიოთეკას, ალბათ დაგიწერიათ მსგავსი კოდი: ტოკენიზატორისა და მოდელის ერთი და იგივე საკონტროლო წერტილიდან ჩატვირთვით, თქვენ უზრუნველყოფთ, რომ შემავალი მონაცემები ტოკენიზდება ისე, როგორც მოდელი ელოდება. თუ თქვენ სხვა მოდელიდან აირჩევთ ტოკენიზატორს, შემავალი მონაცემების ტოკენიზაცია შეიძლება სრულიად განსხვავებული იყოს და შედეგად, თქვენი მოდელის მუშაობა სერიოზულად დაზარალდება. ამის ტერმინია „განაწილების ცვლილება“ (distribution shift) – მოდელი სწავლობდა მონაცემებს ერთი განაწილებიდან (ტოკენიზაცია, რომლითაც ის გაწვრთნეს) და მოულოდნელად გადაერთო სრულიად განსხვავებულზე. მიუხედავად იმისა, არეგულირებთ მოდელს თუ უშუალოდ იყენებთ ინფერენციისთვის, ყოველთვის კარგი იდეაა, რომ მინიმუმამდე დაიყვანოთ განაწილების ცვლილებები და მიწოდებული ინფორმაცია მაქსიმალურად მსგავსი იყოს იმ მონაცემების, რომლითაც მოდელი გაწვრთნეს. ჩვეულებრივი ენის მოდელების შემთხვევაში, ამის გაკეთება შედარებით ადვილია – უბრალოდ ჩატვირთეთ თქვენი ტოკენიზატორი და მოდელი ერთი და იგივე საკონტროლო წერტილიდან და მზად ხართ. ჩატის მოდელების შემთხვევაში კი სიტუაცია ოდნავ განსხვავებულია. ეს იმიტომ, რომ „ჩატი“ არ არის მხოლოდ ტექსტის ერთი სტრიქონი, რომელიც შეიძლება პირდაპირ იყოს ტოკენიზებული – ეს არის შეტყობინებების თანმიმდევრობა, რომელთაგან თითოეული შეიცავს როლს და შინაარსს, რაც შეტყობინების რეალური ტექსტია. ყველაზე ხშირად, როლებია „მომხმარებელი“ მომხმარებლის მიერ გაგზავნილი შეტყობინებებისთვის, „ასისტენტი“ მოდელის მიერ დაწერილი პასუხებისთვის და, სურვილის შემთხვევაში, „სისტემა“ მაღალი დონის მითითებებისთვის, რომლებიც საუბრის დასაწყისშია მოცემული. თუ ეს ყველაფერი ოდნავ აბსტრაქტულად მოგეჩვენებათ, აქ მოცემულია ჩატის მაგალითი, რათა ის უფრო კონკრეტული გახდეს: შეტყობინებების ეს თანმიმდევრობა უნდა გადაკეთდეს ტექსტურ სტრიქონად, სანამ ის ტოკენიზდება და გამოყენებული იქნება მოდელისთვის შემავალ მონაცემად. პრობლემა კი ის არის, რომ ამ კონვერტაციის მრავალი გზა არსებობს! მაგალითად, შეგიძლიათ შეტყობინებების სია გადაიყვანოთ „მყისიერი შეტყობინებების“ ფორმატში: ან შეგიძლიათ დაამატოთ სპეციალური ტოკენები როლების აღსანიშნავად: ან შეგიძლიათ დაამატოთ ტოკენები შეტყობინებებს შორის საზღვრების აღსანიშნავად, მაგრამ როლის ინფორმაცია სტრიქონად ჩასვათ: ამის გაკეთების მრავალი გზა არსებობს და არცერთი მათგანი აშკარად საუკეთესო ან სწორი გზა არ არის. შედეგად, სხვადასხვა მოდელი გაწვრთნილია საოცრად განსხვავებული ფორმატირებით. ეს მაგალითები მე არ მომიგონია; ისინი ყველა რეალურია და გამოიყენება მინიმუმ ერთი აქტიური მოდელის მიერ! მაგრამ მას შემდეგ, რაც მოდელი გაწვრთნილი იქნება გარკვეული ფორმატით, თქვენ ნამდვილად გსურთ დარწმუნდეთ, რომ მომავალი შემავალი მონაცემებიც იმავე ფორმატს იყენებს, წინააღმდეგ შემთხვევაში, შეიძლება მიიღოთ ეფექტურობის დამანგრეველი განაწილების ცვლილება. ამჟამად, თუ გაგიმართლათ, საჭირო ფორმატი სწორად არის დოკუმენტირებული სადმე მოდელის ბარათში. თუ არ გაგიმართლათ, ასე არ არის, ამიტომ წარმატებებს გისურვებთ, თუ გსურთ ამ მოდელის გამოყენება. ექსტრემალურ შემთხვევებში, ჩვენ მთელი პრომპტის ფორმატი ბლოგპოსტშიც კი განვათავსეთ, რათა მომხმარებლებს არ გამოეტოვებინათ! თუმცა, საუკეთესო შემთხვევაშიც კი, თქვენ უნდა მოძებნოთ შაბლონის ინფორმაცია და ხელით დაამატოთ ის თქვენს დახვეწის (fine-tuning) ან ინფერენციის პაიპლაინში. ჩვენ მიგვაჩნია, რომ ეს განსაკუთრებით საშიში პრობლემაა, რადგან არასწორი ჩატის ფორმატის გამოყენება არის „ჩუმი შეცდომა“ – თქვენ არ მიიღებთ ხმაურიან წარუმატებლობას ან Python-ის გამონაკლისს, რომელიც გეტყვით, რომ რაღაც არასწორია. მოდელი უბრალოდ ბევრად უარესად იმუშავებს, ვიდრე სწორი ფორმატით იმუშავებდა და მიზეზის გამართვა ძალიან რთული იქნება! ეს არის პრობლემა, რომლის გადაჭრასაც ჩატის შაბლონები ისახავს მიზნად. ჩატის შაბლონები არის Jinja-ს შაბლონური სტრიქონები, რომლებიც ინახება და იტვირთება თქვენს ტოკენიზატორთან ერთად, და რომელიც შეიცავს ყველა საჭირო ინფორმაციას ჩატის შეტყობინებების სიის თქვენი მოდელისთვის სწორად ფორმატირებულ შემავალ მონაცემად გადაქცევისთვის. აქ მოცემულია სამი ჩატის შაბლონური სტრიქონი, რომლებიც შეესაბამება ზემოთ მოცემულ სამ შეტყობინების ფორმატს: თუ არ იცნობთ Jinja-ს, კატეგორიულად გირჩევთ, რომ ერთი წუთით დაათვალიეროთ ეს შაბლონური სტრიქონები და მათი შესაბამისი შაბლონური გამომავალი მონაცემები, და ნახოთ, შეგიძლიათ თუ არა დაარწმუნოთ საკუთარი თავი, რომ გესმით, როგორ აქცევს შაბლონი შეტყობინებების სიას ფორმატირებულ სტრიქონად! სინტაქსი მრავალი თვალსაზრისით ძალიან ჰგავს Python-ს. მიუხედავად იმისა, რომ Jinja თავიდან შეიძლება დამაბნეველი იყოს, თუ არ იცნობთ მას, პრაქტიკაში ვხვდებით, რომ Python-ის პროგრამისტებს შეუძლიათ სწრაფად აითვისონ იგი. ამ ფუნქციის შემუშავებისას, ჩვენ განვიხილეთ სხვა მიდგომები, როგორიცაა შეზღუდული სისტემა, რომელიც მომხმარებლებს საშუალებას მისცემს მიუთითონ შეტყობინებებისთვის როლზე დაფუძნებული პრეფიქსები და სუფიქსები. ჩვენ აღმოვაჩინეთ, რომ ეს შეიძლება გამხდარიყო დამაბნეველი და მოუხერხებელი, და იმდენად მოუქნელი იყო, რომ რამდენიმე მოდელისთვის საჭირო იყო "ჰაკერული" გადაწყვეტილებები. შაბლონები...