Garfield
YZF Admin
İşlem tekrarını önlemek için ajanın yalnızca komutunu değil, işlem kimliğini, mevcut durumu ve son başarılı sonucu kontrol etmesini sağlayın. Her mantıksal işlem için bir kez benzersiz anahtar üretip aynı işlemin bütün denemelerinde bu anahtarı koruyun; işlem daha önce tamamlandıysa aracı yeniden çağırmak yerine mevcut sonucu döndürün. Buna ek olarak araç çağrılarına net bitiş koşulu, deneme sınırı ve durum doğrulaması koyarsanız ajan aynı işi sonsuz döngüye sokmadan durur.
Ajanın aynı işlemi tekrarlaması genellikle üç farklı durumdan kaynaklanır. Araç çağrısının sonucu ajana aktarılmıyorsa ajan görevin tamamlanmadığını sanabilir. İşlem başarılı olduğu hâlde durum kaydedilmiyorsa bir sonraki turda aynı isteği yeniden gönderebilir. Araç hata döndürdüğünde ise hata türü ayrılmadığı için geçici bir ağ hatasıyla kalıcı bir doğrulama hatasını aynı şekilde tekrar deneyebilir.
Bu nedenle yalnızca "aynı işlemi yapma" talimatı vermek yeterli değildir. Ajanın her adımda şu sorulara cevap verebilmesi gerekir: Bu işlem hangi nesne için yapılıyor? Daha önce başlatıldı mı? Başarıyla tamamlandı mı? Tekrar denenmesi güvenli mi? İşlem tamamlandıysa hangi kanıtla durulacak?
İdempotent işlem, aynı istek birden fazla gönderilse bile sonucu bir kez uygulanmış gibi kalan işlemdir. Örneğin bir müşteriye aynı e-postayı her çağrıda yeniden göndermek idempotent değildir; fakat belirli bir
Ajanın araç talimatına varsayımsal olarak şu kuralları ekleyebilirsiniz:
İlk çağrıda çıktı
Sohbet geçmişinde bir aracın daha önce çağrılmış olması, işlemin gerçekten tamamlandığını kanıtlamaz. Ajan yeniden başlatılabilir, geçmiş kısaltılabilir veya araç çağrısı zaman aşımına uğrayabilir. Bu yüzden kritik durumları veritabanı, iş kuyruğu ya da güvenilir bir durum deposunda tutun.
Kaydedilecek en az bilgiler şunlardır:
Tablodaki kayıt, ajanın karar verebilmesi için yeterli olmalı; hassas verileri gereksiz yere saklamamalıdır. Özellikle araç çıktısını tanılama amacıyla ayrıntılı kaydediyorsanız erişimi sınırlayın ve geçici hata günlüklerini iş tamamlandıktan sonra temizleyin.
Ajanın sistem veya görev talimatında, başarılı sonucu gördüğünde duracağı açıkça belirtilmelidir. Aşağıdaki örnek varsayımsaldır ve kullandığınız otomasyon aracının kendi alan adlarına göre uyarlanmalıdır:
Buradaki en önemli ayrım, zaman aşımından sonra işlemi körlemesine yeniden göndermemektir. Zaman aşımı, işlemin başarısız olduğunu kanıtlamaz; yalnızca yanıtın zamanında alınamadığını gösterir. Önce işlem kimliğiyle durum sorgulanmalı, işlem kimliği yoksa aynı isteğin güvenle tekrarlanıp tekrarlanamayacağı belirlenmelidir.
Her araç farklı biçimde yanıt verirse ajan sonucu yanlış yorumlayabilir. Yazma yapan araçların mümkün olduğunca şu alanları döndürmesi tekrarları azaltır:
Ajan durduğunda yalnızca "başarılı" metnine güvenmeyin. Yazma işleminden sonra ayrı bir okuma veya durum sorgulama adımıyla beklenen değişikliği doğrulayın. Örneğin bir kaydın durumu güncellendiyse yanıtın içinde doğru kayıt kimliğinin ve yeni durumun bulunduğunu kontrol edin.
Tekilleştirmeyi yalnız araç yanıtındaki kimliğe bakarak değerlendirmeyin; her denemede yeni bir çağrı kimliği üretilebilir. Aynı anahtarla tekrarda dış sistemde ikinci sipariş, ödeme veya mesaj gibi yeni bir yan etki oluşmadığını ve önceki iş sonucunun kullanıldığını doğrulayın. İşlem durumu sürekli
Ayrıca yalnızca model talimatıyla güvenlik sağlamaya çalışmayın. Ajan bir dil modeli olduğu için aynı talimatı farklı yorumlayabilir. Yerel depoda anahtarı atomik olarak ayırmak eşzamanlı çalışanları sınırlar; dış işlemle yerel sonuç kaydını kendiliğinden tek işlem hâline getirmez. Dış işlem başarılı olup sonuç kaydedilmeden süreç çökerse yeni bir yazma başlatmayın. Dış servisin idempotency desteğiyle aynı anahtarı kullanın veya işlemi güvenilir durum sorgusuyla uzlaştırın; sonuç belirlenemiyorsa belirsiz durumu koruyun.
Tekrarın temel nedenini ayırın
Ajanın aynı işlemi tekrarlaması genellikle üç farklı durumdan kaynaklanır. Araç çağrısının sonucu ajana aktarılmıyorsa ajan görevin tamamlanmadığını sanabilir. İşlem başarılı olduğu hâlde durum kaydedilmiyorsa bir sonraki turda aynı isteği yeniden gönderebilir. Araç hata döndürdüğünde ise hata türü ayrılmadığı için geçici bir ağ hatasıyla kalıcı bir doğrulama hatasını aynı şekilde tekrar deneyebilir.
Bu nedenle yalnızca "aynı işlemi yapma" talimatı vermek yeterli değildir. Ajanın her adımda şu sorulara cevap verebilmesi gerekir: Bu işlem hangi nesne için yapılıyor? Daha önce başlatıldı mı? Başarıyla tamamlandı mı? Tekrar denenmesi güvenli mi? İşlem tamamlandıysa hangi kanıtla durulacak?
İdempotent işlem ve işlem anahtarı kullanın
İdempotent işlem, aynı istek birden fazla gönderilse bile sonucu bir kez uygulanmış gibi kalan işlemdir. Örneğin bir müşteriye aynı e-postayı her çağrıda yeniden göndermek idempotent değildir; fakat belirli bir
sipariş_id + işlem_türü anahtarıyla "bu sipariş için bildirim gönderildi" kaydı oluşturmak tekrarları engelleyebilir.Ajanın araç talimatına varsayımsal olarak şu kuralları ekleyebilirsiniz:
- Her görev için
task_idveyaidempotency_keyüret. - İşlem başlamadan önce bu anahtarla daha önce başarılı kayıt olup olmadığını kontrol et.
- Başarılı kayıt varsa aracı yeniden çalıştırma; mevcut sonucu döndür.
- Başarılı kayıt yoksa işlemi başlat ve sonucu kalıcı olarak kaydet.
- Aynı anahtar için işlem sürüyorsa yeni işlem başlatma; mevcut işlemin durumunu sorgula.
Kod:
{
"order_id": "S-1042",
"operation": "mark_as_shipped",
"idempotency_key": "S-1042:mark_as_shipped"
}
İlk çağrıda çıktı
status=completed ve operation_id=OP-88 ise bu bilgiler kaydedilir. Ajan aynı görevi tekrar değerlendirdiğinde S-1042:mark_as_shipped anahtarını bulur ve yeni güncelleme göndermek yerine already_completed sonucunu döndürür. Bu çıktı, işlemin yeniden yapılmadığını; daha önceki başarılı sonucun kullanıldığını gösterir.Durum kaydı ile sohbet geçmişini karıştırmayın
Sohbet geçmişinde bir aracın daha önce çağrılmış olması, işlemin gerçekten tamamlandığını kanıtlamaz. Ajan yeniden başlatılabilir, geçmiş kısaltılabilir veya araç çağrısı zaman aşımına uğrayabilir. Bu yüzden kritik durumları veritabanı, iş kuyruğu ya da güvenilir bir durum deposunda tutun.
Kaydedilecek en az bilgiler şunlardır:
| Alan | Amacı |
|---|---|
| İşlem anahtarı | Aynı isteğin tekrarını tanımak. |
| İşlem durumu | Bekliyor, sürüyor, tamamlandı veya başarısız ayrımını yapmak. |
| Araç işlem kimliği | Sonucu daha sonra sorgulamak ve doğrulamak. |
| Sonuç özeti | Ajanın aynı işlemi yeniden başlatmadan kullanıcıya yanıt vermesini sağlamak. |
| Son deneme zamanı ve sayısı | Sonsuz tekrarları sınırlamak ve sorun çözümünü kolaylaştırmak. |
Ajan talimatına açık durma koşulları ekleyin
Ajanın sistem veya görev talimatında, başarılı sonucu gördüğünde duracağı açıkça belirtilmelidir. Aşağıdaki örnek varsayımsaldır ve kullandığınız otomasyon aracının kendi alan adlarına göre uyarlanmalıdır:
Kod:
1. İşlem anahtarını oluştur.
2. Aynı anahtar için tamamlanmış kayıt ara.
3. Kayıt varsa hiçbir yazma aracını çağırma; mevcut sonucu döndür.
4. Kayıt yoksa işlemi bir kez başlat.
5. Araç sonucunu işlem kimliğiyle kaydet.
6. İşlem tamamlandıysa görevi bitir.
7. Sonuç belirsizse aynı yazma işlemini tekrarlama; işlem durumunu sorgula.
8. En fazla 3 denemeden sonra dur ve belirsiz durumu bildir.
Buradaki en önemli ayrım, zaman aşımından sonra işlemi körlemesine yeniden göndermemektir. Zaman aşımı, işlemin başarısız olduğunu kanıtlamaz; yalnızca yanıtın zamanında alınamadığını gösterir. Önce işlem kimliğiyle durum sorgulanmalı, işlem kimliği yoksa aynı isteğin güvenle tekrarlanıp tekrarlanamayacağı belirlenmelidir.
Araç çıktısını standartlaştırın
Her araç farklı biçimde yanıt verirse ajan sonucu yanlış yorumlayabilir. Yazma yapan araçların mümkün olduğunca şu alanları döndürmesi tekrarları azaltır:
Kod:
{
"ok": true,
"status": "completed",
"operation_id": "OP-88",
"idempotency_key": "S-1042:mark_as_shipped",
"retryable": false,
"message": "İşlem daha önce tamamlandığı için yeniden uygulanmadı."
}
status=completed işlemin tamamlandığını, status=running devam eden bir işlem bulunduğunu, status=failed ise hata oluştuğunu belirtir. retryable=true yalnızca geçici ve güvenle yeniden denenebilecek hatalarda kullanılmalıdır. Yetki, veri biçimi veya iş kuralı hatalarında tekrar denemek sorunu çözmez; eksik bilgi düzeltilmelidir.Sonucu nasıl kontrol edeceksiniz?
Ajan durduğunda yalnızca "başarılı" metnine güvenmeyin. Yazma işleminden sonra ayrı bir okuma veya durum sorgulama adımıyla beklenen değişikliği doğrulayın. Örneğin bir kaydın durumu güncellendiyse yanıtın içinde doğru kayıt kimliğinin ve yeni durumun bulunduğunu kontrol edin.
Tekilleştirmeyi yalnız araç yanıtındaki kimliğe bakarak değerlendirmeyin; her denemede yeni bir çağrı kimliği üretilebilir. Aynı anahtarla tekrarda dış sistemde ikinci sipariş, ödeme veya mesaj gibi yeni bir yan etki oluşmadığını ve önceki iş sonucunun kullanıldığını doğrulayın. İşlem durumu sürekli
running kalıyorsa ajanı yeniden başlatmak yerine kuyruğu, işlem kimliğini ve son araç çıktısını kontrol edin; gerekirse aynı yazma çağrısını değil, durum sorgusunu tekrarlayın.Ayrıca yalnızca model talimatıyla güvenlik sağlamaya çalışmayın. Ajan bir dil modeli olduğu için aynı talimatı farklı yorumlayabilir. Yerel depoda anahtarı atomik olarak ayırmak eşzamanlı çalışanları sınırlar; dış işlemle yerel sonuç kaydını kendiliğinden tek işlem hâline getirmez. Dış işlem başarılı olup sonuç kaydedilmeden süreç çökerse yeni bir yazma başlatmayın. Dış servisin idempotency desteğiyle aynı anahtarı kullanın veya işlemi güvenilir durum sorgusuyla uzlaştırın; sonuç belirlenemiyorsa belirsiz durumu koruyun.
Son düzenleme: