Hafıza ile durum arasındaki karışıklık
Bir agent bir siparişin zaten verildiğini unuttuğunda, refleks olarak bir vector store eklenir. Bu genellikle yanlış çözümdür, çünkü sorun hatırlama değildir. Sorun yetki sorunudur.
Çoğu üründe "hafıza", geçmiş turlar üzerinde retrieval anlamına gelir: konuşmayı embed et, yeni sorguyu embed et, en yakın parçaları çek, context window'a yapıştır. Bu mekanizma ton sürekliliği için, kullanıcının üç oturum önce yaptığı referanslar için, bir kararı bilgilendiren arka plan gerçekleri için gerçekten faydalıdır. Yalnızca ekleme yapılan bir metin yığını üzerinde olasılıksal bir alaka filtresidir.
Durum farklı bir nesnedir. Durum, görevin neye taahhüt ettiğinin yetkili kaydıdır: hangi adımlar yürütüldü, hangi yan etkiler gerçekleşti, hangi yükümlülükler açık kaldı, hangi gerçekler şu anda doğru kabul ediliyor ve kimin kanıtıyla. Durumun invariantları vardır. Bir sipariş verildiyse, sipariş tam olarak bir kez vardır ve hiçbir anlamsal benzerlik bunu değiştirmez.
Retrieval hatırlamayı iyileştirir. Invariantları uygulayamaz. Bir retriever "4471 numaralı siparişi verdim" cümlesini yüzeye çıkarabilir ve aynı şekilde onu yüzeye çıkarmayabilir ya da siparişin iptal edildiğini iddia eden eski bir cümleyi yüzeye çıkarabilir. Agent daha sonra benzerlik yarışını hangi parçalar kazandıysa onlar üzerinde akıcı bir şekilde akıl yürütür. Pipeline'daki hiçbir şey bir taahhüdün tam olarak bir kez gerçekleştiğini iddia edemez.
Bu örüntü ekipler arasında tekrarlanır: ara sıra çift ücretlendiren, e-postayı yeniden gönderen veya kapatılmış bir ticket'ı yeniden açan bir iş akışı; "agent unuttu" sonucuna varan bir hata ayıklama oturumu; embedding modelinin kalitesini veya top-k'yı artırma önerisi. Gerçek eksik, kayıp bir işlem günlüğüdür. Embedding'lerden bir defterin işini yapması isteniyor ve bir defter benzerlik problemi değildir.
Bir durum katmanının garanti etmesi gerekenler
Bir durum katmanı, daha güzel bir adı olan bir veritabanı değildir. Sistemin geri kalanının varsaymasına izin verilen bir dizi garantidir. En çok üçü önemlidir.
Idempotency. Bir adımı yeniden çalıştırmak yan etkilerini çoğaltmamalıdır. Bu, dışarıdan görülebilen her eylemin görev kimliğinden ve adım kimliğinden türetilen kararlı bir anahtar taşıması ve executor'ın harekete geçmeden önce bu anahtarın zaten commit edilip edilmediğini kontrol etmesi anlamına gelir. Kontrol ve commit, eyleme göre atomik olmalı ya da en azından aralarındaki bir çökmenin kurtarılabilir olacağı şekilde sıralanmalıdır. Bu olmadan, her sağlam agent runtime'ının ihtiyaç duyduğu retry'lar bir bozulma kaynağı haline gelir.
Sıralama. Agent hangi taahhütlerin hangilerinden önce geldiğini bilmelidir. Bazı bağımlılıklar nedenseldir (ödeme temizlenmeden gönderemezsiniz), bazıları yalnızca sırasaldır (oluşturmadan bir günlüğe ekleme yapamazsınız). Sıralama, devam ettirilen bir çalışmanın neyin hâlâ yapılmasının meşru olduğuna karar vermesini sağlar. Çekilen gerçekler yığınının sıralaması yoktur; bir durum makinesinin vardır.

