Furkan Türkoğlu
TR EN
Tüm yazılar

LLM hakemi kullanmadan ajan doğrulama: RFC 8785 kurallı JSON ve SHA-256 parmak izi

Furkan Türkoğlu 3 dk okuma

Kod Değişmediği Halde Bozulabilen Sistemler

Klasik arka uç servislerinde Cargo.lock veya package-lock.json değişmediği sürece aynı girdinin aynı çıktıyı üretmesi beklenir. Yapay zekâ ajanlarında ise davranışın büyük bölümü uygulama kodunun dışında yaşar: model nicemleme (quantization) seviyesi, sistem istemi şablonu, sıcaklık parametresi ve dışarıdaki bir Model Context Protocol (MCP) sunucusunun sunduğu araç şemaları (inputSchema) tek satır uygulama kodu değişmeden sessizce farklılaşabilir.

Bu sürüklenmeyi başka bir dil modeline (“LLM-as-a-judge”) sorarak yakalamaya çalışmak, doğrulama katmanının kendisini olasılıksal ve pahalı hale getirir. AgentChecksum aracını tasarlarken hedefim bu yüzeyi tamamen deterministik ve dil bağımsız tutmaktı.

Neden Ham JSON Üzerinde SHA-256 Çalışmaz?

İki farklı MCP sunucusu veya yapılandırma üreticisi anlamsal olarak birebir aynı JSON şemasını farklı anahtar sırası veya boşluklarla serileştirebilir:

{"temperature": 0.0, "model": "qwen2.5-coder:14b", "top_p": 1}

Ham bayt dizisi üzerinden doğrudan SHA-256 alındığında anahtar sırasının değişmesi tamamen farklı bir özet üretir ve sürekli yanlış alarm (false positive) doğurur.

RFC 8785 (JSON Canonicalization Scheme) Katmanı

Özeti hesaplamadan önce tüm yapılandırma ağacını RFC 8785 (JCS) kurallarına göre tekil bir bayt dizisine indirgiyoruz:

  1. Nesne anahtarları UTF-16 kod birimi sırasına göre özyinelemeli olarak sıralanır.
  2. Tüm gereksiz boşluk ve satır sonları kaldırılır.
  3. Kayan noktalı sayılar (0.0 ile 0, 1e0 ile 1) IEEE 754 ECMAScript kurallı gösterimine normalize edilir.
pub fn fingerprint_surface(surface: &AgentSurface) -> Result<String, ChecksumError> {
    let value = serde_json::to_value(surface)?;
    let canonical_bytes = serde_json_canonicalizer::to_vec(&value)?;
    let digest = Sha256::digest(&canonical_bytes);
    Ok(hex::encode(digest))
}

Anlamsal Fark ve Sınırlar

Üst seviye özet değiştiğinde yalnızca “fark var” demek yeterli değildir; her alt bileşen (model, prompts, mcp_servers, tools) kendi alt özetini taşıdığı için hangi MCP aracının hangi alanının değiştiği milisaniyeler içinde raporlanır.

Bu yaklaşımın bilinçli sınırı şudur: kurallı parmak izi, sağlayıcının aynı model etiketi arkasında ağırlıkları sessizce güncellediği durumları tek başına bilemez. Bu boşluğu kapatmak için AgentChecksum, özet doğrulamasını deterministik girdi-çıktı yoklamalarıyla (probe baseline) eşleştirerek CI hattında sıfır harici servis bağımlılığıyla çalışır.