Menu

ReAct Prompting: LLM'ler İçin Düşün ve Eyle Döngüsü

ReAct prompting, modelin bir görev hakkında akıl yürütmekle bir araç çağırmak arasında gidip gelmesini ve bir sonraki adıma karar vermeden önce her sonucu okumasını sağlar. Çoğu yapay zekâ ajanının arkasındaki döngü budur.

Bu sayfadaki her istemi düzenleyebilir, sonra ChatGPT, Claude ya da başka bir yapay zekâ uygulamasında açabilirsin.

ReAct prompting, bir dil modelinin akıl yürütmekle eylemek arasında gidip geldiği bir kalıptır: ne yapacağına dair bir düşünce yazar, arama ya da araç çağrısı gibi bir eylem yapar, sonucu okur ve ancak ondan sonra sıradaki adıma karar verir. Adı Reason + Act (akıl yürüt ve eyle) ifadesinin kısaltmasıdır ve Yao ve arkadaşlarının 2022 tarihli "ReAct: Synergizing Reasoning and Acting in Language Models" makalesinden gelir. Kullanıcı arayüzü geliştirmeye yönelik JavaScript kütüphanesi React ile ilgisi yoktur.

İnternette gezinen, kod çalıştıran ya da dosya düzenleyen yapay zekâ ajanlarının çoğu bu döngünün bir sürümünü çalıştırır. Döngüyü bir kez elle yürüttüğünde ajan davranışını tahmin etmek ve hata ayıklamak çok daha kolay hâle gelir.

Thought, Action, Observation döngüsü

Bir ReAct promptu modelden üç tür satır yazmasını ister.

  • Thought (düşünce): mevcut durum ve hangi bilginin eksik olduğu hakkında akıl yürütme.
  • Action (eylem): search[query], read_file[path] ya da finish[answer] gibi sabit bir biçimde tek bir araç çağrısı.
  • Observation (gözlem): o eylemin sonucu. Bu satırı model yazmaz. Programın (ya da sen) eylemi çalıştırır ve gerçek çıktıyı döküme ekler.

Sonra bütün döküm modele geri gider ve model sıradaki düşünceyi yazar. Döngü, model bitirme eylemini seçtiğinde sona erer. Model bir aracı asla kendisi çalıştırmaz; sadece ister ve çevresindeki kod isteği yerine getirip getirmeyeceğine karar verir.

Akıl yürütme artı eylem neden ikisinden de iyi

Makale ReAct'i sadece akıl yürüten promptlarla (chain of thought) ve sadece eylem yapan promptlarla (yazılı akıl yürütme olmadan araç çağrıları) karşılaştırdı. Wikipedia arama aracıyla soru cevaplama ve bilgi doğrulamada, tek başına akıl yürütme çoğu zaman modelin uydurduğu bir bilginin üzerine kendinden emin bir argüman kurdu, ReAct ise bilgiye bakabildi; en iyi soru cevaplama sonuçları ise ReAct'i chain of thought ile birleştirmekten geldi, ilki kendinden emin bir cevap üretmediğinde diğerine geçilerek. Tek başına eylem hedefi parçalara ayırmakta ve bulduklarını bir cevapta toplamakta zorlandı; yazılı düşünceler planı görünür tuttu. İki etkileşimli görevde, metin tabanlı bir ev işleri oyununda ve simüle edilmiş bir alışveriş sitesinde, bir iki örnekle prompt edilen ReAct, yazarların karşılaştırdığı eğitilmiş temel modellerden daha iyi sonuç verdi.

Genel ders: chain of thought bir modelin plan yapmasına yardım eder, araçlar ona bilgi verir ve ikisini birden gerektiren bir görev için hiçbiri tek başına yetmez.

Tur tur bir ReAct ajanı

Aşağıdaki blok iki aracı olan küçük bir kodlama ajanı. Her sekme aynı sohbetin bir adım sonrası: Observation satırları, program bir önceki eylemi çalıştırdıktan sonra geri yapıştırdığı şeyler. Yanıtları sırayla oku. Thought:, Action: ve Observation: etiketlerini İngilizce bıraktık, çünkü sayfanın aşağısındaki Python döngüsü tam olarak bu etiketleri arıyor; Türkçe etiket kullanırsan koddaki düzenli ifadeyi de aynı şekilde değiştir.

System prompt
Görevi Thought, Action ve Observation adımlarını tekrarlayarak çöz. Thought: ne bildiğin ve sıradaki adım hakkında akıl yürüt. Action: şunlardan tam olarak biri run_tests[path] bir dosya üzerinde pytest çalıştırır ve çıktıyı döndürür read_file[path] bir dosyanın içeriğini döndürür finish[answer] görevi cevabınla bitirir Bir Thought ve bir Action yaz, sonra dur. Observation sana verilecek.
Görev: tests/test_cart.py dünkü merge'den sonra başarısız olmaya başladı. Sebebini bul.
Try it
Chat apps receive the system prompt as the start of your message, so this tries its wording, not its priority. To test it as standing instructions, put it in the app's custom instructions or the API's system field.
Example replyReplies vary between models and runs.

