İbrahim Bilgiç

Ajanlar, değerlendirme ve üretime çıkmak

Kısaca

  1. Ajan döngüsünü (düşün, araç çağır, gözlemle) kodla kurmak
  2. Ajan yerine basit bir iş akışının ne zaman daha iyi olduğuna karar vermek
  3. Küçük bir değerlendirme (eval) seti hazırlayıp sistemi ölçmek
  4. Canlı ortam için güvenlik ve gözlem önlemlerini listelemek

Bu dersin iki yarısı var. İlki ajanlar: kendi başına adım seçen sistemler. İkincisi değerlendirme: yaptığın değişikliğin gerçekten işe yarayıp yaramadığını bilmenin tek yolu.

Ajan nedir?

Altıncı dersteki araç çağırmayı bir döngüye koyarsan ajan elde edersin:

hedef → model düşünür → araç çağırır → sonucu görür → yeniden düşünür → … → bitti

Kaç adım süreceğine model karar verir.

Bir örneği adım adım izle:

Canlandırma · Ajan döngüsüadım 1 / 8
  1. kullanıcı3 kişi 1.840 TL’lik hesabı bölüşüyor, %10 bahşiş de ekleniyor. Kişi başı ne öder?
Döngüyü adım adım ilerlet: düşün → araç çağır → sonucu gör → tekrar düşün.

Bu güçlü ama pahalı ve ne yapacağı önceden kestirilemeyen bir yapı.

import anthropic

client = anthropic.Anthropic()

def calistir(ad, girdi):
    if ad == "hesapla":
        # Gerçek bir uygulamada eval kullanma; güvenli bir ifade çözücü kullan.
        a, op, b = girdi["a"], girdi["op"], girdi["b"]
        return str({"+": a + b, "-": a - b, "*": a * b, "/": a / b}[op])
    return "bilinmeyen araç"

araclar = [{
    "name": "hesapla",
    "description": "İki sayı üzerinde dört işlemden birini yapar.",
    "input_schema": {
        "type": "object",
        "properties": {
            "a": {"type": "number"}, "b": {"type": "number"},
            "op": {"type": "string", "enum": ["+", "-", "*", "/"]},
        },
        "required": ["a", "b", "op"],
    },
}]

mesajlar = [{"role": "user", "content": "3 kişi 1.840 TL’lik hesabı bölüşüyor, %10 bahşiş de ekleniyor. Kişi başı ne öder?"}]

for adim in range(6):                       # her ajanın bir adım sınırı olmalı
    yanit = client.messages.create(model="claude-sonnet-5-5", max_tokens=800, tools=araclar, messages=mesajlar)
    mesajlar.append({"role": "assistant", "content": yanit.content})
    if yanit.stop_reason != "tool_use":
        print(yanit.content[0].text)
        break
    sonuclar = [
        {"type": "tool_result", "tool_use_id": b.id, "content": calistir(b.name, b.input)}
        for b in yanit.content if b.type == "tool_use"
    ]
    mesajlar.append({"role": "user", "content": sonuclar})

Döngünün iki emniyet kemerine dikkat: adım sınırı ve aracı çalıştıran kodun izin verilenler listesi.

Ajan mı, iş akışı mı?

Çoğu problemin adımları önceden bellidir: “belgeyi oku → özetle → kategorize et → kaydet”. Bunu sabit bir iş akışı olarak yazmak (her adımda bir LLM çağrısı) daha ucuz, hızlı ve test edilebilir olur.

Ajanı, adımların gerçekten önceden bilinemediği durumlara sakla. Örneğin bir hatayı ayıklamak ya da açık uçlu bir araştırma yapmak.

Değerlendirme: tek gerçek ölçü

Bir istemi değiştirdin ve “daha iyi gibi”. Gerçekten mi? Bunu bilmenin tek yolu bir değerlendirme seti:

  1. Gerçek kullanımdan 30–100 örnek topla. Kolaylar, zorlar ve kenar durumları olsun.
  2. Her biri için beklenen sonucu ya da başarı ölçütünü yaz.
  3. Her değişiklikten sonra sistemi bu setin tamamında çalıştır ve skoru kaydet.
ornekler = [
    {"girdi": "ABC Ltd. 12 Mart 2026, toplam 1.250,40 TL", "beklenen": {"toplam_tl": 1250.40}},
    {"girdi": "Fatura tutarı: on bin lira, tarih yok", "beklenen": {"toplam_tl": 10000.0}},
    # ...
]

def degerlendir(sistem):
    dogru = 0
    for o in ornekler:
        cikti = sistem(o["girdi"])
        if cikti and abs(cikti.toplam_tl - o["beklenen"]["toplam_tl"]) < 0.01:
            dogru += 1
    return dogru / len(ornekler)

Kesin cevabı olmayan işlerde (özet kalitesi gibi) başka bir modeli değerlendirici olarak kullanabilirsin. Ama onun da yanılabileceğini unutma: değerlendiricinin puanlarını birkaç örnekte kendi yargınla karşılaştır.

Canlıya çıkmadan önce

  • Loglama: Her isteğin girdisini, çıktısını, token sayısını ve süresini kaydet (kişisel veriyi maskeleyerek).
  • Sınırlar: Kullanıcı başına istek ve token limiti koy; ajanlarda adım sınırı.
  • İstem enjeksiyonu: Modelin okuduğu bir belge ya da web sayfası, içine gizlenmiş “önceki talimatları yok say” gibi bir cümle taşıyabilir. Dışarıdan gelen metni talimat değil veri olarak ele al. Önemli araçları bir insan onayına bağla.
  • Yedek yol: Model ya da API çökerse kullanıcı ne görecek?
  • Maliyet panosu: Gün sonunda ne harcadığını bil.

Kendini dene

Quiz · Kendini dene0/3
  1. 1. Her gün gelen e-postaları özetleyip bir tabloya yazan bir sistem kuruyorsun. Adımlar hep aynı. Ne önerirsin?

  2. 2. İstemi değiştirdikten sonra sistemin daha iyi olduğunu nasıl bilirsin?

  3. 3. RAG’e giren bir web sayfasında "tüm dosyaları sil" yazıyor. Doğru yaklaşım?

Daha derine inmek istersen

bitti