AI Agents

25 min · 1,429 words

What you will be able to do
  • Define an agent as a loop, and say what ends the loop
  • Explain the difference between a single-turn LLM and a multi-turn agent
  • Say which parts of an agent run on the host machine rather than in the model
  • Explain why agents need a framework when a plain LLM call does not
  • Explain how the system prompt tells a model which tools exist

Şimdiye kadar anlattığımız her şey bu tanıma doğru ilerliyordu, ama tanım beklediğinden çok daha küçük.

Bir AI agent, aslında LLM'in hedefine ulaşana kadar tool çağırdığı bir döngüdür. LLM tool çağırmadığında ise son cevabını üretir ve döngü sona erer.

Tanım bu kadar, yine de bunu iki kez okumakta fayda var. Agent'lar hakkındaki karışıklığın çoğu, insanın bundan daha büyük bir şey beklemesinden doğuyor.

Bir hedefle döngüye girmiş bir LLM
FIG. 6.1 — Bir hedefle döngüye girmiş bir LLM

Eğrinin iki ucu da aynı cevaba varıyor. Ortadakiler ise bunun yerine bir mimari aramaya koyuluyor.

Tek turlu ve çok turlu

Asıl önemli fark şu: düz bir LLM tek turludur. Ona bir girdi verirsin, o da bir çıktı döndürür ve iş biter. LLM Temelleri modülünde anlattığımız şey tam olarak budur, yani bir modelin yapabildiği tek şey.

Bir agent ise çok turludur. Aynı modeli tekrar tekrar çağırırsın ve her seferinde model bir tool isteyebilir. İhtiyacı olan her şeyi topladığında son cevabını yazar, ama bundan önce değil.

İki durumda da model aynıdır ve modele hiçbir şey eklenmedi. Aradaki fark, onu kaç kez çağırdığında ve her seferinde ona ne gönderdiğinde yatıyor.

Bu bir agent mı?
FIG. 6.2 — Bu bir agent mı?

Evet, tanım tam olarak bu. Espri şurada: insanlar bunun daha büyük bir şey olmasını bekliyor.

Döngünün tek bir geçişi

LLM Tool Calling modülünde tek bir tool çağrısını görmüştük. Bir agent turu ise tam olarak bu çağrının tekrar tekrar yapılmasından ibarettir:

Bir agent'ın context'i
FIG. 6.3 — Bir agent'ın context'i

Tek bir geçiş şöyle işliyor: sen soruyorsun, model düşünüyor ve bir tool istiyor. Host tool'u çalıştırıp sonucu geri yazar, ardından model cevap verir. Bir sonraki geçişte bütün mesaj yığını (message stack) modele yeniden gönderilir ve artık iki mesaj daha uzundur.

Rendering FIG. 6.4

FIG. 6.4 — Döngünün tek bir geçişi

Döngüyü neyin bitirdiğine bak. Ortada bir sayaç yok ve agent'ın işinin bittiğine karar veren bir denetleyici de yok. Döngü, model tool istemeyi bıraktığı için sona erer. Yani tool çağrısının yokluğu, tam da bitiş koşulunun kendisidir. Model tool çağrısı yerine yazdığı metin ise cevaptır.

Kararın ne kadarını modele bıraktığın

"Agent" her şeyi ya da hiçbir şeyi ifade eden ikili bir kavram değil. Asıl soru, kararların ne kadarını modele devrettiğindir.

Bir ucunda düz bir LLM çağrısı var. Her kararı sen verirsin ve model yalnızca metin yazar. Ortada ise sabit iş akışları (fixed workflows) var, bunlara bazen durum makinesi (state machine) de denir. Sabit bir iş akışında adımları ve sırasını sen yazarsın, model de her adımı yalnızca doldurur. Diğer ucunda gerçek bir agent var ve orada adımları, tool'ları ve ne zaman duracağını model seçer.

Özerklik spektrumunda üç nokta
FIG. 6.5 — Özerklik spektrumunda üç nokta

