Neden kendi cihaz-üstü yapay zekâ uygulamamızı yaptık?
PocketAnima'yı üç sebeple yaptık: gizlilik, öğrenme ve kanıt. Yapay zekâyı müşteri ürünlerine ekleyen bir ekip olarak, bu yeteneklerin üretim kodunda gerçekte nasıl davrandığını bir slayttan değil, kendi elimizle kurduğumuz bir üründen bilmek istedik. Bir yeteneği anlatmak ile onu her gün çalışan bir üründe taşımak arasında büyük fark vardır; ikincisi, birincisinin göremeyeceği ayrıntıları öğretir.
Gizlilik ise ürünün merkezindeydi. Kararı baştan verdik: yapay zekâ sohbeti kullanıcının telefonunda, cihazın içinde çalışsın; hiçbir mesaj bizim sunucularımıza uğramasın. Bu, sonradan eklenen bir seçenek değil, ürünün ne olduğuna dair bir cümleydi — ve o cümlenin doğru olması için mimarinin tamamının onun etrafında kurulması gerekiyordu. Aşağıda bunu kurarken verdiğimiz teknik kararları, zorlandığımız yerleri ve müşteri projelerine ne taşıdığımızı adım adım anlatıyoruz.
Bir dil modeli telefona nasıl sığar?
Bir dil modeli telefona, sıkıştırılarak ve cihazın belleğine göre seçilerek sığar. Büyük bir modelin ağırlıkları bir telefona olduğu gibi girmez; bu yüzden model, doğruluğundan bir miktar ödün vererek daha küçük bir biçime indirgenir. PocketAnima, modelleri açık bir formatla (GGUF) ve olgun bir çalıştırma kütüphanesiyle (llama.cpp) telefonun işlemcisinde koşturur. Modeli kullanıcı indirir; ondan sonra sohbet, ağa hiç çıkmadan cihazda yürür.
Buradaki dürüst denklem şu: telefona sığan model, veri merkezindeki büyük modelden daha az yeteneklidir. Bu bir kusur değil, bir fizik gerçeğidir — bellek sınırlıdır, model küçülür, biraz yetenek geride kalır. Ama çoğu günlük konuşma için bu model fazlasıyla yeterlidir ve karşılığında hız, gizlilik ve çevrimdışı çalışma verir. Biz bu bedeli gizlemek yerine kullanıcıya seçenek sunmayı tercih ettik: küçük model işini görüyorsa cihazda kal, daha fazla güç gerekiyorsa buluta geç.
Modeli kim seçer? Cihaz-üstü model yönetimi
Cihaz-üstü bir uygulamada modeli kullanıcı seçer, ve bu tek başına bir altyapı problemidir. Modeller küçük dosyalar değildir; telefonun hafızası da sonsuz değildir. Bu yüzden uygulama içinden bir model listesi sunduk: her modelin cihaza sığıp sığmayacağını önceden gösterir, indirmeyi kaldığı yerden devam ettirir, indirilen modeli aktif eder ve eski modeli silmeyi kullanıcının denetimine bırakır. 'Modeli indir, çalıştır, gerekirse sil' akışının sorunsuz olması, cihaz-üstü bir uygulamada sohbetin kendisi kadar önemlidir.
Bu akışı kurarken öğrendiğimiz ders, kullanıcıyı cihazının sınırlarıyla dürüstçe yüzleştirmenin daha iyi olduğuydu. Bir modeli indirip cihaza sığmadığını sonradan anlamak kötü bir deneyimdir; bu yüzden 'bu cihaza rahatça sığar' ya da 'bu model cihazınız için büyük olabilir' gibi bir işareti indirme öncesine koyduk. Kullanıcıyı bir sürprizden korumak, ona bir uyarı göstermekten geçiyordu. Kurumsal bir üründe aynı ilke geçerli: sistemin sınırını kullanıcıya önceden söylemek, sonradan özür dilemekten iyidir.

