Bir yapay zeka modeline bir cümle yazdığınızda, ekranın arka tarafında ne olduğunu hiç merak ettiniz mi? Yazdığınız o kelime, o virgül, o boşluk; modele nasıl ulaşıyor? Çünkü aslında ortada garip bir durum var: Bilgisayarlar metni anlayamaz. Onlar için harfler ve kelimeler yalnızca yapılandırılmamış (unstructured) bir veri yığınıdır. İşte tam bu noktada, adını sık sık duyduğumuz ama tam olarak ne yaptığını çoğu zaman atladığımız iki kavram devreye giriyor: token ve tokenizer.
Token, bir metnin dil modeli tarafından işlenebilir hale gelmesi için parçalandığı en küçük anlamlı birimdir. Bu birim bazen tam bir kelime olabiliyor, bazen bir kök, bazen sadece bir hece, bazen de tek bir harf ya da noktalama işareti. Yani token, sabit bir tanımı olan bir şey değil; kullanılan yönteme göre şekil değiştiren, esnek bir yapı.
Tokenizer ise bu parçalama işini yapan mekanizmanın adı. Bir metni alıp onu tokenlara böler ve her token'ı belirli bir sayıya eşler. Çünkü model aslında ne kelime görür ne cümle; model yalnızca sayılarla çalışır. Yazdığınız "Berk" kelimesinin "Berk" olduğunu anlamasının tek yolu, onu önce bir tokena, sonra bir sayıya indirgemektir.
Bir dil modeline bir cümle gönderdiğinizde ilk uğradığı durak tokenizer'dır. Tokenizer, o cümleyi kendi eğitildiği metoda göre parçalara ayırır. Bazı tokenizer'lar kelime bazlı çalışır, bazıları alt-kelime (subword) düzeyinde iş yapar, bazıları ise boşluk ve noktalama işaretlerini bile ayrı birer token olarak değerlendirir.
Burada kritik bir detay var: Model mimarisi ile tokenizer birbirine sıkı sıkıya bağlıdır. Bir dil modeli, hangi tokenizer'la eğitildiyse dünyayı o gözle görür. Yani bir modelin "kelime" dediği şeyle bir başkasının "kelime" dediği şey aynı olmayabilir. Bir model "anlamak" kelimesini tek parça olarak görürken, bir diğeri onu "anla" ve "mak" olarak iki ayrı parçaya bölebilir.
Parçalama işi bittikten sonra sıra sayılara dönüştürmeye gelir. Ve bu sayılar rastgele atanmış değildir. Burada devreye embedding dediğimiz kavram girer. Embedding, tokenlara karşılık gelen sayıları belirli vektörlere dönüştürüp, kelimeleri çok boyutlu bir uzayda konumlandırmaya yarar. Yani model, kelimeleri sadece "bir sayı" olarak değil; anlamsal olarak birbirine yakın ya da uzak noktalarda duran vektörler olarak görür. Ama şimdilik bu konuyu bir kenara not edip tokenizer'a geri dönelim.
Tokenizer'ın nasıl çalıştığı yalnızca modele göre değil, dile göre de ciddi biçimde değişiyor. Türkçe, bilindiği gibi sondan eklemeli bir dil. Eklerin yoğun olduğu, tek bir köke onlarca farklı ek gelebildiği bir yapıya sahip. Bu da tokenizer'ın işini zorlaştırıyor; çünkü aynı kelimenin onlarca varyasyonu ortaya çıkabiliyor.
İngilizce ise farklı bir tabloda. Kelimeler daha kısa, "to", "as", "is" gibi küçük ve sık kullanılan bağlaçlar var. Bu tür yapılar tokenizer'ın işini kolaylaştırıyor. Hatta bazı durumlarda bu küçük kelimeleri modelin performansına katkısı olacak şekilde optimize etmek mümkün oluyor. Sonuç: İngilizce metinlerde çoğunlukla daha az tokenla daha fazla iş yapılabiliyor. Türkçe metinlerde ise aynı anlam için daha fazla token harcanması gerekebiliyor.
Token meselesi ilk bakışta "bunu mühendisler düşünsün" diye geçiştirilebilecek teknik bir konu gibi görünüyor. Ama işin gerçeği şu: Yapay zeka ürünleriyle çalışan hemen herkesin gündemine er ya da geç giriyor. Çünkü token, modelin nasıl düşündüğünü, ne kadar hızlı çalıştığını, ne kadar maliyet ürettiğini ve hatta bazen ne kadar doğru cevap verdiğini doğrudan etkileyen bir birim.
Bir modelin bağlam penceresi (context window) tokenla ölçülür. API üzerinden aldığınız hizmetin fiyatı tokenla hesaplanır. Prompt'unuzun ne kadar "uzun" olduğu tokenla belirlenir. Yani token, yapay zeka ekonomisinin para birimi gibidir. Ve bu para birimi her dilde aynı değeri taşımaz.
Bunu somutlaştırmak için pratik bir yol var: Tiktokenizer adında, tarayıcı üzerinden çalışan bir uygulama. Buraya bir cümle yazıyorsunuz, kullanmak istediğiniz modeli seçiyorsunuz ve o cümlenin nasıl tokenlara bölündüğünü, her parçanın hangi sayıya eşlendiğini gözünüzle görebiliyorsunuz.
Aynı cümleyi Türkçe ve İngilizce yazıp karşılaştırdığınızda çarpıcı bir sonuçla karşılaşıyorsunuz: Aynı anlamı taşıyan iki cümle, iki dilde çok farklı sayıda tokena bölünebiliyor. Örneğin "anlamak istiyorum" gibi bir Türkçe ifade birkaç parçaya bölünürken, İngilizcedeki karşılığı çok daha az tokenla ifade edilebiliyor. Bu, hem maliyet açısından hem de modelin "algı alanı" açısından size somut bir fikir veriyor.
Eğer bir ürün yöneticisiyseniz, token maliyetleri sizin için doğrudan bir birim ekonomisi (unit economics) meselesidir. Türkçe pazara hitap eden bir yapay zeka ürününüz varsa, İngilizce bir üründen daha yüksek token tüketimiyle karşılaşabileceğinizi baştan hesaba katmalısınız.
Eğer bir UX tasarımcısıysanız, kullanıcının modelle kurduğu diyaloğun uzunluğunun, geçmişin ne kadar hatırlandığının ve yanıt sürelerinin token ekonomisine bağlı olduğunu bilmek işinize yarar. Bir sohbet arayüzü tasarlarken, kullanıcının farkında olmadığı bu sınırlar aslında deneyimin sınırlarıdır.
Eğer yapay zeka üzerine çalışan biriyseniz, model seçimini yaparken yalnızca modelin başarısına değil, tokenizer'ının hangi dilde nasıl davrandığına da bakmanız gerekir. Aynı model, farklı dillerde farklı ekonomiler üretir.
Eğer bir tasarımcı olarak ürüne katkı veriyorsanız, prompt uzunluğunu ve kullanıcının modele ne kadar bağlam verebileceğini planlarken tokenın görünmez bir kısıt olduğunu unutmayın.
Token, yapay zekanın dili değil; onu dili anlamaya ikna etmek için kullandığımız çeviridir. Ve bu çevirinin nasıl yapıldığını bilmek, üretmek istediğiniz deneyimin sınırlarını, maliyetini ve gücünü baştan tanımak demektir.
O da bir seçim sebebi olabilir. Evet. Bu yapılar aslında tokenlarına daha doğrusu şöyle diyeyim, elelemler eğitilirken belli bir tokenizer yöntemiyle eğitiliyor. Tokenizer da şu şimdi Bilgisayarlar bir metni anlayamaz değil mi? Sonuç olarak bu unstructured bir data yani. Buraya ben bir kerime yazıyorum. Birik yazıyorum. Bu birik'in birik olduğunu nasıl anlayacak? Bunu bir sayıya, bir sıfıra kadar indirgememiz lazım. Bunu indirgemek için en başta Tokenizer kullanılıyor. Tokenizer'da kullanılan model mimarisine göre çok değişiyor. Yani bu bir kelime de olabiliyor bazen, bazen bir kök de olabiliyor, bazen sadece boşluk veya noktalama işareti veya bir harf de olabiliyor. Oradaki kullanılan Tokenizer'ın metoduna göre bu yapı çok değişiyor. Dediğin şey dilden dile de çok değişiyor. Bu Türkçenin yapısıyla da alakalı. Yani işte Türkçe sondan eklemeli, eklerin yoğun olduğu falan filan bir değil. Ondan dolayı işte çok şey oluyor. Ama işte İngilizcedeki kelimeler daha kısa, işte to as falan filan böyle bir sürü arada küçük kelimeler var. Onlardan dolayı mesela tokenizer ederken falan o küçük kelimeleri atabiliyorsunuz. Model daha fazla şey yapıyor. Daha az tokenla daha iyi çalışabiliyor falan filan gibi bir sürü durum var. Tick tokenizer diye bir şey var. App var birisinin yaptığı. Buraya bir cümle yazıyorsunuz. Seçtiğiniz model nasıl token halde diyor. Nereden bölüyor ve bunları hangi sayıya mapliyor onu gösteriyor size. Bunun da linkini ben size atayım. Buna da bakabilirsiniz. Neredeydik? Bu birik kelimesini bilgisayar bilmez. Bunu anlatmak lazım. En başta tokenize edeceğim. Tokenize etmek için kullandığım tokenizerin metoduna göre bir yerlerden bölecek ve belli başlı sayılara dönüştürecek. Bu sayılar da rastgele değil. Şimdi biraz teknik şeylere giriyormuşuz gibi oldu. Bunları keyword olarak alabilirsiniz. Embedding dediğimiz bir kavram var. Embedding'de sayıları belli vektörlere, daha doğrusu kelimeleri belli vektörlere dönüştürüp bu şeyleri bir uzayda tutmaya yarıyor diyeyim.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sodales leo id commodo ornare.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sodales leo id commodo ornare.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sodales leo id commodo ornare.