AI 에이전트 이해하기 - ReAct와 계획-실행 루프
함수 호출로 LLM에 도구를 쥐여줬다면, 그다음 질문은 자연스럽습니다. "목표만 던지면 알아서 여러 단계를 밟아 끝내주면 안 되나?" 이 아이디어가 AI 에이전트(agent) 이고, 그 대표적인 동작 방식이 ReAct와 계획-실행 루프입니다.
이 글에서는 에이전트가 무엇이고, 어떤 루프로 도는지, 그리고 실패·무한루프를 어떻게 막으며 현실적으로 어디까지 되는지를 정리합니다.
1. 에이전트란 - 관찰·사고·행동의 루프
일반적인 LLM 호출은 "질문 → 답변" 한 번으로 끝납니다. 에이전트는 다릅니다.
에이전트 = LLM을 두뇌로 삼아, 목표를 달성할 때까지 [사고 → 행동 → 관찰]을 스스로 반복하는 시스템.
핵심은 루프입니다.
목표 입력 │ ▼ ┌───────────────────────────────┐ │ 관찰(Observation): 지금 상황 파악 │ │ ↓ │ │ 사고(Thought): 다음에 뭘 할지 판단 │ │ ↓ │ │ 행동(Action): 도구 호출/답변 │ └───────────────────────────────┘ │ (목표 달성까지 반복) ▼ 최종 결과
한 번의 응답으로 못 끝내는 일을, 여러 스텝에 걸쳐 도구를 쓰며 처리한다는 게 에이전트의 본질입니다.
2. ReAct 패턴 - Reasoning + Acting
에이전트의 가장 기본적인 패턴이 ReAct입니다. 이름 그대로 Reasoning(추론)과 Acting(행동)을 번갈아 합니다.
각 스텝에서 LLM은 세 가지를 만들어냅니다.
- Thought: 지금 상황에서 무엇을 해야 하는지에 대한 생각
- Action: 실제로 호출할 도구와 인자
- Observation: 그 도구가 돌려준 결과(이건 시스템이 채워줌)
질문: "우리 팀에서 이번 주 마감인 이슈가 몇 개야?" Thought: 이슈 트래커를 조회해야겠다. Action: search_issues({ team: "backend", due: "this_week" }) Observation: 7건 반환됨 Thought: 개수만 세면 되니 답할 수 있다. Action: finish("이번 주 마감 이슈는 7건입니다.")
이게 앞 글의 함수 호출 루프와 거의 같은 구조라는 걸 눈치챘을 겁니다. 실제로 ReAct는 함수 호출 위에 "생각을 명시적으로 뱉게 하고, 목표 달성까지 반복" 을 얹은 것입니다.
3. 계획-실행(Plan-and-Execute) 패턴
ReAct는 매 스텝 즉흥적으로 다음 행동을 정합니다. 단계가 많아지면 길을 잃기 쉽죠. 그래서 나온 게 계획-실행 방식입니다.
먼저 전체 계획을 세우고(Plan), 그 계획을 순서대로 실행(Execute)한다.
[Plan] LLM이 큰 그림을 먼저 짬 1. 지난달 매출 데이터 조회 2. 카테고리별 집계 3. 표로 정리해 요약 [Execute] 각 단계를 도구로 실행하며 진행 → 중간에 어긋나면 계획을 다시 조정(re-plan)
| 패턴 | 방식 | 강점 | 약점 |
|---|---|---|---|
| ReAct | 매 스텝 즉흥 판단 | 유연함, 단순함 | 긴 작업에서 방향 상실 |
| 계획-실행 | 계획 먼저, 그다음 실행 | 복잡한 다단계에 강함 | 계획이 틀리면 전체 흔들림 |
실무에서는 둘을 섞습니다. 큰 계획을 세우되, 각 단계 안에서는 ReAct처럼 관찰에 따라 유연하게 대응하는 식입니다.
4. 에이전트를 이루는 3요소
에이전트를 제대로 만들려면 LLM 두뇌 외에 세 가지가 붙습니다.
4-1. 도구(Tools)
에이전트가 세상과 상호작용하는 손발입니다. 검색, DB, API, 파일, 코드 실행 등. 앞 글의 함수 호출이 바로 이 부분입니다. 도구가 다양할수록 할 수 있는 일이 늘지만, 너무 많으면 선택이 흐트러집니다.
4-2. 메모리(Memory)
- 단기 기억: 지금 진행 중인 대화·중간 결과. 보통 컨텍스트 창에 쌓입니다.
- 장기 기억: 세션을 넘어 유지할 정보. 벡터 DB 등에 저장해 필요할 때 검색(RAG)해서 불러옵니다.
스텝이 쌓이면 컨텍스트가 금방 커지므로, 오래된 관찰을 요약하거나 중요한 것만 남기는 관리가 필요합니다.
4-3. 계획(Planning)
목표를 하위 작업으로 쪼개고 순서를 정하는 능력. 앞서 본 계획-실행이 여기에 해당합니다.
┌── 도구: 검색 / DB / API / 코드실행 LLM 두뇌─┼── 메모리: 단기(대화) + 장기(벡터DB) └── 계획: 목표 분해 → 순서 결정 → 재조정
5. 실패와 무한루프 막기
에이전트가 스스로 루프를 돈다는 건 잘못 돌면 스스로 망가진다는 뜻이기도 합니다. 현실적으로 반드시 방어막을 둡니다.
- 최대 스텝 제한: 예) 10스텝 안에 못 끝내면 중단하고 사람에게 넘깁니다. 무한루프의 1차 방어선.
- 반복 감지: 같은 도구를 같은 인자로 계속 부르면 멈추게 합니다.
- 타임아웃·예산: 총 소요 시간·토큰·비용 상한을 둡니다.
- 에러 되먹임: 도구가 실패하면 에러를 관찰로 넣어 LLM이 다른 방법을 시도하게 합니다. 단, 재시도 횟수도 제한합니다.
- 사람의 개입(human-in-the-loop): 삭제·결제·외부 발송 같은 위험한 행동 전엔 승인 단계를 둡니다.
- 검증 단계: 최종 결과가 목표를 실제로 충족했는지 확인하는 스텝을 추가합니다.
let step = 0; const MAX_STEPS = 10; while (step++ < MAX_STEPS) { const { thought, action } = await agentStep(state); if (action.type === "finish") return action.result; if (isRepeating(action, history)) break; // 같은 행동 반복 → 중단 const observation = await runTool(action); history.push({ thought, action, observation }); } // 상한 도달 → 안전하게 종료 / 사람에게 이관
6. 현실적으로 어디까지 되나
과장 없이 짚겠습니다. 에이전트는 강력하지만 만능이 아닙니다.
잘 되는 영역:
- 도구가 명확하고 검증 가능한 작업(검색·조회·집계·정형 문서 작성).
- 스텝이 비교적 짧고 각 단계 결과를 확인할 수 있는 워크플로.
- 사람이 최종 확인하는 보조(assistant) 형태.
아직 조심할 영역:
- 스텝이 길어질수록 오류가 누적됩니다. 초반의 작은 실수가 뒤로 갈수록 커집니다.
- 되돌릴 수 없는 행동을 자율적으로 맡기는 것(무인 결제·대량 삭제 등)은 위험합니다.
- 목표가 모호하면 엉뚱한 방향으로 열심히 갑니다. 목표·도구·제약을 좁게 줄수록 잘 작동합니다.
감각: 지금의 에이전트는 "믿고 맡기는 자율 직원" 보다 "감독이 붙은 유능한 인턴" 에 가깝습니다. 범위를 좁히고 안전장치를 두면 실무에서 큰 값을 합니다.
마무리
AI 에이전트는 LLM을 두뇌로, [사고 → 행동 → 관찰] 루프를 목표 달성까지 반복하는 시스템입니다. ReAct는 매 스텝 유연하게 판단하는 방식, 계획-실행은 큰 그림을 먼저 세우는 방식이며, 실무에선 둘을 섞습니다.
핵심 정리.
- 에이전트 = LLM + 도구 + 메모리 + 계획의 반복 루프.
- 최대 스텝·반복 감지·사람 승인 같은 안전장치는 선택이 아니라 필수.
- 목표와 권한을 좁게 줄수록 안정적으로 작동한다.
"완전 자율"을 노리기보다 "좁은 범위를 안전하게 자동화" 하는 데서 시작하는 게 현실적인 출발점입니다.