Tek motor, iki beyin: yerel ve bulutu aynı arayüzde tutmak
PocketAnima'da motor tek bir arayüzün arkasında durur: cihazdaki yerel model de, kullanıcının kendi anahtarıyla bağladığı bir bulut sağlayıcısı da aynı arayüzü konuşur. Varsayılan tamamen çevrimdışı cihaz modelidir; kullanıcı isterse kendi bulut anahtarını ekleyip daha güçlü bir modele geçer. Anahtar hiç eklenmezse uygulama eksiksiz çalışır — bulut bir zorunluluk değil, kullanıcının bilinçli tercihidir.
Bu soyutlamanın değerini geliştirirken defalarca gördük. Yeni bir sağlayıcı eklemek, uygulamanın geri kalanına dokunmadan tek bir adaptör yazmaktan ibaret oldu; motor değişse de arayüz, sohbet geçmişi ve özellikler aynı kaldı. Bu, aslında ürün ailemizin genel ilkesidir — kaynak değişince yalnız adaptör değişir, çekirdek dokunulmaz kalır — ve yapay zekâda özellikle işe yarıyor, çünkü bu alan altımızda sürekli değişiyor. Aynı deseni müşteri projelerinde de kurarız: bir yapay zekâ sağlayıcısını çekirdeğe gömmeyiz, adaptör olarak ekleriz.
Belgelerle konuşmak: cihazda RAG'i nasıl kurduk?
PocketAnima'da bir belge yükleyip onun üzerinden soru sorabilirsiniz; cevap, hangi kaynaktan geldiğini de gösterir. Bunu cihazda çalıştırmak buluttan zordur, çünkü iki ayrı problemi çözmek gerekir: belgeyi anlamlı parçalara bölmek ve binlerce parça içinden soruya cevap verecek olanı bulmak. İlkini metin, kod ve PDF için parçalayıcılarla, ikincisini ise bir getirme (retrieval) katmanıyla çözdük — hepsi cihazda, yüklenen belge hiçbir sunucuya gitmeden.
Getirmede öğrendiğimiz ders, tek bir yöntemin yetmediğiydi. Yalnız anahtar-kelime araması, kelime örtüşmesi olmayan ama anlamca ilgili bir parçayı kaçırıyor; yalnız anlamsal arama ise bazen çok genel kalıyordu. Bu yüzden ikisini birleştiren melez bir getirme kurduk: hem anahtar-kelime hem de anlam bazlı benzerliği hesaplayıp sonuçları harmanlıyoruz. Cevabın kaynağını göstermeyi de baştan koyduk, çünkü kullanıcı 'bunu nereden buldun' diye sorabilmeli. Kurumsal bir RAG projesinde de aynı iki dersi taşırız: getirme kalitesi modelden önemlidir, ve kaynak görünür olmalıdır.

Sesi cihaza taşımak: çevrimdışı okuma ve dikte
PocketAnima'da yazmanın yanında konuşabilir ve cevabı sesli dinleyebilirsiniz; hem konuşmayı yazıya çevirme hem de yazıyı sese çevirme cihazda çalışır. Bunu cihaza taşımanın anlamı, mikrofon verisinin bir sunucuya gönderilmemesi ve ses kaydının cihazdan çıkmamasıdır. Sesli bir asistanın çoğu zaman görmezden gelinen gizlilik boyutu buradadır: sesiniz de en az yazınız kadar kişiseldir, ve cihaz-üstü yaklaşım onu da içeride tutar.
Sesi cihazda çözmenin bedeli, kütüphanenin sınırlarıyla yaşamaktır. Cihazda çalışan ses modelleri, sunucuda koşan büyük modeller kadar cilalı olmayabilir; telaffuz her zaman stüdyo kalitesinde çıkmaz. Ama işlev sağlamdır ve en önemlisi çevrimdışıdır. Buradaki tasarım kararı, sesi bir gösteri değil bir kolaylık olarak konumlandırmaktı: eller meşgulken sormak, cevabı okumak yerine dinlemek. Ses, sohbetin yerini almadı; ona bir alternatif giriş-çıkış yolu ekledi.
Karakterler: aynı model, farklı kişilik
PocketAnima'da hazır karakterlerle ya da kendi kurduğunuz bir karakterle sohbet edebilirsiniz; her karakterin bir sistem yönergesi ve tonu vardır. İlginç olan şu: aynı model, farklı bir karakterle farklı davranır. Bir karaktere 'kısa ve teknik cevap ver' dediğinizde, başka birine 'sıcak ve açıklayıcı ol' dediğinizde, altta çalışan model aynıdır ama çıktı belirgin biçimde değişir. Bu, modelin kendisini değiştirmeden davranışını yönlendirmenin ne kadar güçlü olduğunu gösteren pratik bir örnektir.
Bu, yapay zekâ eklerken sık atlanan bir kaldıraçtır. Çoğu ürün, davranışı değiştirmek için daha büyük ya da farklı bir model arar; oysa çoğu zaman aynı modele iyi yazılmış bir sistem yönergesi vermek yeterlidir. PocketAnima'da bunu kullanıcının eline verdik — karakteri o kuruyor. Kurumsal bir projede ise bu yönergeyi biz tasarlarız: asistanın ne yapacağını, neyi yapmayacağını ve hangi tonu kullanacağını, modeli değiştirmeden bir sistem yönergesiyle belirleriz.
Cihaz çeşitliliğiyle nasıl baş ettik?
Cihaz çeşitliliğiyle, en zayıf makul cihazda bile düzgün çalışacak bir temel kurup güçlü cihazların kapasitesini kademeli açarak baş ettik. Telefon dünyası tek tip değildir: işlemci, bellek ve grafik yetenekleri cihazdan cihaza değişir. Bu yüzden uygulamayı önce sağlam bir işlemci (CPU) temeli üzerine kurduk — böylece her cihazda güvenilir biçimde çalışır — ve hızlandırmayı bunun üstüne bir kademe olarak ele aldık. Modeli telefonun grafik işlemcisinde ya da özel yapay zekâ yongasında hızlandırmak, her cihazda aynı ölçüde mümkün olmadığı için, yol haritasında ilerlettiğimiz bir konudur.
Buradan çıkan ders, cihaz-üstü bir üründe 'en iyi durum'a değil 'en yaygın durum'a göre tasarlamak gerektiğiydi. Bir özellik yalnız en güçlü telefonlarda çalışıyorsa, kullanıcıların çoğu için çalışmıyor demektir. Bu yüzden her yeni özelliği 'bunu sınırlı kaynakta, internetsiz nasıl yaparız' sorusuyla kurduk; hızlandırma varsa ekstra, yoksa temel yine sağlam. Bu disiplin, aslında kurumsal yazılımda da geçerlidir: en görkemli demoyu değil, sahada en çok karşılaşılan koşulu hedef almak.

