[AI 에이전트 1편] 에이전트가 뭐야? — 생각하고 행동하는 ReAct
AI 에이전트 5부작의 1편. 지난 벡터DB·지식그래프 RAG 시리즈(검색→생성)에서 이어집니다. 그냥 LLM 답변과 에이전트의 차이, ReAct(Thought·Action·Observation 반복) 루프, RAG의 검색이 에이전트의 도구 하나로 들어가는 구조를 다룹니다. Claude Code·Cursor·Codex 같은 익숙한 도구가 곧 에이전트라는 점, 언제 에이전트가 과한지까지 짚습니다. 'A개체(암컷) 교배 가능?'을 Claude로 실제 실행해 단계적 사고로 쪼개고, 도구를 붙인 ReAct 루프가 실제 체중(42g)으로 판단까지 가는 과정, 도구를 두 번 호출하는 멀티스텝, 도구에 없는 건 솔직히 못 한다고 답하는 모습까지 터미널 캡처로 담았습니다. 익명 예시 개체로 게코 사육 에이전트를 단계별로 만들어 가는 시리즈의 출발점.
RAG 다음은 뭐였더라 — 이제 '행동'할 차례
지난 벡터DB·지식그래프 RAG 5부작에서는 '검색'을 깊게 팠습니다. 질문이 들어오면 관련 문서를 찾아 LLM에 건네 답을 만들었죠.
근데 검색은 정해진 한 흐름이에요. '질문 → 검색 → 답'. 중간에 LLM이 "어, 이건 체중부터 확인해야겠는데?" 하고 스스로 다른 행동을 하진 못합니다.
이번 새 시리즈 주제가 바로 그겁니다. 에이전트(Agent) — LLM이 생각하고, 필요하면 도구를 골라 행동하고, 결과를 보고 다시 생각하는 것.
RAG의 검색도 결국 에이전트가 쓰는 여러 도구 중 하나가 됩니다. 1편은 그 출발점, '에이전트가 대체 뭐냐'를 정리합니다.
5부작에서 만들 것: 1편 에이전트 기초(ReAct) → 2편 Tool use(함수 호출) → 3편 멀티스텝 → 4편 MCP → 5편 멀티에이전트. 우리 게코 사육 에이전트를 직접 만들며 단계별로 쌓습니다. LLM은 로컬 Claude CLI로 실제 실행해 캡처합니다.
그냥 LLM 답변하고 에이전트, 뭐가 다른가요?
그냥 LLM은 질문을 받으면 아는 범위에서 한 번에 답합니다. 빠르지만 모르는 사실은 추측하거나 환각하고, 도중에 자료를 가져오지 못합니다. 에이전트는 한 번 더 생각합니다. '이걸 답하려면 무엇이 필요하지?'를 따져 필요하면 도구로 조회하고, 그 결과(관찰)를 보고 다음 행동을 정하며, 목표에 닿을 때까지 이 과정을 반복합니다.
저도 처음엔 '에이전트 = 똑똑한 챗봇' 정도로 막연하게 생각했는데, 해보니 핵심은 똑똑함이 아니라 '한 번 더 생각하고, 필요하면 행동한다'는 구조더라고요.
답을 한 방에 뱉는 대신, 중간에 멈춰서 도구를 부르는 그 한 단계가 전부예요.
ReAct가 뭐길래 다들 얘기하나요?
ReAct는 Reasoning(추론) + Acting(행동)을 합친 말입니다. 에이전트가 한 턴에 끝내지 않고 Thought(생각) → Action(행동) → Observation(관찰)을 반복하는 루프입니다. 생각으로 다음 할 일을 정하고, 행동으로 도구를 부르고, 관찰로 그 결과를 받아 다시 생각합니다. 목표를 달성하면 Action 자리에서 'Final Answer'로 빠져나옵니다.
말은 거창한데 구조는 단순해요. 생각 → 행동 → 관찰을 while 루프로 돌리는 거죠.
1편에서는 이 중 '생각(Thought)'만 먼저 봅니다. 행동(Action) 자리에 진짜 도구를 꽂는 건 2편이에요.
참고로 ReAct는 2022년 구글·프린스턴 연구진 논문(ReAct: Synergizing Reasoning and Acting)에서 정리된 개념입니다. 추론만 하던 LLM에 '행동(도구 사용)'을 엮으니 답이 더 정확해지더라, 가 요지예요. 지금 나오는 거의 모든 에이전트가 이 골격 위에 서 있습니다.
사실 이미 매일 쓰고 있다고요?
ReAct 루프는 멀리 있는 개념이 아닙니다. 코드를 대신 짜주는 Claude Code나 Cursor, Codex 같은 도구가 바로 에이전트입니다. 이들은 "파일을 읽고(행동) → 결과를 보고(관찰) → 다음 수정을 생각하고(생각) → 다시 고친다"를 반복합니다. 사람이 매 단계 시키지 않아도 스스로 도구를 골라 굴러가죠. 우리가 이미 익숙하게 쓰는 그 흐름이 에이전트입니다.
솔직히 고백하면, 지금 이 블로그 글·이미지·코드도 상당 부분 에이전트(Claude)와 같이 만듭니다. ㅋㅋ 제가 "1편 강화해줘" 하면, 에이전트가 파일을 찾아 읽고(행동), 뭘 고칠지 정하고(생각), 이미지를 다시 렌더해 확인하고(관찰), 또 고치는 루프를 돌아요.
그러니 이 시리즈는 '에이전트가 뭔지'를 에이전트로 만들면서 설명하는 셈이라, 저한텐 좀 재밌는 주제입니다.
그럼 지난 RAG는 버리는 건가요?
아닙니다. RAG의 검색은 에이전트의 도구 상자 안으로 들어갑니다. RAG는 '질문 → 검색 → 생성'으로 정해진 순서를 한 번 흐르는 구조이고, 에이전트는 검색을 포함한 여러 도구(체중조회·환경체크 등)를 LLM이 스스로 골라 필요한 만큼 반복하는 구조입니다. 즉 RAG를 떼어내는 게 아니라, 더 큰 틀 안에 한 조각으로 넣는 겁니다.
실제로 2편에서 만들 게코 에이전트의 도구 중 하나가 바로 지난 시리즈에서 만든 Neo4j 의미검색(KG-RAG)입니다. 검색이 도구가 되는 거죠.
한 번에 답이 안 되는 질문을 줘보면?
"A개체(암컷), 지금 교배해도 될까?" 같은 질문은 한 방에 답하기 어렵습니다. 체중·월령·건강·환경을 다 알아야 하니까요. 그래서 같은 질문을 두 방식으로 Claude에 던져봤습니다. 그냥 한 번에 답하기, 그리고 답하기 전에 무엇을 알아내야 하는지 생각(Thought)으로 쪼개기. 차이가 분명합니다.
[A]는 일반론으로 그럴듯하게 답하지만, 정작 'A개체'가 기준을 넘는지는 모릅니다. [B]는 답을 미루는 대신 무엇을 알아내야 하는지를 정확히 쪼개고, 마지막에 "정보가 없어 판단 불가 — 도구로 조회 필요"로 끝나죠.
이 마지막 한 줄이 핵심이에요. 에이전트가 스스로 "나 지금 도구가 필요해"라고 말하는 순간. ㅎㅎ 다음 편에서 그 Thought 자리에 진짜 도구를 꽂아주면, [B]의 결론이 '실제 조회 → 판단'으로 이어집니다.
삽질 메모: 처음 claude -p로 돌렸더니 답에 "메모리·CLAUDE.md 정보가 충돌한다"는 엉뚱한 말이 섞여 나왔습니다. 알고 보니 CLI가 실행 폴더의 프로젝트 설정·메모리를 끌어와 참고한 거였어요. '일반 지식만으로 답하는 깔끔한 데모'가 목적이라, 호출을 cwd="/tmp"(빈 폴더)에서 돌리게 바꾸니 외부 컨텍스트 없이 깨끗하게 나왔습니다. 도구를 붙이기 전부터, 에이전트가 '무엇을 보고 답하는가'를 통제하는 게 중요하더라고요.
실습 — claude -p로 Thought 단계 뽑기 (셀 1)
import subprocess
# 도구는 아직 없음. '바로 답하지 말고 생각의 단계만 적어라'
prompt = """너는 레오파드게코 사육 에이전트다. 아직 조회 도구가 없다.
바로 답하지 말고, 답하려면 무엇을 알아내야 하는지
'Thought 1:', 'Thought 2:' ... 형식으로 생각만 적어라.
마지막에 '정보가 없어 판단 불가 — 도구로 조회 필요'로 끝내라.
질문: A개체(암컷), 지금 교배해도 될까?"""
out = subprocess.run(["claude", "-p", prompt],
capture_output=True, text=True, timeout=120).stdout
print(out)
# → Thought 1/2/3 ... 결론: 도구로 조회 필요
API 키 없이 로컬 Claude CLI를 추론엔진으로 썼습니다. 2편부터는 Anthropic SDK의 정식 tool_use(함수 호출)도 함께 보여주고, 이 Thought의 Action 자리에 진짜 도구를 연결합니다.
그럼 다 에이전트로 만들면 되나요?
아닙니다. 에이전트는 만능이 아니라 과할 때가 많습니다. 일반 상식 설명, 번역·요약, 창작처럼 한 번 추론으로 충분한 일은 그냥 LLM이 더 빠르고 쌉니다. 에이전트는 최신·내 데이터 조회가 필요하거나, 여러 단계를 거쳐야 하거나, 외부 행동(파일·API·DB)이 끼는 일에서 값을 합니다. 도구 루프는 그만큼 느리고 호출 비용도 더 드니까요.
기준은 간단해요. "이 질문, 내 데이터나 여러 단계가 필요해?" 아니면 그냥 LLM, 맞으면 에이전트.
"레오파드게코 적정 온도 몇 도야?"는 그냥 LLM으로 충분하고, "A개체 지금 체중 몇이고 교배 돼?"는 에이전트가 필요한 거죠.
정리
1편 핵심만 정리합니다.
- 그냥 LLM은 한 번에 답하고, 에이전트는 생각→행동→관찰을 반복합니다.
- ReAct = Reasoning + Acting. Thought·Action·Observation 루프가 에이전트의 골격입니다.
- RAG의 검색은 버리는 게 아니라, 에이전트가 쓰는 여러 도구 중 하나가 됩니다.
- 한 번에 답 못 하는 질문에서 에이전트는 먼저 '무엇을 알아내야 하나'를 생각으로 쪼갭니다.
- 단, 에이전트가 늘 정답은 아닙니다. 조회·여러 단계·외부 행동이 없으면 그냥 LLM이 더 낫습니다.
- 그 생각의 Action 자리에 진짜 도구를 꽂는 게 다음 편입니다.
여기까지가 에이전트의 개념입니다. 생각은 하는데 아직 손발(도구)이 없는 상태죠.
2편에서는 Claude에게 첫 도구 — 게코 체중조회 함수를 쥐여줍니다. [B]의 'Thought 2: 현재 체중'이 실제 숫자로 채워지는 걸 직접 돌려볼게요. ㅎㅎ
맛보기로, 도구 하나(체중조회)를 붙인 ReAct 루프를 미리 한 번 돌려봤습니다. 1편 [B]에서 "정보가 없어 판단 불가"로 끝났던 게, 도구가 생기니 실제 숫자(42g)로 판단까지 가는 걸 볼 수 있어요.
Thought(체중 확인 필요) → Action(get_gecko_weight 호출) → Observation(42g) → Final Answer(45g 미달, 증체 후 재시도)로 한 바퀴가 돕니다. 이게 1편 내내 말한 그 루프예요.
도구를 한 번만 부르고 끝나는 것도 아니에요. "A개체(암컷)랑 B개체(수컷), 둘 다 페어로 쓸 체중 돼?"처럼 물으면, 에이전트가 체중조회를 두 번 돌려(A → B) 각각의 결과를 모은 뒤 종합 판단합니다. 관찰을 보고 다음 행동을 정하는 그 루프가 그대로 반복되는 거죠.
도구를 여러 개 주고, 스스로 골라 몇 번이고 반복하게 하는 게 3편(멀티스텝)의 주제예요. 1편은 여기까지, 일단 '루프가 돈다'는 감만 잡고 갑니다. ㅎㅎ
하나 더. 도구에 없는 걸 물으면 어떻게 될까요? "케이지 온도 적당해?"라고 물어봤는데, 이 에이전트엔 온도 도구가 없거든요. 그랬더니 지어내지 않고 "온도는 못 본다, get_gecko_weight만 있다"고 솔직히 말하면서, 할 수 있는 체중 조회만 도구로 처리하더라고요.
이게 의외로 중요해요. 도구 기반 에이전트는 '아는 척'보다 '못 하는 건 못 한다'가 잘 됩니다. 환각을 줄이는 게 결국 도구를 붙이는 또 다른 이유거든요.