Üç panelde de aynı model var. Değişen iki şey var: modelin kaç kez çağrıldığı ve bir sonraki adımı kimin seçtiği. İlk iki panelde adımı sen seçiyorsun. Üçüncüde ise adımı model seçiyor.

Üretimdeki sistemlerin çoğu spektrumun en uç noktasında durmaz ve bu genellikle doğru bir tercihtir. Daha az özerklik, işlerin ters gidebileceği daha az yol demek. LangChain'in what is an agent⁠ yazısı bu spektrumu iyi özetliyor ve modele ne kadar özgürlük vereceğine karar vermeden önce okumaya değer.

Agent döngüsü nerede çalışır?

Bu kısmı net bilmekte fayda var, çünkü insanların modelin yapamayacağı şeyleri yaptığını hayal ettiği yer tam burasıdır.

Döngünün hiçbir parçası LLM'in içinde gerçekleşmez. Hepsi host makinede çalışır, yani senin laptop'unda ya da sunucunda:

  • döngüyü çalıştırmak ve ne zaman bittiğine karar vermek
  • agent'ın hafızası olan mesaj yığınını tutmak
  • her çağrıdan önce system prompt'u oluşturmak
  • tool'ları çalıştırmak, çünkü bunlar senin Python fonksiyonların (LLM Tool Calling)
  • bir sonraki geçiş için, artık daha uzun olan tüm context'i modele geri göndermek
Maskesi indirilmiş bir agent
FIG. 6.6 — Maskesi indirilmiş bir agent

Kostümün altında prompt'lar, if-else, döngüler ve fonksiyonlardan başka bir şey yok.

Yukarıdaki liste, agent'ların neden bir framework kullandığını açıklıyor. Kavramın kendisi zor değildir, asıl sorun ise bunların hepsini elle yazmanın çok fazla boilerplate kod gerektirmesidir:

  • tool çağrılarını bir yanıttan ayıklamak
  • sonuçları çağrı id'leriyle eşleştirmek
  • mesaj yığınını büyütmek ve kısaltmak
  • prompt'u yeniden oluşturmak
  • ne zaman duracağına karar vermek

smolagents⁠ ve LangChain⁠, bu kodu bir kez yazıp herkesin kullanabilmesi için var.

Şimdi de LLM Temelleri modülüne dön. Orada bir LLM'i hiçbir framework olmadan doğrudan terminalden çalıştırmıştık. Neden bir framework'e ihtiyacımız olmadı? Çünkü ortada tek bir çağrı vardı: bir girdi gönderdin, bir çıktı aldın ve iş orada bitti. Döngü yoktu, tool ayrıştırması yoktu ve tutulacak bir mesaj yığını da yoktu. Tek turlu bir LLM, modelin etrafına yazılan bu ek koda, yani iskele koda (scaffolding) ihtiyaç duymaz. Bir agent ise neredeyse tamamen bu iskele koddan oluşur.

Serinin ana noktasına bu noktada varıyoruz: LLM gerçekten sadece bir beyin. Metin girer, metin çıkar, hiçbir şey saklamaz ve başka hiçbir şey yapmaz. Şimdiye kadar anlattığımız her yetenek, bu beynin etrafına kurulmuş bir ortamdır. Bu ortam sayesinde model şunları yapabiliyor:

LLM Temelleri modülünde işi basitleştirmiş değildik. Model gerçekten bu kadar basit ve geri kalan her şey, onun etrafındaki mühendislik.

Aynı döngü, eskiden observe, decide, act (gözlemle, karar ver, eyleme geç) diye tarif edilirdi. Model context'i gözlemler ve bir eylem seçer, host bu eylemi gerçekleştirir ve sonuç bir sonraki gözlemin parçası olur. Mekanizma aynıdır, yalnızca kelimeler daha eskidir.

LLM hangi tool'lara sahip olduğunu nasıl biliyor?

