HSEOM GeckoHSEOM
Instagram

흑섬 TECH 블로그 - 데이터 기반 브리딩 기술

레오파드게코 브리딩에 데이터 분석과 AI 기술을 접목합니다. Python, NumPy를 활용한 체중 관리, 성장 추이 분석, 환경 데이터 시각화 등 실무에서 직접 사용하는 기술을 일반인도 이해하기 쉽게 설명합니다.

주요 카테고리

AI 카테고리

AI와 머신러닝을 활용한 레오파드게코 브리딩 기술과 데이터 분석 방법을 공유합니다.

44개의 글이 있습니다.

[AI 에이전트 1편] 에이전트가 뭐야? — 생각하고 행동하는 ReAct

AI 에이전트 5부작의 1편. 지난 벡터DB·지식그래프 RAG 시리즈(검색→생성)에서 이어집니다. 그냥 LLM 답변과 에이전트의 차이, ReAct(Thought·Action·Observation 반복) 루프, RAG의 검색이 에이전트의 도구 하나로 들어가는 구조를 다룹니다. Claude Code·Cursor·Codex 같은 익숙한 도구가 곧 에이전트라는 점, 언제 에이전트가 과한지까지 짚습니다. 'A개체(암컷) 교배 가능?'을 Claude로 실제 실행해 단계적 사고로 쪼개고, 도구를 붙인 ReAct 루프가 실제 체중(42g)으로 판단까지 가는 과정, 도구를 두 번 호출하는 멀티스텝, 도구에 없는 건 솔직히 못 한다고 답하는 모습까지 터미널 캡처로 담았습니다. 익명 예시 개체로 게코 사육 에이전트를 단계별로 만들어 가는 시리즈의 출발점.

카테고리: AI

작성일: 2026-06-16

예상 읽기 시간: 22

Back to Tech
AI·22min read·