Neyi bilerek sıraya koyduk?
Zengin bir uygulamayı doğru sırayla kurmak, her şeyi aynı anda yapmaya çalışmaktan iyidir. Bu yüzden önce güvenilir bir cihaz-üstü sohbet temeli kurduk, sonra üstüne belge sohbeti, ses ve karakterleri kademe kademe ekledik. PocketAnima büyümeye devam eden bir üründür; aynı çekirdeğin daha çok platforma ulaşması, daha fazla donanım hızlandırması ve yeni yeteneklerin eklenmesi yol haritasının doğal parçalarıdır. Bir ürünü 'bitmiş' değil 'olgunlaşan' olarak görmek, her kademeyi hakkını vererek kurmayı sağlıyor.
Sıralamayı belirleyen ilke şuydu: bir kademe, üstüne yenisi konabilecek kadar sağlam olmadan bir sonrakine geçme. Ses eklemek, sohbet temeli oturmadan anlamsızdı; belge sohbeti, model çalıştırma güvenilir olmadan kırılgan olurdu. Bu, kurumsal projelerde de savunduğumuz bir yaklaşımdır — zengin bir sürümü hedeflemek ama onu doğru sırayla, önce sağlam taban sonra katmanlar biçiminde kurmak. Aceleyle her şeyi aynı anda açmak, sonunda hiçbirinin güvenilir olmadığı bir ürün bırakır.
Bu üründen ne öğrendik ve müşteri projelerine ne taşıdık?
En büyük öğrendiğimiz, cihaz-üstü yapay zekânın bir 'dil modeli' meselesi değil bir mühendislik meselesi olduğuydu. Modeli çalıştırmak işin belki de en kolay parçasıydı; asıl iş indirme, güncelleme, depolama, farklı cihazlarda çalışabilirlik, getirmenin kalitesi ve dürüst bir arayüzdü. Bu, yapay zekâyı herhangi bir ürüne eklerken de geçerli: model bir bileşendir, ürün ise onun etrafındaki her şeydir.
Bu deneyimi doğrudan müşteri projelerine taşıyoruz. Cihaz-üstü ve gizlilik-öncelikli yaklaşım, verinin dışarı çıkmaması gereken sektörler — sağlık, hukuk, kamu, kendi verisi üstünde tam denetim isteyen kurumlar — için güçlü bir cevaptır; ve biz bunu bir slaytta değil, çalışan bir üründe kanıtladık. Adaptör mimarisi, melez getirme, insan onaylı karar desteği ve dürüst arayüz — hepsi PocketAnima'da denenmiş, sonra kurumsal işe taşınmış desenlerdir. Kendi ürününü kullanan bir ekip, o ürünün derslerini birkaç saatte öğrenir; kullanmayan bir ekip, ancak müşteri şikâyet edince.

Sonuç: cihaz-üstü yapay zekâ bir vaat değil, bir mühendislik disiplini
PocketAnima, cihaz-üstü yapay zekânın bir pazarlama cümlesi değil, baştan sona bir mühendislik disiplini olduğunu bize öğretti. Modeli telefona sığdırmaktan indirmeyi yönetmeye, belgeyi ve sesi cihazda çözmekten cihaz çeşitliliğiyle baş etmeye kadar her parça, 'sınırlı kaynakta, internetsiz, veri dışarı çıkmadan nasıl yaparız' sorusuyla tasarlandı. Kazandığımız şey çevrimdışı çalışma, gizlilik ve kontrol; ödediğimiz bedel ise model sınırlarını açıkça kabullenmek ve her kademeyi doğru sırayla kurmak oldu.
Bu dersleri hem PocketAnima'yı büyütmekte hem de müşteri projelerinde kullanıyoruz. Cihaz-üstü ya da gizlilik-öncelikli bir yapay zekâ uygulaması, kurum içi bir asistan ya da kendi verinizle çalışan bir çözüm düşünüyorsanız, deneyimimizi paylaşmaktan memnuniyet duyarız. Vosetu olarak yapay zekâyı yalnız anlatmıyoruz; bir üründe, cihazın içinde çalıştırıyoruz.