Thought: Hangi testin nasıl başarısız olduğunu bilmiyorum. Testleri çalıştırmak, herhangi bir kodu okumadan önce tam olarak hangi assertion'ın patladığını gösterir. Action: run_tests[tests/test_cart.py]

İki şeye dikkat et. İlk eylem bir tahmin değil, bir test çalıştırması: model kodu okumadan önce kanıt topladı. Ve her düşünce en son gözleme atıfta bulunuyor; chain of thought'un yapamadığı kısım bu.

ReAct'i bir sohbet uygulamasında dene

Döngüyü görmek için koda ihtiyacın yok. ChatGPT, Claude ya da Gemini'de aracı sen olabilirsin: model bir eylem ister, sen onu yaparsın ve sonucu geri yapıştırırsın. Bu promptu bir kod okumadığı için etiketleri Türkçe yazdık.

Modelin araçları sen ol
Fill in
Şu soruyu cevaplamak istiyorum: Hiçbir şey yapmıyorken bile dizüstü bilgisayarımın fanı neden yüksek sesle çalışıyor? Bir döngü içinde çalışarak bana yardım et. Her yanıtında tam olarak bir Düşünce (şu ana kadar ne bildiğin ve neyin eksik olduğu) ve bir Eylem olsun: benim kontrol etmem, çalıştırmam ya da bakmam gereken belirli bir şey, adımlarıyla birlikte. Sonra dur ve bekle. Sonucu "Gözlem: ..." şeklinde yazacağım. Yeterli kanıtın olduğunda "Cevap:" ile başlayıp sonucunu yaz. Kanıtın olmadan bir cevap tahmin etme.
Try it
Example replyReplies vary between models and runs.

Düşünce: Boştayken yüksek sesli bir fan genellikle arka planda bir şeyin işlemciyi kullandığı ya da fanın soğutmakta zorlandığı (toz, tıkalı hava delikleri) anlamına gelir. Önce işlemci kullanımına bakmak bu iki durumu birbirinden ayırır.

Eylem: Görev Yöneticisi'ni (Windows'ta Ctrl+Shift+Esc) ya da Etkinlik Monitörü'nü (Mac'te Uygulamalar > İzlenceler) aç. İşlemleri CPU'ya göre sırala, 30 saniye bekle ve bana ilk üç işlemi ve CPU yüzdelerini söyle.

Aynı talimatlar, her eylemin arkasında gerçek bir fonksiyonla, bir ajandır.

Python'da minimal bir ReAct döngüsü

Kodda program dökümü gönderir, yanıttaki Action satırını bulur, eşleşen fonksiyonu çalıştırır, Observation'ı ekler ve tekrarlar. Bu taslak OpenAI Python SDK'sını ve yukarıdaki kodlama ajanının sistem promptunu kullanıyor.

import re
import subprocess
from pathlib import Path
from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list
PROJECT = Path.cwd().resolve()
READABLE = {".py", ".md", ".txt", ".toml", ".cfg"}

def inside_project(arg):
    # The model chooses arg: resolve it and refuse anything outside the project.
    path = (PROJECT / arg).resolve()
    if not path.is_relative_to(PROJECT):
        raise ValueError(f"{arg} is outside the project")
    return path

def run_tests(arg):
    path = inside_project(arg)
    if not (path.is_file() and path.name.startswith("test_") and path.suffix == ".py"):
        raise ValueError(f"{arg} is not a test file")
    result = subprocess.run(["pytest", str(path), "-q"], capture_output=True, text=True)
    return result.stdout[-2000:]

def read_file(arg):
    path = inside_project(arg)
    if not path.is_file() or path.suffix not in READABLE:
        raise ValueError(f"{arg} is not a file this agent may read")
    return path.read_text()[:20000]

TOOLS = {"run_tests": run_tests, "read_file": read_file}

def react(task, system_prompt, max_steps=8):
    transcript = f"Task: {task}\n"
    for _ in range(max_steps):
        response = client.chat.completions.create(
            model=MODEL,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": transcript},
            ],
            temperature=0,
        )
        text = response.choices[0].message.content
        match = re.search(r"Action: (\w+)\[(.*)\]", text)
        if not match:
            return text
        transcript += text[: match.end()] + "\n"
        tool, arg = match.groups()
        if tool == "finish":
            return arg
        try:
            observation = TOOLS[tool](arg) if tool in TOOLS else f"Unknown tool: {tool}"
        except Exception as error:  # a missing file becomes an observation, not a crash
            observation = f"Error: {error}"
        transcript += f"Observation:\n{observation}\n"
    return "Stopped after max_steps without an answer."

