
Yapay zekayı kullanmanın bir yolu ChatGPT, Gemini veya benzeri bir servise girip soru sormak.
Peki kendi belgelerimizi kullanan, mümkün olduğunca veriyi dışarı göndermeyen ve kendi bilgisayarımızda çalışan bir yapay zeka sistemi oluşturabilir miyiz?
Benim çıkış noktam tam olarak buydu.
Elimizde kurum içindeki projelerle ilgili dokümanlar var. Kullanıcı örneğin bir proje hakkında soru sorduğunda, klasik bir sık sorulan sorular sistemi gibi yalnızca önceden yazılmış cümleyi bulup göstermesini istemiyorum.
Soruyu anlayacak.
İlgili belgeyi bulacak.
Gerekli bilgiyi o belgeden çıkaracak.
Sonra da doğal bir Türkçeyle cevap verecek.
Ama mümkün olduğunca kendi kafasından bilgi üretmeyecek.
Üstelik kurum içindeki bazı dokümanları doğrudan üçüncü taraf yapay zeka servislerine göndermek yerine sistemi yerel bir makinede çalıştırmak istiyorum.
Böylece ortaya şu fikir çıktı:
Kendi bilgisayarımızda çalışan, kendi dokümanlarımızı kullanan ve internet üzerinden uygulamalarımızın erişebildiği yerel bir yapay zeka asistanı.
Bu yazıda üç video boyunca yaptığım denemelerin tamamını tek bir akışta anlatacağım.
Videoları izlemek istersen diye koyuyorum, Yazı için sayfanın devamına bakabilirsiniz:
İlk soru: Yapay zekayı neden yerelde çalıştıralım?
Bulut üzerindeki yapay zeka servisleri son derece güçlü. Zaten ben de geliştirme sürecinde bunlardan yararlanıyorum.
Ancak her senaryoda bütün veriyi dışarı göndermek istemeyebilirsiniz.
Özellikle kurum içi belgeler, proje dokümanları veya belirli bir organizasyona ait bilgiler söz konusu olduğunda başka bir seçenek daha var:
Yapay zeka modelini kendi bilgisayarınızda çalıştırmak.
Burada iki önemli motivasyonum vardı:
Veri kontrolü ve maliyet.
Her sorunun, her dokümanın ve her işlemin dışarıdaki bir servise gitmesi yerine bazı işleri kendi makinemizde halledebiliriz.
Bunun için karşıma çıkan araçlardan biri Ollama oldu.
1. Ollama ile yerel yapay zekayı çalıştırmak
Ollama temel olarak farklı açık yapay zeka modellerini kendi bilgisayarımızda çalıştırabilmemizi sağlayan bir sistem.
Ben Mac üzerinde denedim.
Kurulumdan sonra ihtiyacımıza göre bir model indirip terminal üzerinden çalıştırabiliyoruz.
İlk denememde cevap üretmek amacıyla Qwen ailesinden bir model kullandım.
Model birkaç gigabyte büyüklüğündeydi. İndirme tamamlandıktan sonra terminal üzerinden ilk soruları sormaya başladım.
Ve ilk önemli eşik aşılmış oldu:
Bilgisayarım internetteki bir yapay zeka servisine soru göndermeden kendi üzerinde çalışan modelden cevap üretebiliyordu.
Ama bizim için bu yeterli değildi.
Çünkü genel kültür sorularına cevap veren bir yapay zeka istemiyordum.
Benim istediğim şuydu:
Sana verdiğim kaynaklarda ne yazıyorsa ona göre cevap ver. Kaynakta bilgi yoksa tahmin etme.
Asıl mesele bundan sonra başladı.
2. Bir klasöre PDF koyunca yapay zeka öğrenmiş olmuyor
İlk bakışta çok doğal bir beklentimiz var:
Belgeleri bir klasöre atalım, yapay zeka da onları okusun ve sorularımıza cevap versin.
Fakat iş teknik olarak tam böyle çalışmıyor.
Modelin belgelerimizi kalıcı olarak ezberlemesini sağlamak yerine daha sağlıklı bir sistem kurabiliriz.
Mantık şöyle:
- Belgeleri okuyoruz.
- Metni anlamlı parçalara ayırıyoruz.
- Her parçanın anlamsal temsilini oluşturuyoruz.
- Kullanıcı bir soru sorduğunda soruya en yakın belge parçalarını buluyoruz.
- Sadece bu parçaları yapay zeka modeline veriyoruz.
- Modele, “Bu kaynaklara göre cevap ver. Bilgi yoksa bilmiyorum de.” diyoruz.
Bu yaklaşım genel olarak RAG — Retrieval-Augmented Generation, yani kaynaklardan destek alarak cevap üretme yaklaşımı olarak biliniyor.
Bence sistemin kırılma noktası da burasıydı.
3. Neden klasik kelime araması yeterli olmadı?
Aslında daha önce benzer bir sistemi klasik yöntemlerle oluşturmaya çalışmıştım.
Veritabanında metin araması yapıyor, anahtar kelimeler ve çeşitli eşleştirmeler kullanıyordum.
Problem şu:
Kullanıcı sizin yazdığınız kelimeleri kullanmak zorunda değil.
Dokümanda:
“Projelerin faaliyetlerinin izlenmesi”
yazabilir.
Kullanıcı ise:
“Bu sistemde proje takibi yapılabiliyor mu?”
diye sorabilir.
İnsan olarak iki cümlenin aynı konuya yakın olduğunu hemen anlıyoruz.
Ama yalnızca kelime eşleştiren bir sistem bunu kolaylıkla kaçırabilir.
İşte burada embedding, yani kabaca metnin anlamsal temsilini çıkarma yaklaşımı devreye giriyor.
Her belge parçasını sayısal bir anlam temsiline dönüştürüyoruz.
Kullanıcının sorusuna da aynısını yapıyoruz.
Sonra kelimelerin birebir aynı olup olmadığına değil, anlam olarak ne kadar yakın olduklarına bakıyoruz.
Bu amaçla ayrı bir embedding/anlam modeli kullandık.
Böylece sistemde aslında iki farklı yapay zeka görevi oluştu:
Bir model doğru kaynağı buluyor.
Diğer model bulunan kaynakları kullanarak cevabı yazıyor.
Her yapay zeka modelinin her işi aynı kalitede yapmadığını burada çok daha net görmüş oldum.
4. Önce kaynak bulmayı test ettim
Burada yaptığımız önemli hatalardan biri doğrudan chatbot sonucuna bakmak olabilir.
Model kötü cevap verdiğinde hemen:
“Bu yapay zeka kötü.”
diyoruz.
Oysa problem başka yerde olabilir.
Modelin önüne yanlış kaynak geldiyse dünyanın en iyi dil modelini kullansanız bile doğru cevap alma ihtimaliniz düşer.
Bu yüzden önce şuna baktım:
Soru geldiğinde sistem gerçekten doğru belge parçasını bulabiliyor mu?
Elimdeki gerçek proje dokümanları ve hazırlanmış soru-cevap setleri üzerinden testler yaptım.
Örneğin belirli bir kategoride hangi yazılımın kullanılacağı sorulduğunda sistem doğru kaynağı bulup yalnızca belgede geçen yazılımı söyleyebiliyor muydu?
Kaynakta olmayan bir bilgi sorulduğunda cevap üretmek yerine “bilgi bulunamadı” diyebiliyor muydu?
Bu testlerde sistemin oldukça iyi sonuçlar verdiğini gördüm.
Tabii kusursuz değildi.
Zaten işin önemli kısmı da burada:
Yapay zeka sistemleri biraz deneme, biraz ölçme ve biraz ayar işi.
5. Her soruda bütün belgeleri tekrar işlemek mantıksızdı
İlk çalışan sistemin başka bir problemi ortaya çıktı.
Her soru geldiğinde yaklaşık 186 kaydı tekrar tekrar işliyordu.
Bu da doğal olarak zaman kaybettiriyordu.
Oysa belgeler değişmediyse aynı embedding hesaplarını sürekli yeniden üretmeye gerek yok.
Bu nedenle sonuçları bir indeks/cache yapısında saklamaya başladık.
Yeni mantık şu oldu:
Belgeler değiştiğinde indeks oluştur.
Sonraki sorularda hazır indeksi kullan.
Bu küçük değişiklik sistemi gerçek bir uygulamaya dönüştürmek açısından önemliydi.
Çünkü bir demo ile kullanılabilir servis arasındaki farklardan biri de bu:
Aynı pahalı işi gereksiz yere tekrar yapmamak.
6. Terminalde çalışan şey artık yetmiyordu
Bu noktaya kadar sistem terminal üzerinden çalışıyordu.
Soru yazıyorum.
Kaynak bulunuyor.
Model cevap üretiyor.
Güzel.
Ama gerçek dünyada kimse kullanıcıya terminal açtırmayacak.
Flutter uygulamasının, web sitesinin veya başka bir servisin bu yapay zekaya soru gönderebilmesi gerekiyor.
Bunun için sistemin önüne küçük bir API koymaya karar verdim.
Burada FastAPI kullandık.
Python tarafında ayrı bir sanal ortam oluşturarak sistemi mevcut çalışma ortamımdan mümkün olduğunca izole tuttum.
API’nin görevi oldukça basit:
Kullanıcıdan soruyu al.
İlgili kaynakları bul.
Kaynakları ve soruyu yerel yapay zeka modeline gönder.
Cevabı al.
Temizleyip JSON olarak geri döndür.
Artık elimizde terminal komutundan daha fazlası vardı.
Elimizde gerçek bir yerel yapay zeka servisi bulunuyordu.
7. Basit bir web arayüzüyle test
API çalıştıktan sonra küçük bir web arayüzü oluşturdum.
Bunun amacı güzel bir chatbot tasarlamak değildi.
Asıl amaç sistemi gerçek kullanıcı gibi test etmekti.
Soruyu kutuya yazıyorum.
Gönderiyorum.
API soruyu alıyor.
Kaynak bulunuyor.
Yerel yapay zeka cevap üretiyor.
Sonuç ekranda görünüyor.
Bu aşamada yanlış kaynakların cevabı etkileyebildiğini de gördüm.
Örneğin en iyi kaynak doğru olduğu halde ikinci veya üçüncü sıradaki daha zayıf kaynaklar modele gönderildiğinde cevap başka bir kategoriden gereksiz biçimde etkilenebiliyordu.
Bunun üzerine düşük skorlu kaynakları modele hiç vermemek gibi filtrelemeler ekledik.
Burada bir kez daha şu ortaya çıktı:
RAG sistemi kurmak yalnızca “vektör arama yaptım, bitti” demek değil.
Kaç kaynak vereceğiniz, hangi skorun altını eleyeceğiniz, belgeleri nasıl böleceğiniz ve modele nasıl talimat vereceğiniz sonucu ciddi şekilde etkiliyor.
8. Sıra yerel yapay zekayı dış dünyaya açmaya geldi
İkinci bölüm sonunda sistem bilgisayarımda çalışıyordu.
Ama yalnızca benim bilgisayarımdan erişilebilen bir chatbot bizim asıl ihtiyacımızı çözmüyordu.
Flutter uygulamasının farklı bir cihazdan bu servise erişebilmesi gerekiyordu.
Yani artık şu zinciri kurmamız gerekiyordu:
Mobil uygulama → İnternet → Yerel bilgisayar → Yapay zeka → Cevap → Mobil uygulama
Eskiden bunun için modem üzerinde port açmak, IP adresleri ve çeşitli ağ ayarlarıyla uğraşmak oldukça alışıldık bir yöntemdi.
Ben bu projede mümkün olduğunca modem portu açmadan ilerlemek istedim.
Burada Cloudflare Tunnel yaklaşımını denemeye başladım.
9. Cloudflare Tunnel ile modem portu açmadan erişim
Mantık aslında güvenlik kameralarından çok da farklı değil.
Evde veya iş yerinde duran fiziksel bir cihaz var.
Ama siz internet üzerinden o cihazın sunduğu servise erişebiliyorsunuz.
Biz de benzer biçimde bilgisayarımdaki yerel API’yi dışarıdan erişilebilir hale getirmek istiyoruz.
Cloudflare tarafındaki denemelerde önce geçici bir tünel kullandım.
Sistem bize dışarıdan erişilebilen bir adres verdi.
Bu adresi kullanarak internetteki başka bir noktadan yerel bilgisayarımdaki API’ye soru göndermeyi denedim.
Ve cevap geldi.
Bu, projenin en keyifli anlarından biriydi.
Çünkü artık mesele teorik değildi.
İnternetten gönderdiğim soru gerçekten benim bilgisayarıma geliyor, bilgisayarımdaki yapay zeka cevabı üretiyor ve cevap tekrar internet üzerinden bana dönüyordu.
10. Flutter uygulamasını değiştirmeden yapay zeka altyapısını değiştirdik
Sonraki test benim için ayrıca önemliydi.
Elimde daha önce geliştirdiğimiz Flutter uygulaması vardı.
Uygulama zaten bir API’ye soru gönderip cevap alabiliyordu.
Biz uygulamanın beklediği cevap yapısını büyük ölçüde değiştirmedik.
Arkadaki sistemi değiştirdik.
Eskiden cevap başka bir yapay zeka servisinden gelirken artık istek bizim yerel sistemimize yöneliyordu.
Telefonuma mevcut uygulama sürümünü kurdum.
Bir proje sorusu sordum.
Uygulama isteği gönderdi.
İstek yerel bilgisayarıma ulaştı.
Bilgisayarımdaki model belgelerden cevabı üretti.
Ve cevap telefonun ekranına geldi.
İşte o noktada artık gerçekten çalışan küçük bir yapay zeka altyapımız vardı.
11. Çalışması yetmiyor: Uydurmaması da gerekiyor
Yapay zeka sistemlerinde beni en fazla ilgilendiren konulardan biri bu.
Cevabın güzel görünmesi tek başına başarı değil.
Kaynağa sadık mı?
Özellikle kurum bilgisi veriyorsanız bu çok daha önemli.
Bu nedenle sisteme kasıtlı olarak dokümanda bulunmayan sorular da sordum.
Örneğin kaynaklarda bulunmayan bir canlı yayın bağlantısını sordum.
Bazı testlerde model gereğinden fazla cevap üretmeye çalıştı.
Bazılarında doğru biçimde bilgi bulunamadığını söyledi.
Dolayısıyla prompt, kaynak seçim eşiği ve cevap üretme kuralları üzerinde hâlâ çalışılması gerekiyor.
Ben bunu “modeli eğitmek” diye günlük dille ifade ediyorum ama teknik olarak çoğu zaman yaptığımız şey modeli baştan eğitmek değil.
Daha çok:
- doğru kaynakları seçmek,
- modele verdiğimiz talimatları ayarlamak,
- cevap uzunluğunu sınırlandırmak,
- düşük kaliteli kaynakları elemek,
- bilinmeyen sorularda susmasını öğretmek
gibi sistem davranışını düzenleyen işlemler.
Ve bunların bir kısmı ancak gerçek sorular geldikçe ortaya çıkıyor.
12. Soru ve cevapları neden kaydetmek istiyorum?
Bir sonraki önemli aşamalardan biri kullanıcıların sorduğu soruları ve sistemin verdiği cevapları kaydetmek.
Bunun birkaç faydası var.
Birincisi kalite kontrolü.
İnsanlar ne sormuş?
Sistem doğru cevap vermiş mi?
Kaynakta olmayan bir konuda uydurmuş mu?
İkincisi performans.
Eğer kullanıcı daha önce birebir aynı soruyu sormuşsa her seferinde yeniden kaynak bulup model çalıştırmak zorunda olmayabiliriz.
Onaylanmış cevabı doğrudan veritabanından döndürebiliriz.
Böylece yerel makineyi de gereksiz yere yormamış oluruz.
13. Ortaya çıkan mimari
Üç bölümün sonunda sistem kabaca şu hale geldi:
1. Kullanıcı
Flutter uygulamasından veya web arayüzünden sorusunu soruyor.
↓
2. API
Soruyu kabul ediyor.
↓
3. Kaynak bulma sistemi
Soruyu anlamsal olarak değerlendirip en ilgili doküman parçalarını buluyor.
↓
4. Yerel yapay zeka modeli
Yalnızca bulunan kaynaklara göre cevabı oluşturuyor.
↓
5. API cevabı
Sonuç JSON olarak dönüyor.
↓
6. İnternet bağlantısı
Cloudflare Tunnel gibi bir yapı üzerinden yerel bilgisayara güvenli bir yol açılıyor.
↓
7. Kullanıcı uygulaması
Cevabı kullanıcıya gösteriyor.
Böylece dokümanlar bir klasörde duruyor ve yapay zeka gerektiğinde ilgili kaynağı bulup cevabı oluşturuyor.
Doküman değiştiğinde modeli yeniden eğitmek yerine belgeleri yeniden indekslemek yeterli oluyor.
14. Bu sistemi başka bilgisayara taşıyabilir miyiz?
Denemeler sırasında benim de aklıma gelen sorulardan biri buydu.
Şu anda geliştirmeyi kendi bilgisayarımda yapıyorum.
Ama gerçek kullanımda sürekli açık duran ayrı bir bilgisayar kullanmak daha mantıklı olabilir.
API dosyaları ve kaynak belgeler başka bir makineye taşınabilir.
Yeni cihazda Python ortamını yeniden oluşturabiliriz.
Ollama’yı tekrar kurup modelleri yeniden indirebiliriz.
Tunnel sistemini de yeni cihazda tekrar yetkilendirebiliriz.
Benim hedefim sonunda kurum içinde sürekli açık duran bir makine kullanmak.
Belgeler orada bulunacak.
Yapay zeka modelleri o makinede çalışacak.
Dışarıdaki uygulamalar kontrollü biçimde bu makineye soru gönderecek.
15. Peki güçlü bir bilgisayar gerekiyor mu?
Bu tamamen kullanılacak modele ve eş zamanlı kullanıcı sayısına bağlı.
Deneme sırasında 16 GB RAM’in rahat bir başlangıç olabileceği değerlendirmesini yaptık.
Daha düşük donanımlarla da küçük modeller denenebilir.
Burada hedefim yüzlerce kişiye aynı anda hizmet veren devasa bir sistem kurmak değil.
Belirli bir kullanım alanında, sınırlı sayıda kullanıcıya kurum dokümanlarından bilgi veren ekonomik ve kontrol edilebilir bir sistem oluşturmak.
Dolayısıyla doğru modeli seçmek çoğu zaman “en büyük modeli çalıştırmak”tan daha önemli.
16. Yapay zekayla yapay zeka sistemi geliştirmek
Bu projenin benim açımdan ilginç taraflarından biri de şu:
Yerel yapay zeka sistemini geliştirirken ChatGPT’den yoğun biçimde yararlandım.
Kod yazdırdım.
Hataları sordum.
Mimariyi tartıştım.
Test sonuçlarını değerlendirdim.
Bazen önerdiği şeyi sorguladım.
Bazen “bu böyle olursa geçen sefer yaşadığımız sorun tekrar çıkmaz mı?” diye itiraz ettim.
Bence yapay zeka araçlarını kullanmanın doğru tarafı da burada başlıyor.
Yapay zeka size güçlü bir araç veriyor.
Ama ne yapmak istediğinizi bilmek, ortaya çıkan sonucu sorgulamak ve bir şeylerin yanlış gittiğini sezebilmek hâlâ önemli.
Yıllar içinde kazanılmış tecrübenin değeri de burada ortaya çıkıyor.
Çünkü bazen kodu görmeden bile:
“Burada bir şey ileride başımıza iş açacak.”
diyorsunuz.
Sonra gerçekten açıyor.
Sonuç: Kendi yapay zeka altyapımızı kurmak artık ulaşılmaz bir şey değil
Bu denemeye başlarken yalnızca teorik olarak bildiğim birçok şeyi ilk defa gerçek bir sistem üzerinde uyguladım.
Üç bölüm sonunda:
- Ollama’yı yerel bilgisayara kurduk.
- Yerel dil modellerini çalıştırdık.
- Belgeleri kaynak olarak kullanmaya başladık.
- Kelime araması yerine anlamsal arama kullandık.
- RAG mantığını kurduk.
- Kaynak sadakatini test ettik.
- Embedding sonuçlarını indeksledik.
- FastAPI ile yerel API oluşturduk.
- Basit bir chatbot arayüzü hazırladık.
- Sistemi internetten erişilebilir hale getirdik.
- Flutter uygulamasından gerçek istek gönderdik.
- Yerel bilgisayardaki yapay zekadan telefona cevap aldık.
Elbette sistem bitmiş değil.
Kalıcı alan adı ve tünel yapılandırması, güvenlik, loglama, soru-cevap kayıtları, performans, daha iyi kaynak seçimi ve gerçek kullanıcı testleri üzerinde çalışılması gerekiyor.
Ama en önemli eşik geçildi.
Başlangıçta kafamdaki fikir şuydu:
“Kendi dokümanlarımızı kullanan yapay zeka asistanını kendi bilgisayarımızda çalıştırabilir miyiz?”
Üç bölüm sonunda cevabım:
Evet, çalıştırabiliyoruz.
Üstelik mesele artık yalnızca bilgisayarımın terminalinde çalışan bir yapay zeka modeli değil.
Uygulamanın soru sorabildiği, ilgili dokümanı bulan, cevabı kendi bilgisayarımda oluşturan ve internet üzerinden kullanıcıya geri gönderen gerçek bir sistemden bahsediyoruz.
Bundan sonrası sistemi daha güvenli, daha hızlı ve daha güvenilir hale getirmek.
Ve bana göre işin en güzel tarafı da bu:
Okuyarak öğrenmek başka bir şey.
Bir sistemi gerçekten kurup, bozup, tekrar düzeltmek çok başka bir şey.