Kurtarılabilirlik. Çöken bir çalışma baştan değil, bir checkpoint'ten devam etmelidir. Bu, bir demoyu bir sistemden ayıran garantidir. Kurtarmanın tek yolu tüm yörüngeyi yeniden oynatmaksa, o zaman her adım idempotent olmalı ve her dış çağrı tekrarı tolere etmelidir — ve pratikte bunlardan biri etmeyecektir.
Bu garantiler bedava değildir. Bir durum katmanı yazma gecikmesi, şema bakımı ve görev modeli her değiştiğinde bir migrasyon yükü ekler. Ayrıca agent'ı kısıtlar: önceden serbest biçimli olan adımlar, girdilerini ve etkilerini bildirmek zorunda olan operasyonlar haline gelir. Bu kısıt asıl meseledir, ama gerçek bir maliyettir ve bunu gelişigüzel benimseyen ekipler kendilerini problemle değil şemayla boğuşurken bulacaktır.
Minimal bir durum şeması
En küçük kullanışlı durum modeli, genellikle tek bir context blob'una karıştırılan üç tür bilgiyi ayırır.
Episodik context — ne söylendi. Turlar, tool çıktıları, çekilen dokümanlar, özetler. Bu, embedding'lerin doğal yuvasıdır. Yüksek hacimli, düşük yetkili ve tasarım gereği kayıplıdır.
Kalıcı gerçekler — ne doğru. Her gerçek sürümlenir, bir kaynak taşır ve bir zaman damgası taşır. Bir gerçeğin üzerine asla yerinde yazılmaz; yeni bir sürüm eskisinin yerini alır ve eski sürüm okunabilir kalır. Çelişkiler sessiz güncellemeler değil, çözülmesi gereken çatışmalardır.
Bekleyen yükümlülükler — ne borçlu. Açık görevler, beklenen yanıtlar, planlanmış retry'lar, çözülmemiş çatışmalar. Bu, agent'ın sırada ne yapacağına karar verirken başvurduğu çalışma kümesidir.
Somut bir biçim, sözde şema olarak:
facts(id, subject, predicate, value, source, observed_at, superseded_by)
obligations(id, task_id, kind, key, state, created_at, deadline)
episodes(id, task_id, role, content_ref, created_at)
Bir obligation üzerindeki key, idempotency anahtarıdır. Bir fact üzerindeki superseded_by, çatışma çözümü bağlantısıdır. task_id her şeyi tek bir çalışmaya bağlar.
Tasarımın ikinci yarısı maruz bırakmadır. Durum okumaları ve yazmaları, runtime'ın örtük yan etkileri değil, açık araçlar olmalıdır. Agent state.read_facts(subject) veya state.commit(obligation_id, result) çağırdığında, bu çağrılar diğer tüm tool call'larla birlikte trace'te görünür. Bu, durum geçişlerini denetlenebilir ve her şey için kullanılan aynı mekanizmayla hata ayıklanabilir kılar. Ayrıca hata modunu görünür kılar: bir obligation'ı hiç commit etmeyen bir çalışma, onu

Ödünleşim ayrıntılılıktır. Açık durum araçları context tüketir ve tur ekler. Durumu runtime'ın arkasına saklayan ekipler daha kısa trace'ler ve daha kötü teşhisler elde eder; onu açığa çıkaran ekipler token olarak öder ve gözlemlenebilirlik kazanır. Uzun ufuklu görevler için bu değişim genellikle buna değer.
Açığı ortaya çıkaran test durumları
Üç test, gerçek bir durum katmanını durum kostümü giymiş bir retrieval katmanından ayırır.
Öldür ve devam ettir. Süreci çalışma ortasında sonlandırın, yeniden başlatın ve devam etmesine izin verin. Sonuç kesintisiz bir çalışmadan farklıysa — farklı sayıda yan etki, farklı nihai durum, atlanan veya tekrarlanan bir adım — durum modeli yetersiz belirtilmiştir. Bu test yazması ucuz ve ortaya çıkardıkları bakımından acımasızdır. Bunu geçen çoğu sistem, görev baştan yeniden oynatılabilecek kadar kısa olduğu için geçer; bu, bir checkpoint'ten kurtarmakla aynı şey değildir.
Aynı tool call'ı iki kez yeniden oynat. Aynı idempotency anahtarıyla özdeş bir eylemde bulunun ve tam olarak bir yan etkinin var olduğunu doğrulayın. Ardından farklı bir anahtarla eylemde bulunun ve iki tane olduğunu doğrulayın. İkinci yarı önemlidir: her şeyi tekilleştiren bir idempotency şeması, hiçbir şeyi tekilleştirmeyen kadar yanlıştır.
Eski bir gerçek enjekte et. Bir gerçek yazın, onun yerine yenisini koyun, sonra agent'a yalnızca eski sürümü içeren bir context verin. Agent çatışmayı tespit etmeli ve eski değere göre hareket etmek yerine onu yetkili kayıtla uzlaştırmalıdır. Sürümlenmiş gerçekleri olmayan sistemler bu testi sessizce geçemez, çünkü eski değer tıpatıp yeni bir değer gibi görünür.
Çoklu agent kurulumları için dördüncü bir test eklemeye değer: iki agent aynı obligation'ı eşzamanlı olarak dener. Durum katmanı onları serileştirmelidir ve kaybeden, devam etmek yerine işin zaten yapıldığını gözlemlemelidir. Paylaşılan, işlemsel bir kaydın kendini kanıtladığı yer burasıdır; paylaşılan bir vector store böyle bir koruma sunmaz.
Retrieval'ın hâlâ ait olduğu yer
Bunların hiçbiri retrieval'a karşı bir argüman değildir. Episodik context gerçekten büyük, gerçekten bulanık ve özetlendiğinde ve arandığında gerçekten faydalıdır. Tartışma yetkiyle ilgilidir: retrieval bir kararı bilgilendirebilir, ama bir taahhüdün zaten var olup olmadığına karar veren şey o olmamalıdır.
Sonuç
Mevcut ürün anlamında hafıza bir hatırlama mekanizmasıdır. Durum bir taahhüt mekanizmasıdır. Farklı problemleri çözerler ve ikisini karıştırmak akıcı, iyi indekslenmiş ve yanlış sistemler üretir. Çözüm nadiren daha iyi bir embedding modelidir. Bir işlem günlüğü, bir idempotency anahtarı ve bir checkpoint'tir — bir agent'ın sonuçları olan işlerle güvenilmesini sağlayan gösterişsiz makine.