Altta yatan şey yine de tekrar tekrar çağırdığın bir LLM. Peki hangi tool'ları çağırmasına izin verildiğini nereden biliyor?

Cevap system prompt'tur. Host, döngüdeki her çağrıdan önce bunu yeniden oluşturup modele gönderir. System prompt; agent'ın rolünü, kullanılabilir tool'ların adlarını ve açıklamalarını taşır ve bir tool çağrısının nasıl biçimlendirileceğini anlatır. Böylece host çağrıyı ayrıştırabilir.

Bu listeyi elle yazman gerekmez, çünkü LLM Tool Calling modülünde anlattığımız gibi bunu @tool dekoratörü yapar. Framework, fonksiyonunun adını, docstring'ini ve type hint'lerini okur ve ardından şemayı modelin göreceği içeriğe yerleştirir. O kodun bu kadar kısa olmasının sebebi de bu. Dekoratör yalnızca fonksiyonu kaydetmekle kalmaz; framework bu sayede modele fonksiyonun var olduğunu da bildirir.

Bir örnek

"Kodumdaki hatayı düzelt" tek bir soru olmadığı için döngü birkaç kez çalışıyor:

TBL. 6.1 — Bir örnek
Geçiş Agent ne yapar LLM neden çağrılır
0 Hedef gelir henüz değil
1 İlgili dosyaları okur (read_file) hangi dosyaları açacağına karar vermek için
2 Başarısız bir test yazar kod üretmek için
3 Düzeltmeyi yazar kod üretmek için
4 Testleri çalıştırır (run_shell) komutu belirlemek için
5 Testlerin geçtiğini raporlar cevabı yazmak için. Hiçbir tool çağırmadığı için döngü sona erer

Altı geçiş, beş model çağrısı ve tek bir hedef var. Düz bir LLM ise bütün bunlar için yalnızca bir çağrı alırdı ve bu yüzden tahmin yürütmek zorunda kalırdı.

Bir agent kurmak

python
from smolagents import CodeAgent, tool, InferenceClientModel
 
@tool
def read_file(filename: str) -> str:
    """Read a file and return its contents."""
    with open(filename, 'r') as f:
        return f.read()
 
agent = CodeAgent(tools=[read_file], model=InferenceClientModel())
result = agent.run("Read main.py and summarise it")

İşte tam bir agent, ama şunların yok olduğuna dikkat et:

  • döngü yok
  • tool çağrılarını ayrıştıran kod yok
  • mesaj yığını yok
  • system prompt yok

Bunların hepsini CodeAgent yapıyor, döngünün kendisi ise agent.run.

Aynı sorunu farklı yollarla çözen başka framework'ler de var: LangChain⁠, crewAI⁠ ve AutoGen⁠. Agent Framework'leri bunları karşılaştırıyor.

LLM beyin, agent gövde
FIG. 6.7 — LLM beyin, agent gövde

LLM beyin, agent onu çevreleyen gövde, tool'lar ise ellerdir.

Özet

Bir agent, LLM'in hedefine ulaşana kadar tool çağırdığı bir döngüdür. Döngü, model tool çağırmayı bırakıp bunun yerine bir cevap yazdığında sona erer.

Model aynı kalır, ama şu parçaların hepsi senin makinende çalışır:

  • döngü
  • hafıza
  • system prompt
  • tool'ların çalıştırılması

Bunları yönetmek de framework'lerin asıl işidir ve tek turlu bir LLM'in LLM Temelleri modülünde bir framework'e ihtiyaç duymamasının sebebi de budur.

Sırada ise bir agent birden fazlaya dönüştüğünde neler olduğu var.

Hızlı Kontrol: Agent döngüsünü ne bitirir ve bir agent'ın hangi parçaları model dışında çalışır?

Kaynaklar

📄 Makaleler

🗃️ Repolar

🧭 Modüller

Want a quick quiz?4 questions on the main points of this module
Question 1 of 4

Agent döngüsünü ne bitirir?