ReAct prompting adalah pola di mana model bahasa bergantian antara bernalar dan bertindak: model menulis pemikiran tentang apa yang harus dilakukan, mengambil tindakan seperti pencarian atau pemanggilan tool, membaca hasilnya, dan baru setelah itu memutuskan langkah berikutnya. Namanya adalah singkatan dari Reason + Act dan berasal dari Yao dkk. 2022, "ReAct: Synergizing Reasoning and Acting in Language Models". Pola ini tidak berhubungan dengan React, library JavaScript untuk membangun antarmuka pengguna.
Sebagian besar agen AI yang menjelajah web, menjalankan kode, atau mengedit file menjalankan suatu versi dari loop ini. Begitu kamu sudah menjalaninya secara manual, perilaku agen jadi jauh lebih mudah diprediksi dan di-debug.
Loop Thought, Action, Observation
Prompt ReAct meminta model menulis tiga jenis baris.
- Thought: penalaran tentang situasi saat ini dan informasi apa yang masih kurang.
- Action: satu pemanggilan tool dalam format yang tetap, seperti
search[query],read_file[path], ataufinish[answer]. - Observation: hasil dari action itu. Model tidak menulis baris ini. Programmu (atau kamu) menjalankan action-nya dan menambahkan output yang sebenarnya ke transkrip.
Lalu seluruh transkripnya dikirim kembali ke model, yang menulis Thought berikutnya. Loop-nya berakhir saat model memilih action finish. Model tidak pernah menjalankan tool sendiri; model hanya meminta, dan kode di sekitarnya yang memutuskan apakah permintaan itu dijalankan.
Kenapa bernalar ditambah bertindak lebih unggul daripada salah satunya saja
Paper itu membandingkan ReAct dengan prompt yang hanya bernalar (chain of thought) dan prompt yang hanya bertindak (pemanggilan tool tanpa penalaran tertulis). Pada tugas menjawab pertanyaan dan mengecek fakta dengan tool pencarian Wikipedia, penalaran saja sering membangun argumen yang meyakinkan di atas fakta yang dikarang model, sementara ReAct bisa mencari fakta itu, dan hasil menjawab pertanyaan terbaik datang dari menggabungkan ReAct dengan chain of thought, beralih dari satu ke yang lain ketika yang pertama tidak menghasilkan jawaban yang meyakinkan. Bertindak saja kesulitan memecah tujuannya dan merangkai temuannya menjadi jawaban; pemikiran yang tertulis menjaga rencananya tetap terlihat. Pada dua tugas interaktif, game rumah tangga berbasis teks dan situs belanja simulasi, ReAct yang diberi prompt dengan satu atau dua contoh tampil lebih baik daripada baseline terlatih yang dibandingkan oleh para penulisnya.
Pelajaran umumnya: chain of thought membantu model membuat rencana, tool memberinya fakta, dan tidak ada yang cukup sendirian untuk tugas yang butuh keduanya.
Agen ReAct, giliran demi giliran
Blok di bawah ini adalah agen coding kecil dengan dua tool. Setiap tab adalah percakapan yang sama satu langkah kemudian: baris-baris Observation adalah apa yang ditempel balik oleh program setelah menjalankan action sebelumnya. Baca balasannya secara berurutan.
Thought: Aku belum tahu tes mana yang gagal atau bagaimana gagalnya. Menjalankan tes akan menunjukkan assertion yang tepat sebelum aku membaca kode apa pun. Action: run_tests[tests/test_cart.py]
Perhatikan dua hal. Action pertama adalah menjalankan tes, bukan menebak: model mengumpulkan bukti sebelum membaca kode. Lalu setiap thought merujuk ke observation terakhir, dan itulah bagian yang tidak bisa dilakukan chain of thought.
Coba ReAct di aplikasi chat
Kamu tidak butuh kode untuk melihat loop-nya. Di ChatGPT, Claude, atau Gemini, kamu bisa menjadi tool-nya: model meminta sebuah action, kamu menjalankannya dan menempel balik hasilnya.
Thought: Kipas yang berbunyi keras saat laptop diam biasanya berarti ada sesuatu yang memakai CPU di latar belakang, atau kipasnya kesulitan mendinginkan (debu, ventilasi tertutup). Mengecek pemakaian CPU lebih dulu bisa memisahkan dua kemungkinan ini.
Action: Buka Task Manager (Ctrl+Shift+Esc di Windows) atau Activity Monitor (Applications > Utilities di Mac). Urutkan proses berdasarkan CPU, tunggu 30 detik, lalu beri tahu aku tiga proses teratas beserta persentase CPU-nya.
Instruksi yang sama, dengan fungsi sungguhan di balik setiap action, adalah sebuah agen.
Loop ReAct minimal di Python
Di kode, program mengirim transkripnya, mencari baris Action di balasannya, menjalankan fungsi yang sesuai, menambahkan Observation, lalu mengulanginya. Sketsa ini memakai SDK Python milik OpenAI dan prompt sistem dari agen coding di atas.
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."
Ada empat detail yang penting. Transkripnya dipotong tepat setelah Action, karena model kadang terus menulis dan mengarang Observation-nya sendiri. Tool yang gagal (misalnya nama file yang salah) menjadi Observation yang bisa ditanggapi model, alih-alih membuat loop-nya crash. Batas langkah menghentikan model yang berputar tanpa akhir. Lalu output tesnya dipangkas, karena log tes yang sangat besar akan memenuhi context window; menentukan apa yang masuk ke jendela itu adalah context engineering.
Kedua tool itu juga mengecek argumennya sebelum melakukan apa pun. Model yang memilih argumen itu, jadi tool-lah tempat yang tepat untuk batasannya: inside_project menolak path apa pun yang mengarah ke luar folder proyek (termasuk trik ../), run_tests hanya menerima file test_*.py, dan read_file hanya membuka beberapa jenis file kode dan teks dan mengembalikan maksimal 20.000 karakter, jadi file .env atau SSH key tidak pernah sampai ke permintaan berikutnya. Menjalankan pytest tetap mengeksekusi kode proyekmu sendiri, jadi jalankan agen seperti ini di dalam container atau checkout sekali pakai, jangan pernah di mesin yang menyimpan secret.
API saat ini dari OpenAI, Anthropic, dan Google juga menyediakan tool calling bawaan: kamu menjelaskan setiap tool dengan nama dan JSON schema, lalu model mengembalikan pemanggilan tool yang terstruktur alih-alih baris Action:. Loop-nya sama persis; hanya bagian parsing-nya yang hilang.
Keamanan dalam loop ReAct
Sebuah agen membaca teks yang tidak ditulisnya sendiri: halaman web, file, output tool. Semua itu bisa berisi instruksi yang ditujukan ke model, dan itulah prompt injection. Beri setiap tool akses seminimal yang dibutuhkannya (read-only kalau memungkinkan), minta manusia mengonfirmasi apa pun yang menghapus, mengirim, atau membayar, dan perlakukan action yang diminta model sebagai input tidak tepercaya yang perlu dicek, bukan perintah yang dijalankan begitu saja.
Pertanyaan yang sering diajukan
Apa itu ReAct prompting?
ReAct (singkatan dari Reason + Act) adalah pola prompting di mana model bahasa menulis sepotong penalaran singkat, lalu sebuah tindakan seperti pencarian atau pemanggilan tool, lalu membaca hasilnya sebelum bernalar lagi. Pola ini berasal dari Yao dkk. 2022, "ReAct: Synergizing Reasoning and Acting in Language Models". Pola ini sama sekali tidak berhubungan dengan library JavaScript React.
Apa itu Thought, Action, dan Observation di ReAct?
Thought adalah penalaran model tentang apa yang harus dilakukan berikutnya. Action adalah pemanggilan tool dalam format yang tetap, misalnya search[python 3.13 release notes]. Observation adalah output dari tool itu, yang didapat programmu dengan menjalankan action-nya lalu ditambahkan ke prompt. Loop-nya berulang sampai model mengambil action finish beserta jawabannya.
Apa bedanya ReAct dengan chain of thought?
Chain of thought bernalar dari apa yang sudah diketahui model, jadi fakta yang salah di awal rantai tetap salah. ReAct menyelipkan penalaran di antara tindakan-tindakan yang mengambil informasi sungguhan, jadi model bisa mengecek sebuah fakta, melihat tes yang gagal, atau membaca sebuah file sebelum melanjutkan. Paper ReAct menemukan bahwa mendasarkan penalaran pada hasil pencarian mengurangi fakta-fakta karangan yang dihasilkan chain of thought saja.
Apakah agen AI masih memakai ReAct?
Loop-nya, ya. Sebagian besar agen saat ini bernalar, memanggil tool, membaca hasilnya, lalu memutuskan lagi, dan itulah siklus ReAct. Yang berubah adalah formatnya: alih-alih mem-parse baris Action: dari teks, API saat ini punya tool calling bawaan, di mana model mengembalikan permintaan tool yang terstruktur dan kodemu mengirim balik hasilnya.
Bisakah ReAct dipakai di ChatGPT tanpa kode?
Bisa, dengan kamu sendiri yang berperan sebagai tool-nya. Minta model membalas dengan satu Thought dan satu Action lalu berhenti. Kamu yang menjalankan action-nya (mencari, membuka file, menjalankan perintah), menempel hasilnya sebagai Observation, lalu mengulanginya. Memang lambat, tapi cara ini menunjukkan dengan persis bagaimana sebuah agen memutuskan apa yang harus dilakukan berikutnya.