[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은 질문을 받으면 아는 범위에서 한 번에 답합니다. 빠르지만 모르는 사실은 추측하거나 환각하고, 도중에 자료를 가져오지 못합니다. 에이전트는 한 번 더 생각합니다. '이걸 답하려면 무엇이 필요하지?'를 따져 필요하면 도구로 조회하고, 그 결과(관찰)를 보고 다음 행동을 정하며, 목표에 닿을 때까지 이 과정을 반복합니다.

그냥 LLM 답변(한 번에 답) vs 에이전트(생각·행동·관찰 반복) 비교

저도 처음엔 '에이전트 = 똑똑한 챗봇' 정도로 막연하게 생각했는데, 해보니 핵심은 똑똑함이 아니라 '한 번 더 생각하고, 필요하면 행동한다'는 구조더라고요.
답을 한 방에 뱉는 대신, 중간에 멈춰서 도구를 부르는 그 한 단계가 전부예요.



ReAct가 뭐길래 다들 얘기하나요?

ReAct는 Reasoning(추론) + Acting(행동)을 합친 말입니다. 에이전트가 한 턴에 끝내지 않고 Thought(생각) → Action(행동) → Observation(관찰)을 반복하는 루프입니다. 생각으로 다음 할 일을 정하고, 행동으로 도구를 부르고, 관찰로 그 결과를 받아 다시 생각합니다. 목표를 달성하면 Action 자리에서 'Final Answer'로 빠져나옵니다.

ReAct 루프 — Thought, Action, Observation 순환

말은 거창한데 구조는 단순해요. 생각 → 행동 → 관찰을 while 루프로 돌리는 거죠.
1편에서는 이 중 '생각(Thought)'만 먼저 봅니다. 행동(Action) 자리에 진짜 도구를 꽂는 건 2편이에요.

참고로 ReAct는 2022년 구글·프린스턴 연구진 논문(ReAct: Synergizing Reasoning and Acting)에서 정리된 개념입니다. 추론만 하던 LLM에 '행동(도구 사용)'을 엮으니 답이 더 정확해지더라, 가 요지예요. 지금 나오는 거의 모든 에이전트가 이 골격 위에 서 있습니다.



사실 이미 매일 쓰고 있다고요?

ReAct 루프는 멀리 있는 개념이 아닙니다. 코드를 대신 짜주는 Claude Code나 Cursor, Codex 같은 도구가 바로 에이전트입니다. 이들은 "파일을 읽고(행동) → 결과를 보고(관찰) → 다음 수정을 생각하고(생각) → 다시 고친다"를 반복합니다. 사람이 매 단계 시키지 않아도 스스로 도구를 골라 굴러가죠. 우리가 이미 익숙하게 쓰는 그 흐름이 에이전트입니다.

Claude Code·Cursor·Codex가 모두 같은 ReAct 루프 — 생각·행동(도구)·관찰의 반복

솔직히 고백하면, 지금 이 블로그 글·이미지·코드도 상당 부분 에이전트(Claude)와 같이 만듭니다. ㅋㅋ 제가 "1편 강화해줘" 하면, 에이전트가 파일을 찾아 읽고(행동), 뭘 고칠지 정하고(생각), 이미지를 다시 렌더해 확인하고(관찰), 또 고치는 루프를 돌아요.
그러니 이 시리즈는 '에이전트가 뭔지'를 에이전트로 만들면서 설명하는 셈이라, 저한텐 좀 재밌는 주제입니다.



그럼 지난 RAG는 버리는 건가요?

아닙니다. RAG의 검색은 에이전트의 도구 상자 안으로 들어갑니다. RAG는 '질문 → 검색 → 생성'으로 정해진 순서를 한 번 흐르는 구조이고, 에이전트는 검색을 포함한 여러 도구(체중조회·환경체크 등)를 LLM이 스스로 골라 필요한 만큼 반복하는 구조입니다. 즉 RAG를 떼어내는 게 아니라, 더 큰 틀 안에 한 조각으로 넣는 겁니다.

RAG(검색→생성 고정 흐름)에서 에이전트(여러 도구를 스스로 골라 반복)로

실제로 2편에서 만들 게코 에이전트의 도구 중 하나가 바로 지난 시리즈에서 만든 Neo4j 의미검색(KG-RAG)입니다. 검색이 도구가 되는 거죠.



한 번에 답이 안 되는 질문을 줘보면?

"A개체(암컷), 지금 교배해도 될까?" 같은 질문은 한 방에 답하기 어렵습니다. 체중·월령·건강·환경을 다 알아야 하니까요. 그래서 같은 질문을 두 방식으로 Claude에 던져봤습니다. 그냥 한 번에 답하기, 그리고 답하기 전에 무엇을 알아내야 하는지 생각(Thought)으로 쪼개기. 차이가 분명합니다.

교배 가능 여부 질문을 Thought로 분해 — 모두 조회가 필요한 정보
python react_intro.py · claude -p (실제 실행)
질문: "A개체(암컷), 지금 교배 진행해도 될까?"

[A] 그냥 한 번에 답 (도구 없음)
  일반 기준: 암컷은 생후 12개월 이상 + 체중 45~50g 이상.
  ... 정확한 판단은 그 개체 실제 체중·나이·산란 이력 봐야 함 —
  기록 확인해.
  → 일반론은 맞지만, 정작 'A개체'가 되는지는 모른다.

[B] 단계적 생각 (ReAct의 Thought만 — 도구는 2편에서)
  Thought 1: A개체 신원·신체 상태 확인 (나이·체중·꼬리·산란이력).
    필요한 정보: A개체 기록(생년월일, 현재 체중, 마지막 클러치).
  Thought 2: 교배 적정선 = 나이·체중 (암컷 보통 45~50g 이상).
    필요한 정보: 현재 체중, 월령, 표준 기준치.
  Thought 3: 타이밍·환경 확인 (시즌·쿨링·회복기간).
    필요한 정보: 브리딩 시즌 여부, 쿨링/회복 일정.

  결론: 지금은 정보가 없어 판단 불가 — 도구로 개체 기록 조회 필요.

[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, 맞으면 에이전트.
"레오파드게코 적정 온도 몇 도야?"는 그냥 LLM으로 충분하고, "A개체 지금 체중 몇이고 교배 돼?"는 에이전트가 필요한 거죠.



정리

1편 핵심만 정리합니다.

  1. 그냥 LLM은 한 번에 답하고, 에이전트는 생각→행동→관찰을 반복합니다.
  2. ReAct = Reasoning + Acting. Thought·Action·Observation 루프가 에이전트의 골격입니다.
  3. RAG의 검색은 버리는 게 아니라, 에이전트가 쓰는 여러 도구 중 하나가 됩니다.
  4. 한 번에 답 못 하는 질문에서 에이전트는 먼저 '무엇을 알아내야 하나'를 생각으로 쪼갭니다.
  5. 단, 에이전트가 늘 정답은 아닙니다. 조회·여러 단계·외부 행동이 없으면 그냥 LLM이 더 낫습니다.
  6. 그 생각의 Action 자리에 진짜 도구를 꽂는 게 다음 편입니다.
AI 에이전트 5부작 로드맵 — 기초, Tool use, 멀티스텝, MCP, 멀티에이전트

여기까지가 에이전트의 개념입니다. 생각은 하는데 아직 손발(도구)이 없는 상태죠.
2편에서는 Claude에게 첫 도구 — 게코 체중조회 함수를 쥐여줍니다. [B]의 'Thought 2: 현재 체중'이 실제 숫자로 채워지는 걸 직접 돌려볼게요. ㅎㅎ

맛보기로, 도구 하나(체중조회)를 붙인 ReAct 루프를 미리 한 번 돌려봤습니다. 1편 [B]에서 "정보가 없어 판단 불가"로 끝났던 게, 도구가 생기니 실제 숫자(42g)로 판단까지 가는 걸 볼 수 있어요.

ReAct 루프 실제 실행 캡처 — Thought, Action(get_gecko_weight), Observation(42g), Final Answer

Thought(체중 확인 필요) → Action(get_gecko_weight 호출) → Observation(42g) → Final Answer(45g 미달, 증체 후 재시도)로 한 바퀴가 돕니다. 이게 1편 내내 말한 그 루프예요.

도구를 한 번만 부르고 끝나는 것도 아니에요. "A개체(암컷)랑 B개체(수컷), 둘 다 페어로 쓸 체중 돼?"처럼 물으면, 에이전트가 체중조회를 두 번 돌려(A → B) 각각의 결과를 모은 뒤 종합 판단합니다. 관찰을 보고 다음 행동을 정하는 그 루프가 그대로 반복되는 거죠.

멀티스텝 ReAct 실행 캡처 — get_gecko_weight를 A·B 두 번 호출해 페어 체중 비교

도구를 여러 개 주고, 스스로 골라 몇 번이고 반복하게 하는 게 3편(멀티스텝)의 주제예요. 1편은 여기까지, 일단 '루프가 돈다'는 감만 잡고 갑니다. ㅎㅎ

하나 더. 도구에 없는 걸 물으면 어떻게 될까요? "케이지 온도 적당해?"라고 물어봤는데, 이 에이전트엔 온도 도구가 없거든요. 그랬더니 지어내지 않고 "온도는 못 본다, get_gecko_weight만 있다"고 솔직히 말하면서, 할 수 있는 체중 조회만 도구로 처리하더라고요.

도구에 없는 질문 처리 — 온도는 도구 없어 못 한다고 솔직히, 체중만 도구로 조회

이게 의외로 중요해요. 도구 기반 에이전트는 '아는 척'보다 '못 하는 건 못 한다'가 잘 됩니다. 환각을 줄이는 게 결국 도구를 붙이는 또 다른 이유거든요.

#AI에이전트#ReAct#Agent#Claude#LLM#tool use#RAG