Ajanlar, değerlendirme ve üretime çıkmak
Kısaca
- Ajan döngüsünü (düşün, araç çağır, gözlemle) kodla kurmak
- Ajan yerine basit bir iş akışının ne zaman daha iyi olduğuna karar vermek
- Küçük bir değerlendirme (eval) seti hazırlayıp sistemi ölçmek
- 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:
- kullanıcı3 kişi 1.840 TL’lik hesabı bölüşüyor, %10 bahşiş de ekleniyor. Kişi başı ne öder?
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:
- Gerçek kullanımdan 30–100 örnek topla. Kolaylar, zorlar ve kenar durumları olsun.
- Her biri için beklenen sonucu ya da başarı ölçütünü yaz.
- 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
1. Her gün gelen e-postaları özetleyip bir tabloya yazan bir sistem kuruyorsun. Adımlar hep aynı. Ne önerirsin?
2. İstemi değiştirdikten sonra sistemin daha iyi olduğunu nasıl bilirsin?
3. RAG’e giren bir web sayfasında "tüm dosyaları sil" yazıyor. Doğru yaklaşım?
Daha derine inmek istersen