Dört ayrıntı önemli. Döküm Action satırının hemen ardından kesilir, çünkü modeller bazen yazmaya devam edip kendi Observation'larını uydurur. Başarısız bir araç (örneğin yanlış bir dosya adı) döngüyü çökertmek yerine modelin tepki verebileceği bir Observation'a dönüşür. Adım sınırı sonsuza kadar dönen bir modeli durdurur. Ve test çıktısı kırpılır, çünkü devasa bir test logu bağlam penceresini doldurur; o pencereye neyin gireceğine karar vermek bağlam mühendisliğidir.

İki araç da bir şey yapmadan önce argümanını kontrol eder. Bu argümanı model seçer, bu yüzden sınırların yeri araçtır: inside_project, proje klasörünün dışına çıkan her yolu reddeder (../ hileleri dahil), run_tests yalnızca test_*.py dosyalarını kabul eder, read_file ise yalnızca birkaç kod ve metin dosyası türünü açar ve en fazla 20.000 karakter döndürür; böylece bir .env dosyası ya da SSH anahtarı bir sonraki isteğe asla ulaşmaz. pytest çalıştırmak yine de projenin kendi kodunu çalıştırır, bu yüzden böyle bir ajanı bir konteynerde ya da atılabilir bir kopyada çalıştır, gizli bilgi barındıran bir makinede asla.

OpenAI, Anthropic ve Google'ın güncel API'leri yerleşik araç çağırma da sunuyor: her aracı bir ad ve bir JSON şemasıyla tarif edersin ve model bir Action: satırı yerine yapılandırılmış bir araç çağrısı döndürür. Döngü aynıdır; sadece ayrıştırma ortadan kalkar.

Bir ReAct döngüsünde güvenlik

Bir ajan kendi yazmadığı metinleri okur: web sayfaları, dosyalar, araç çıktıları. Bunların herhangi biri modele yönelik talimatlar içerebilir; buna prompt injection denir. Her araca ihtiyaç duyduğu en az erişimi ver (mümkünse salt okunur), silen, gönderen ya da ödeme yapan her şey için bir insanın onayını iste ve modelin istediği eylemleri körü körüne çalıştırılacak komutlar olarak değil, kontrol edilecek güvenilmez girdiler olarak gör.

Sıkça Sorulan Sorular

ReAct prompting nedir?

ReAct (Reason + Act, yani akıl yürüt ve eyle kelimelerinin kısaltması), bir dil modelinin kısa bir akıl yürütme, ardından arama ya da araç çağrısı gibi bir eylem yazdığı, sonra tekrar akıl yürütmeden önce sonucu okuduğu bir prompt kalıbıdır. Yao ve arkadaşlarının 2022 tarihli "ReAct: Synergizing Reasoning and Acting in Language Models" makalesinden gelir. React JavaScript kütüphanesiyle hiçbir ilgisi yoktur.

ReAct'te Thought, Action ve Observation nedir?

Thought (düşünce), modelin sıradaki adım hakkındaki akıl yürütmesidir. Action (eylem), sabit bir biçimdeki araç çağrısıdır, örneğin search[python 3.13 release notes]. Observation (gözlem) ise aracın çıktısıdır; programın eylemi çalıştırarak onu alır ve prompta ekler. Döngü, model cevabıyla birlikte bir bitirme eylemi seçene kadar tekrarlanır.

ReAct ile chain of thought arasındaki fark nedir?

Chain of thought modelin zaten bildiklerinden akıl yürütür, bu yüzden zincirin başındaki yanlış bir bilgi yanlış kalır. ReAct akıl yürütmeyi gerçek bilgi getiren eylemlerle iç içe geçirir, böylece model devam etmeden önce bir bilgiyi kontrol edebilir, bir testin başarısız olduğunu görebilir ya da bir dosyayı okuyabilir. ReAct makalesi akıl yürütmeyi arama sonuçlarına dayandırmanın, tek başına chain of thought'un ürettiği uydurma bilgileri azalttığını buldu.

Yapay zekâ ajanları hâlâ ReAct kullanıyor mu?

Döngüyü evet. Bugün çoğu ajan akıl yürütür, bir araç çağırır, sonucu okur ve yeniden karar verir; bu ReAct döngüsüdür. Değişen biçimdir: metinden Action: satırlarını ayrıştırmak yerine güncel API'lerde yerleşik araç çağırma (tool calling) var; model yapılandırılmış bir araç isteği döndürür ve kodun sonucu geri gönderir.

ReAct'i ChatGPT'de kod yazmadan kullanabilir miyim?

Evet, aracı kendin oynayarak. Modelden bir düşünce ve bir eylemle cevap verip durmasını iste. Eylemi sen yaparsın (arama, dosya açma, komut çalıştırma), sonucu gözlem olarak yapıştırırsın ve tekrarlarsın. Yavaştır, ama bir ajanın sıradaki adıma nasıl karar verdiğini tam olarak gösterir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA