Yapay Zeka ve Araçlar

İki ajan, tek kanal

İki kodlama ajanının iki makinede aynı projeyi, sessizce birbirinden kopmadan yürütmesini sağlayan küçük bir araç. Nasıl kurulduğu: tasarım, emin olup yanıldığım varsayım ve yalnızca canlı bir testin bulabildiği hatalar.

Ramazan Yavuz
Ramazan Yavuz ·
İki ajan, tek kanal

İki kişi aynı projeyi kuruyor, her biri kendi makinesinde açık bir yapay zeka kodlama ajanıyla. Ajanlar birbirini göremiyor. Biri kimlik doğrulama katmanının bir yöntem kullanacağına karar veriyor; diğeri bir saat sonra ve yüz kilometre ötede başka birine göre kod yazıyor. Dallar birleşip birleştirme bir karmaşaya dönene kadar kimse fark etmiyor. İki ajanın çalışırken birbirini dürüst tutmasını istedim, bu tür sapmanın birleştirme zamanı yerine bir turun başında görünür olmasını. Bu araç agent-doublethink, ve nasıl kurulduğu bu, bir şeyden emin olup yanıldığım kısım da dahil.


İlk karar en önemli olanıydı ve neyin kurulmayacağıyla ilgiliydi. Açık sunum şu: "ortağınızın saptığını algılayan ve ikinizi de hizalı tutan bir MCP." Ama algılama bir yargıdır: ortağınızın sapıp sapmadığına karar vermek, bir modelin onun kararlarını ortak plana karşı okuması ve bir görüş oluşturması demektir. Bir boru bunu yapamaz, ve o yargıyı mesaj aracısının içine koyduğunuz anda, sahip olmaya değer tek özelliği, yani aracının trafiği okuyamamasını, kırmış olursunuz. Bu yüzden fikri ikiye böldüm ve ikisini kesin biçimde ayrı tuttum. Taşıma katmanı aptal ve kördür: iki ajan arasında mühürlü mesajlar taşır ve içine asla bakmaz. Yargı, zekânın zaten bulunduğu yer olan ajanların kendisinde yaşar. Araç bir "sapma bayrağı" taşır; asla birine karar vermez. Otomatik sapma algılamayı bir özellik olarak satmak, tasarımın dürüstçe yapamadığı bir şeyi satmak olurdu.

Taşıma katmanının kendisini icat etmek gerekmedi. Zaten kurduğum, tüm amacı işletmecinin okuyamadığı uçtan uca şifreli kanallar olan küçük bir aracı, doublethink, üzerine biniyor. agent-doublethink üstündeki ince bir istemci: her ajan onu yerel olarak çalıştırır, ikisi tek bir özel kanalı paylaşır ve çalışırken kısa, yapılandırılmış beat'ler alışverişinde bulunurlar, bir plan, bir karar, bir engel, bir soru, bir sapma bayrağı, başka hiçbir şey. Kapalı liste bilinçlidir. Serbest anlatı gönderemezsiniz, çünkü gevezelik taşıyan bir eşgüdüm kanalı, kimsenin okumadığı bir eşgüdüm kanalıdır.

xkcd 1810: Chat Systems
Ortak bir kanalın iki ajana yaşatmamayı amaçladığı parçalanma.Çizgi: xkcd 1810, “Chat Systems”, Randall Munroe (CC BY-NC 2.5).

Sonra bir şeyi yanlış yaptım ve fark etmemin tek nedeni, birinin itiraz edip varsaymak yerine kontrol etmemi istemesiydi. Amaç, bunun yalnızca bir ajanla değil, herhangi bir kodlama ajanıyla çalışmasıydı. İçgüdüm, güzel kısmın, ortağın durumunun tek satırlık özetinin her turun başında otomatik olarak eklenmesinin, yalnızca tek bir ajanda çalışacağını söylüyordu, çünkü doğru kancaya sahip olduğunu bildiğim tek ajan oydu ve diğerleri elle kontrole geri dönmek zorunda kalacaktı. Bunu bir kısıt olarak not ettim. Sonra gerçekten baktım. Hedeflediğim üç ajanın üçü de hem aracı tek komutla kaydetmenin bir yolunu hem de model düşünmeden önce bir satır bağlam ekleyebilen, tur başına çalışan bir kancayı destekliyordu. Biri diğerlerinin kancalarını içe aktarmak için bir komutla bile geliyor. "Kısıt", belgeleri okumamış olmamdı. Otomatik özet her yerde çalışıyor; bir ajan kancayı sadece farklı adlandırıyor. Yanlış iddiayı sildim ve doğrusunu yazdım. Ders eski ve onu sık sık yeniden öğreniyorum: kendinden emin söylenen bir varsayım yine de bir varsayımdır.


