Rust ile oluşturulan yapay zekâ uygulamaları, JetBrains'in Rust Foundation iş birliğiyle düzenlediği canlı sunuma göre, ilk deneylerden giderek daha pratik modellere geçiyor. İlk oturum, açık kaynaklı Rig kütüphanesine ve bu kütüphanenin büyük dil modellerine dayanan, araçları çağırabilen ve uygulama içinde görevleri yerine getirebilen ajanlar oluşturmada nasıl kullanılacağına odaklandı.
Developer Advocate olan Orhun Parmaksız, Rig ve Ratatui kullanarak oluşturduğu küçük bir kodlama ajanını tanıtırken, 0xPlaygrounds'ta Rig'in baş sorumlusu olan Stephen Korzeniewski, projenin iç yapısını ve programlama arayüzlerinin arkasındaki tercihleri açıkladı.
Model sağlayıcıları için birleşik arayüz
Rig, dil modeli uygulamalarındaki yaygın bir pratik sorunu ele alıyor: OpenAI, Anthropic, Gemini ve diğerlerinin, bazı hizmetler OpenAI arayüzüyle uyumlu olduklarını ilan etse bile, farklı programlama arayüzleri bulunuyor. Uygulamanın bölümlerini doğrudan tek bir sağlayıcının arayüzüne bağlamak yerine Rig, sağlayıcıyı modelle ilişkili bölümleri yeniden yazmadan değiştirmeyi mümkün kılan birleşik bir Rust arayüzü sunuyor.
Kütüphane, uygulamayı sağlayıcı istemcisi, tamamlama modeli, ajan ve ajanın kullanabileceği araçlar dâhil olmak üzere çeşitli temel bileşenler etrafında düzenliyor. Ajan, doğrudan model isteğinin üzerinde bir katman olarak çalışıyor; metin girişi ve metin çıkışının ötesine geçen görevleri yerine getirmek için gereken talimatları, belirteç sınırlarını ve yetenekleri ekliyor.
Ajan talimatları, Rig'in preamble olarak adlandırdığı bölüme aktarılıyor. Bu talimatlar sistem istemi işlevi görüyor ve her isteğin başına ekleniyor. Model sağlayıcılarıyla ağ iletişimi, eşzamansız arayüzler üzerinden yönetiliyor; eşzamansız çalışmanın ayrıntılarının büyük bölümü kütüphanenin içinde tutuluyor, böylece uygulama kodu gereken yapılandırmaya ve davranışa odaklanabiliyor.
Araçlar, ajanı uygulamanın bir parçası hâline getiriyor
Rig, aracı Rust'taki Tool trait üzerinden tanımlıyor. Araç tanımı; adını, girdi ve çıktı türlerini, hataları ve çağrıldığında yürütülen işlevi içeriyor. Tanım ayrıca beklenen bağımsız değişkenleri JSON Schema kullanarak açıklıyor; böylece model, sunabileceği verilerin yapılandırılmış bir tanımını alıyor.
Araç ajana kaydedildikten sonra, araç çağrısını destekleyen bir model onu ne zaman kullanacağını belirleyebiliyor ve sonucunu yanıta dâhil edebiliyor. İşlev bir hesaplama yapabilir, veritabanına sorgu gönderebilir, bilgileri alabilir veya başka bir hizmete bağlanabilir. Araç ayrıca çağrı sayısı ya da önbelleğe alınmış sonuçlar gibi durumu koruyan bir bağlam alabilir. Bu fikir ajanların kendilerine de uzanıyor; bir ajan, görevleri aralarında devretmek üzere başka bir ajana araç olarak sunulabiliyor.
Deneme sunumundan test edilebilir uygulamaya
Rat Code projesi bu bileşenleri Rig ve Ratatui kullanarak terminalde çalışan küçük bir kodlama ajanında bir araya getirdi. main.rs dosyası sağlayıcı istemcisini, modeli ve ajanı başlatırken, dosya okuma ve yazma ile kabuk komutlarını çalıştırma yetenekleri ayrı olarak tanımlanıyor ve ardından Rig'in araç arayüzü üzerinden ajana kaydediliyor.
Uygulama ayrıca Rig'in akış arayüzünü kullanarak yanıtı parçalar hâlinde işliyor ve model yanıtı oluştururken terminal arayüzünü güncelliyor. Sunumda kancalar sistemi, araç çağrılarından kurtulma mekanizması ve kütüphanenin sunduğu soyutlamaların arkasındaki tasarım tercihleri de ele alındı. Kodun tamamının incelenmesi kayıtta 27:28 dakikasında başlıyor.
RAG, yerel modeller ve test
Rig, barındırılan model sağlayıcılarıyla sınırlı değil. Belgelerin ve kullanıcı sorgularının vektör yerleştirmelerine dönüştürüldüğü, ardından modele eklenecek en anlamsal olarak yakın belgelerin arandığı, getirmeyle güçlendirilmiş üretim uygulamalarını destekliyor. Kütüphane, veritabanlarıyla entegrasyonlar ve vektör depoları için soyutlamalar sunuyor; doğrudan desteklenmeyen bir veritabanı kullanılırken vektör deposu arayüzünün uygulanmasına da olanak tanıyor.
Yerel modeller Ollama ve llama.cpp üzerinden çalıştırılabilir veya çıkarım doğrudan bir Rust uygulamasının içinde gerçekleştirilmek üzere rig-candle entegrasyonu kullanılabilir. Bu seçenek, model ağırlıklarının uygulamaya dâhil edilmesini ve barındırılan bir model arayüzüne ya da ayrı bir yerel çıkarım sunucusuna ihtiyaç duymadan WebAssembly üzerinden desteklenen modellerin çalıştırılmasını sağlıyor.
Bu seçeneklerin önemi, modellerin ve verilerin nerede çalıştırıldığı konusunda ortaya çıkıyor; ancak aynı zamanda entegrasyonları test etme zorluğunu da gündeme getiriyor. Rig temel olarak bir kayıt sistemine dayanıyor: testler gerçek sağlayıcılarla yürütülüyor ve HTTP trafiği YAML dosyalarında saklanıyor; ardından sahte bir sunucu, sürekli entegrasyon testleri içinde istekleri ve yanıtları yeniden oynatıyor. Projede yaklaşık 1.700 kayıtlı etkileşim bulunuyor ve bu etkileşimler her bir birleştirme isteğiyle birlikte birkaç saniye içinde yeniden yürütülüyor.
Bu testler yazılım entegrasyonunun çalışmaya devam ettiğini doğruluyor, ancak sağlayıcı modelini güncellediğinde değişebilecek model çıktılarının kalitesini ölçmüyor. Bu nedenle sunum, yanıt kalitesine dayanan uygulamalar için canlı modeller üzerinde zamanlanmış testleri ayrı bir yöntem olarak işaret etti.
Editoryal değerlendirme: Geliştiriciler için ne önemli?
Rig'in pratik değeri yalnızca yeni bir sağlayıcı eklemekten ibaret değil; araçları, getirmeyi ve yerel çıkarımı tek bir Rust yapısı içinde tutarken uygulama katmanını model arayüzlerinin ayrıntılarından ayırmasında yatıyor. Bu, sağlayıcıyı veya çalışma yöntemini değiştirme maliyetini azaltabilir; ancak modeller arasındaki davranışsal farkları ortadan kaldırmaz ve çıktı kalitesinin değerlendirilmesi sorununu tek başına çözmez. Projedeki test mekanizması, bağlantının çalışmasını güvence altına almanın bir şey, modelin istenen sonucu ürettiğinden emin olmanın ise canlı testler ve bağımsız değerlendirme ölçütleri gerektiren başka bir şey olduğunu gösteriyor.