한 번쯤 LangGraph 같은 에이전트 프레임워크 문서를 열었다가, 노드(node)와 엣지(edge)와 상태 그래프(state graph)라는 단어들 앞에서 슬그머니 탭을 닫아 본 적 있다면 — 이 글은 당신을 위한 것이다.
"목표만 주면 알아서 도는 에이전트"는 근사해 보인다. 그런데 막상 프레임워크를 열면, 그 '알아서'가 두꺼운 추상화 뒤에 숨어 있다. 안이 안 보이니 손대기가 겁난다. 폭주하면 왜 폭주하는지도 모르겠고, 잘 되면 왜 잘 되는지도 모르겠다. 마법처럼 느껴진다. 그리고 우리는 마법을 신뢰하지 못한다.
그래서 오늘은 반대로 간다. 프레임워크를 쓰는 대신, 그 안에서 도는 루프를 처음부터 내 손으로 짠다. 놀랍게도, 그 루프의 심장은 함수 딱 두 개와 슬라이더 하나다. 다 짜고 ▶를 누르면, 목표 한 줄만 던진 에이전트가 눈앞에서 스스로 열한 바퀴를 돌아 답을 내놓는다. 다 짜고 나면 프레임워크가 더는 무섭지 않다 — 그 안에서 무슨 일이 도는지 이미 손끝으로 알아버렸으니까.
지금까지 우리가 손에 쥔 것
이번 호를 여기까지 따라왔다면 당신 손엔 이미 부품이 있다.
3편에서는 '검색→요약→다시' 도는 미니 에이전트를 조립하며, 루프의 심장인 "한 바퀴 더 돌까?"라는 판단 한 칸을 채웠다. 4편에서는 일부러 폭주시킨 루프를 돌려 토큰 미터가 치솟는 걸 목격하고, 멈춤 조건·토큰 예산·가드레일이라는 안전벨트를 손으로 걸었다.
오늘은 그 둘이 한 몸으로 합류한다. 3편이 도구 한 종(검색)을 반복했다면, 오늘은 도구 세 종을 상황에 맞게 골라 쓰는 다단계 루프를 짠다. 4편에서 건 안전벨트는 이번엔 폭주를 막는 필수 부품으로 루프 안에 눌러앉는다. 구경(1편)하고 해부(2편)하고 조립(3편)하고 제어(4편)한 모든 감각이, 이 한 편에서 만난다.
'자판기'와 '에이전트'를 가르는 단 한 가지
에이전트가 자판기와 뭐가 다른지, 딱 한 단어로 답할 수 있다. 재계획(replan)이다.
자판기는 정직하다. 버튼을 누르면 정해진 음료가 나온다. 없으면 그냥 안 나온다. 대부분의 "AI에게 한 번 묻고 한 번 답받기"가 이 자판기다 — 결과가 부족해도 스스로 고쳐 다시 시도하지 않는다.
에이전트는 다르다. 검색을 해봤는데 원하는 게 부족하면, 결과를 보고 계획을 고쳐 다른 검색어로 다시 찾는다. 이 "관찰을 보고 계획을 수정하는" 되먹임이 재계획이고, 이것이 있느냐 없느냐가 '한 번 답하는 자판기'와 '스스로 목표에 도달하는 에이전트'를 가른다.
그래서 에이전트의 한 바퀴는 네 박자로 돈다.
계획(plan) → 행동(act) → 관찰(observe) → 재계획(replan)
무엇을 할지 정하고(계획), 도구를 쓰고(행동), 결과를 보고(관찰), 그 결과를 반영해 다음 계획을 고친다(재계획). 목표에 닿을 때까지 이 네 박자를 스스로 반복한다.
💡 더 깊이 — ReAct: 네 박자의 정체 개념
이 네 박자는 에이전트 연구에서 ReAct(Reasoning + Acting, 추론과 행동을 번갈아 하는 패턴)라 불리는 구조의 축소판이다. 매 바퀴 "지금 상황을 보고(추론) → 도구를 쓰고(행동) → 결과를 관찰"하는 걸 반복하는데, 관찰 결과가 다음 바퀴의 입력으로 쌓이면서 대화 맥락(state)이 점점 불어난다. 2편에서 봤던 "매 스텝 컨텍스트가 누적되는" 그 현상이다.
오늘 채울 것은 딱 세 개 — 루프의 '세 개의 뇌'
여기서 안심하고 가자. ★★★이지만 실력 시험이 아니다. 도구도, 검색 결과를 거르는 필터도, 관찰을 상태에 반영하는 일도 전부 엔진이 이미 처리해 둔다. 당신이 채울 건 루프의 판단을 맡는 세 자리뿐이다. 막히면 버튼 하나로 정답 골격을 통째로 불러와 누구나 완주한다. 그러니 겁먹지 말고, 이 세 자리가 각각 무슨 일을 하는지만 보자.
뇌① policy(state) — "지금 무슨 도구를 쓸까?"
매 바퀴, 지금 상태를 보고 다음 행동 하나를 정하는 머리다. 계획하고, 행동을 고르고, 부족하면 재계획하는 일이 전부 이 함수 안에서 갈린다. 예컨대 "아직 후보가 하나도 없으면 검색부터, 상세를 안 본 후보가 있으면 상세 조회, 통과한 곳이 3곳이 안 되는데 안 써본 검색어가 남았으면 → 다시 검색(재계획)" 같은 갈래를 짜 넣는다.
뇌② isGoalMet(state) — "목표를 이뤘나?"
매 바퀴 맨 앞에서, 지금 상태로 목표를 달성했는지 참·거짓으로 판정하는 종료 조건이다. 여기를 아무렇게나 두면 루프가 영영 안 멈추거나, 아무것도 안 하고 끝나 버린다. "언제 멈출지"를 정하는 게 곧 설계라는 걸 이 한 함수가 보여준다.
뇌③ 토큰 예산 슬라이더 — 폭주 전에 거는 안전벨트
4편에서 익힌 그 감각이다. policy를 잘못 짜서 에이전트가 같은 검색만 반복해도, 정해 둔 토큰 예산을 넘는 순간 루프가 멈춘다. "돈이 새기 전에" 먼저 거는 브레이크다.
💡 더 깊이 — state는 에이전트의 단기 기억 개념
여기서 state는 에이전트의 단기 기억이다. 지금까지 찾은 후보, 상세를 확인한 곳, 조건을 통과한 곳, 아직 안 써본 검색어가 전부 이 하나의 객체에 담긴다. policy는 매 바퀴 이 기억을 읽어 판단하고, 행동의 결과가 다시 이 기억에 쌓인다. 에이전트에게 "메모리"가 왜 중요한지 — 기억이 없으면 매번 처음부터 다시 시작하는 자판기로 돌아간다는 걸 — 이 한 객체가 말해 준다.
재계획이 '장식'이 아니라 '진짜 문제'인 이유
말로만 "재계획이 중요하다"고 하면 와닿지 않는다. 그래서 오늘 데모의 과제는, 재계획 없이는 절대 목표에 도달할 수 없게 설계돼 있다.
목표는 이렇다.
첫 검색어 "실내 데이트"로 찾으면 후보 셋이 나오는데, 막상 상세를 열어 보면 조건을 통과하는 건 딱 2곳이다. 하나는 야경 바라 실내가 아니고(탈락), 나머지 둘만 통과한다. 목표는 3곳인데 2곳뿐. 여기서 자판기라면 "2곳 찾았습니다" 하고 끝냈을 것이다.
에이전트는 다르게 굴어야 한다. "3곳이 안 되네, 다른 검색어로 다시 찾자"라고 계획을 고쳐야(재계획) 한다. 그런데 두 번째 검색어 "전시·체험"으로 다시 찾아도 통과는 안 늘어난다 — 하나는 야외고, 하나는 3만 5천 원이라 예산 초과다. 세 번째 검색어 "카페·보드게임"에 와서야 3곳째가 채워진다. 즉 이 목표는 재계획을 두 번 거쳐야만 도달할 수 있다. policy에 "부족하면 다시 검색"이라는 재계획 가지를 안 넣으면, 에이전트는 영원히 2곳에서 맴돈다.
이게 재계획이 장식이 아니라 진짜로 작동하는 문제인 이유다. 그리고 이 순간이 오늘의 절정이다 — 당신이 짠 세 개의 뇌가 이 재계획을 스스로 해내는 걸, 눈으로 보게 된다.
목표 한 줄과 도구 세 종은 옆의 샌드박스에 이미 다 준비돼 있다. 당신이 채울 건 루프의 세 개의 뇌 — 계획(policy)·종료 판정(isGoalMet)·안전벨트(토큰 예산) — 그것뿐이다. 각 칸에 힌트와 정답 토글이 붙어 있으니 막히면 바로 열어 보자. 세 뇌를 채우고 ▶를 누르면, 에이전트가 계획→행동→관찰→재계획을 11스텝 돌며 스스로 목표에 도달한다. 그 트레이스에서 보라색 '재계획' 카드가 두 번 뜨는 순간 — 그게 당신이 방금 자판기를 에이전트로 바꾼 증거다.
돌려 보고 나면 보이는 것들
세 뇌를 채우고 ▶를 눌렀다면, 화면에서 이런 것들을 확인해 보자. 이 관찰들이 오늘 기사의 진짜 메시지다.
① 재계획 카드 두 번 — "계획을 고쳐 도달한다"의 실물
표준 정답으로 돌리면 정확히 11스텝 / 860토큰에 목표를 달성한다. 트레이스를 위에서 내려오며 보면, 파란 "탐색 시작" 카드로 열고 → 상세 확인들 → 통과가 2곳뿐이라 보라색 "재계획·재탐색" 카드가 뜨고 → 또 2곳뿐이라 보라색 카드가 한 번 더 → 세 번째 검색에서 3곳이 차자 초록색 "표 작성" 카드로 닫힌다. 최종 표에는 동네 만화카페 · 시립 미술관 · 보드게임 카페 세 곳이 담긴다. 목표 한 줄만 줬을 뿐인데, 당신이 짠 policy가 스스로 두 번 계획을 고쳐 여기까지 온 것이다.
② 예산 600으로 낮추면 — "너무 짜면 목표 전에 잘린다"
슬라이더를 600까지 내리고 다시 돌려 보자. 이번엔 8스텝에서 예산 초과로 멈추고, 조건 통과는 2곳뿐이다. 목표에 닿기 전에 안전벨트가 먼저 당겨진 것이다. 안전벨트는 무조건 조인다고 좋은 게 아니라, 목표를 이룰 여유는 남기고 폭주만 막는 튜닝의 감각이라는 걸 손으로 느끼게 된다.
③ 일부러 폭주시키면 — 두 겹의 안전벨트가 잡는다
policy를 "무조건 검색만 반복"으로 바꿔 폭주시켜 보자. 예산 1500에서는 13스텝 / 1560토큰에 예산이 먼저 잡는다. 예산을 3000까지 풀어 놓으면? 이번엔 엔진에 항상 켜져 있는 강제 상한 HARD_CAP = 20스텝이 최후의 방어선으로 무한루프를 끊는다. 정책을 아무리 잘못 짜도 브라우저가 멈추는 일은 없다 — 안전벨트가 두 겹이기 때문이다.
"돌게 만드는 것"만큼 "멈추게·고쳐 돌게 만드는 것"이 곧 설계다. 이게 이번 편의 한 문장이다.
방금 손으로 짠 것 = 프레임워크가 감춰 두던 것
이제 처음의 그 무서웠던 프레임워크로 돌아가 보자. 방금 당신이 채운 세 자리는, 사실 LangGraph 같은 도구가 내부에서 대신 굴려 주던 바로 그 부품들이다.
| 당신이 손으로 짠 것 | 프레임워크에서 부르는 이름 |
|---|---|
policy(state) — 다음 행동을 정하는 갈래 | 엣지(edge) / 라우팅 로직 |
| 도구 실행 한 번(검색·상세·표) | 노드(node) |
state — 지금까지 쌓인 기억 | 상태(state) |
isGoalMet(state) — 멈출 조건 | 종료 조건(END 분기) |
HARD_CAP = 20스텝 | recursion limit(재귀 상한) |
프레임워크가 마법처럼 느껴졌던 건, 이 부품들이 근사한 이름과 추상화 뒤에 숨어 있었기 때문이다. 뚜껑을 열고 보니 별게 아니다 — 상태를 보고 다음을 정하고, 멈출 때를 판정하고, 폭주를 막는 상한을 건다. 그게 전부다. 프레임워크는 이걸 편하게 해 줄 뿐, 없던 마법을 만들어 주지는 않는다. 어디까지가 실체이고 어디부터가 거품인지, 이제 당신은 스스로 가를 수 있다.
잠깐, 정직하게 — 이건 '축소 모형'이다
한 가지 분명히 하자. 옆 데모의 검색·상세·표 도구는 진짜로 웹을 뒤지거나 실제 장소를 예약하지 않는다. 페이지 안에 미리 심어 둔 결정적(deterministic) 함수들이다 — 그래서 외부 서버도, API 키도, 인터넷 요청도 0으로 누구나 100% 똑같이 돌아간다. 프레임워크가 감춰 두던 루프의 구조를 마찰 없이 손으로 짜 보라고 만든 축소 모형인 셈이다.
그럼 '진짜'는 어디서 시작될까. 오늘 짠 골격에서 두뇌 하나만 바꾸면 된다. policy가 규칙으로 다음 행동을 정하던 자리를, LLM이 매 바퀴 상태를 읽고 다음 행동을 판단하는 자리로 교체하는 것이다. 도구·엔진·안전벨트는 그대로 두고 policy만 LLM 호출로 바꾸면, 결정적 모형이 진짜 에이전트로 승격한다.
💡 더 깊이 — 심화 방향 안내 (WebLLM · 무료 API) 개념
기본 데모는 지금 이대로 결정적 폴백이다(키 0 · 외부요청 0). 다만 골격이 열려 있어서, 원한다면 policy 자리를 진짜 브라우저 LLM으로 바꿔 끼울 수도 있다. 1순위 후보는 WebLLM(키 0) — 브라우저 안에서 소형 모델을 직접 굴려, 매 바퀴 state를 프롬프트로 주고 다음 행동을 JSON {tool, input}으로 받는 방향이다. 2순위는 무료 API 티어(Google AI Studio·Groq·OpenRouter의 무료 모델)를 붙이는 길이다. 어느 방향으로 가든 도구·엔진·안전벨트는 그대로라, LLM이 헛돌아도 두 겹 안전벨트가 폭주를 잡고 정답 골격이 결정적 루프로 되돌릴 수 있다 — ★★★이라도 무료·오픈 경로로 완주가 보장된다. 이 승격을 실제 버튼으로 구현하는 일은 이 편의 범위를 넘지만, 갈 방향은 이렇다. 어느 쪽도 유료 서비스에 묶이는 길은 아니다.
마치며 — 이제 프레임워크가 두렵지 않다
목표 한 줄을 던졌다. 나머지는 내가 짠 세 개의 뇌가 알아서 돌아 답을 냈다. 계획하고, 도구를 골라 쓰고, 부족하면 스스로 계획을 고쳐 다시 찾고, 3곳이 모이자 표를 만들어 멈췄다. 열한 바퀴. 프레임워크가 블랙박스 뒤에 감춰 두던 그 전부를, 오늘 당신은 빈칸 세 개로 처음부터 조립했다.
이 자립감이 오늘 기사가 남기고 싶은 단 하나다. 다음에 LangGraph 문서를 다시 열면, 노드와 엣지와 상태 그래프가 더는 주문(呪文)으로 보이지 않을 것이다. 당신은 그 안에서 무슨 일이 도는지 이미 손끝으로 안다.
완주했다면 실행 로그 — 몇 스텝, 몇 토큰에 목표를 이뤘는지 — 를 복사해 디스코드 #mission-goal-to-agent 채널에 남기자. #목표한줄에이전트 태그로. 리더보드에는 "가장 적은 토큰으로 목표를 달성한 로그"가 걸려 있다. 표준 정답이 11스텝/860토큰이라면, 상세 조회를 아끼는 절약형은 10스텝/800토큰까지 줄어든다. 당신은 몇까지 줄일 수 있을까.
여기까지 우리는 에이전트를 자유롭게 돌게 만드는 데 온 힘을 썼다. 그런데 자유가 늘 좋은 건 아니다. 이메일을 보내고, 파일을 지우고, 결제를 하는 — 되돌릴 수 없는 행동 앞에서는, 아무리 잘 짠 루프라도 잠깐 멈춰 사람에게 물어야 한다. 4편의 안전벨트가 '자동 브레이크'였다면, 다음 6편은 사람이 직접 쥐는 핸들 이야기다. 스스로 도는 루프에 "이거, 실행할까요?"라는 승인 게이트를 끼워 넣으러 가 보자.