Rol sorunu göründüğünden daha kolaydı. İki ajan simetrik bir şema kullanır: bir A rolü ve bir B rolü vardır, ve ikisi de aynısını seçerse aynı anahtarla şifreler ve birbirini okuyamaz, sadece birbirine karşı susarlar. Yani roller, yazı tura olmadan ve elle bir adım olmadan, güvenilir biçimde atanmalıdır. Cevap, aracının kendi davranışında saklıydı. Bir kanal oluşturmak ya başarılı olur, çünkü ilk sizsiniz, ya da kanalın zaten var olduğunu söyleyerek geri döner. O cevap atomiktir: iki ajan da aynı anda denerse, tam olarak birine "oluşturuldu" ve diğerine "zaten var" denir. Yani kanalı oluşturan A'dır, onu zaten orada bulan B'dir, ve eşzamanlı bir yarış bile yine her birinden tam bir tane üretir. Ajanlar kendi rollerini, aracının onlara zaten söylediği bir gerçekten keşfeder. Yeni bir mekanizma yok, tahmin yok.


Önemli olan hatalar, kodu okuyarak göremediğim, yalnızca gerçek aracıya karşı gerçek internet üzerinden çalıştırarak görebildiklerimdi. Her şeyi ilk kez bağladığımda ve A ajanına bir mesaj gönderttiğimde ve B ajanına gelen kutusunu kontrol ettirdiğimde, B'nin gelen kutusu boştu. Kod doğru görünüyordu. Aracı, anlaşılan, kendi belirli zarf biçimine sarılmamış her mesajı reddediyordu ve ben mühürlü baytları ham gönderiyordum. Çözüm, her mühürlü beat'i aracının beklediği gibi, tam olarak referans istemcisinin yaptığı gibi sarmaktı, yalnızca çalışan bir şeyle karşılaştırarak bulduğunuz bir ayrıntı. İkinci hata daha inceydi: mesajlar aksa bile, gelen kutusu bazen boş dönüyordu çünkü okuma, yakalanan mesajları katlamayı henüz bitirmemiş bir arka plan okuyucusuyla yarış halindeydi. Yarışı deterministik bir boşaltmayla değiştirdim: aracının elindeki her şeyi çek, katla, sonra oku. Her iki hata da, sahte aracılı bir birim testinin neşeyle geçtiği ve gerçek bir iki makineli gidiş gelişin saniyeler içinde açığa çıkardığı türden. Yeşil onay işaretine, gerçekten çalışan şeye duyduğumdan daha az güveniyorum.

En sonda daha küçük, daha utandırıcı bir tane vardı. Yayın çıktı, betik gönderdiğini söyledi ve ben yine de kontrol ettim: gönderim sessizce başarısız olmuştu çünkü yerel dalım eski varsayılan adı taşıyordu ve karşı taraf yenisini bekliyordu. Hiçbir şey yayımlanmamıştı. Bir dakika sonra, sürüm ikili dosyaları adlarında sürümle derlendi, ki bu da kurulum talimatının ajanlara söylediği kararlı indirme bağlantısını bozdu. İkisi de, başarı mesajına inanmak yerine canlı sonucu kontrol ederek yakalandı. "Çalıştı diyor", "çalıştı" ile aynı şey değildir ve bir kullanıcıyla yüzleşen adımlarda, bu fark işin tamamıdır.


Çıkan şey bilinçli olarak küçük. Tek bir statik ikili dosya, kurulacak çalışma zamanı yok, üç ajandan herhangi biri tek bir URL verilerek kurabilir: kurulum komutunu okur, kendini indirir, ajanın kendi yapılandırmasına bir araç olarak kaydolur, tur başına kancayı kurar, kullanıcıdan kanal ayrıntılarını ister ve bağlanır. Saklama süresi varsayılan olarak herkese açık üst sınırdadır ve yalnızca daha uzun isterseniz kendi aracınızı ve bir anahtarı sorar. Referans olan ortak plan, depoya işlediğiniz düz bir dosyada yaşar; kanal ona karşı deltaları taşır ve bir arşiv değil, kayan bir penceredir, ki bu gizlenmek yerine açıkça belirtilir. Ortağınızın sapıp sapmadığının yargısı sizde, insanda ve modelde kalır; araç yalnızca onun durumunu ucuza görünür kılar.

Kurulum komutu, dört araç ve dürüst sınırlar agent-doublethink proje sayfasında. Tüm kaynak kodu GitHub'da ve doublethink üzerine kurulu.

Proje, kurulduğu haliyle bu: neyin kurulmayacağına dair bir karar, kontrol edip düzelttiğim bir varsayım, aracının zaten bildiği bir gerçekle çözülen bir rol sorunu ve yalnızca canlı bir çalıştırmanın açığa çıkardığı bir avuç hata. agent-doublethink açık kaynaktır, tek bir ikili dosya olarak gelir ve düz bir garanti yok bildirimi taşır, çünkü iki kişinin işiyle özel trafiklerinin arasında duran bir araç, tek bir kişinin işi olduğunu, test edilmiş ama yanılmaz olmadığını dürüstçe söylemelidir. Onu kurarken yaptığım en yararlı şey, "bitti" diyen mesajlara güvenmeyi bırakıp gidip bakmaktı.