루프 엔지니어링
시키지 않아도 목표까지 돌고, 정해 둔 기준에서 스스로 멈추는 업무 구조를 설계하는 일입니다.
프롬프트를 잘 쓰는 기술에서 한 단계 올라가, 에이전트가 언제 시작하고 무엇으로 완료를 판정하며 언제 멈출지를 코드로 정합니다. 모델 안쪽에서 도는 루프는 이미 있으므로, 우리가 만드는 것은 그 바깥 루프입니다.
AI를 다루는 기술의 4단계
앞의 세 단계는 사람이 시킬 때 AI가 잘 움직이게 하는 기술입니다. 루프는 사람이 시키지 않아도 돌아가게 하는 기술입니다. 각 단계는 앞 단계를 대체하지 않고 그 위에 쌓입니다.
| 단계 | 핵심 질문 | 시작하는 주체 | 개발자가 만드는 것 | 사람의 역할 |
|---|---|---|---|---|
| 프롬프트 | 무엇을 어떻게 요청할까"10년 차 마케터처럼 써 줘" | 사람, 매번 | 지시문, 출력 형식, 예시 | 매 요청 작성과 결과 확인 |
| 컨텍스트 | AI가 무엇을 알고 있어야 할까 | 사람, 매번 | 검색(RAG), 문서 주입, 대화 요약, 메모리 | 필요한 자료 선별 |
| 하네스 | AI가 어디서 무엇으로 일할까 | 사람, 매번 | 툴 정의, MCP 연결, 규칙 파일, 샌드박스, 권한 | 작업 환경 세팅 |
| 루프 | 언제 시작하고, 무엇으로 판정하고, 언제 멈출까 | 트리거, 자동 | 오케스트레이터, 검증자, 상태 저장, 종료 가드 | 목표와 판정 기준 정의, 예외 처리 |
이너 루프와 아우터 루프
모델이 한 번의 실행 안에서 도는 순환은 에이전트 프레임워크가 이미 제공합니다. 루프 엔지니어링의 대상은 그 실행을 감싸는 바깥 순환입니다.
생각 → 도구 호출 → 관찰 → 다시 생각
ReAct 형태의 에이전트 실행 한 번입니다. LangGraph의 agent 노드, Claude Agent SDK의 query 한 번이 여기에 해당합니다. 다시 만들 필요가 없습니다.
# 프레임워크 안쪽 while msg.tool_calls: obs = run_tools(msg.tool_calls) msg = model(history + obs)
시작 → 위임 → 판정 → 기록 → 멈춤 또는 반복
언제 시작할지, 무엇을 시킬지, 누가 완료를 판정할지, 언제 멈출지를 코드로 정합니다. 이 페이지의 나머지는 모두 이쪽 이야기입니다.
def outer_loop(job): # 트리거가 호출 state = State.load(job.id) # 어디까지 했나 while True: result = agent.run(job.goal, state) # 이너 루프 verdict = verifier.check(result, job.criteria) state.record(result, verdict) if verdict.passed: return done(state) if (why := guard.tripped(state)): return escalate(state, why)
아우터 루프를 이루는 6가지 구성 요소
루프 위의 부품을 눌러 보면 역할, 빠졌을 때 생기는 일, 구현 예시가 나옵니다. 점선 테두리 두 개(스킬, 상태 파일)는 "매번 첫날인 에이전트"에게 경험을 대신 주는 기억 장치입니다.
스킬만 있고 상태가 없으면, 새로 뜬 에이전트는 스킬의 1단계부터 성실하게 다시 시작합니다. 분석을 반복하고 파일을 다시 내려받는 현상은 대개 스킬이 잘못된 게 아니라 스킬이 진행 위치를 모르기 때문입니다. 스킬의 0단계를 "상태 읽기"로 두고, 각 단계에 진입 조건과 산출물을 적어 두면 해결됩니다.
종료 조건 설계
처음 만든 루프가 가장 많이 놓치는 부분입니다. 멈출 줄 모르는 루프는 토큰 비용을 계속 만들고, 기준이 모호한 루프는 덜 된 결과를 완료로 보고합니다.
# 안전장치는 여러 겹으로, 모델이 아니라 코드가 센다 @dataclass class Guard: max_iters: int = 10 max_tokens: int = 400_000 max_seconds: int = 1_800 stall_window: int = 3 # 같은 오류 시그니처가 연속 N회 def tripped(self, s: State) -> str | None: if s.iters >= self.max_iters: return "max_iters" if s.tokens >= self.max_tokens: return "budget" if s.elapsed >= self.max_seconds: return "timeout" last = s.error_sigs[-self.stall_window:] if len(last) == self.stall_window and len(set(last)) == 1: return "no_progress" return None
가드에 걸려 멈추는 것은 실패가 아닙니다. 상태 파일에 기록을 남기고 사람에게 질문으로 올라오는 것이 정상 경로입니다. 이때 에이전트를 종료시키지 말고 같은 스레드에서 답을 기다리게 해야 재개 시 다시 처음부터 하지 않습니다.
흔한 실패 패턴
운영 중 보이는 증상에서 빠진 부품을 찾는 표입니다.
"에이전트는 실패했다"는 절반만 맞습니다
2025년은 "에이전트의 해"로 예고됐지만, 기업 현장의 평가는 과대 약속과 과소 전달이었습니다. 그런데 같은 시기 같은 모델로 코딩 에이전트는 크게 성공했습니다. 둘을 가른 것은 모델 성능보다 루프의 조건이었습니다.
자주 인용되는 "95% 실패"(MIT NANDA, 2025)는 에이전트가 아니라 생성형 AI 파일럿 전반이 6개월 안에 손익 효과를 내지 못했다는 수치입니다. 같은 보고서는 원인을 모델 품질보다 조직의 통합 실패로 봅니다. Gartner는 기존 챗봇이나 RPA에 이름만 바꿔 단 "에이전트 워싱"도 많다고 지적해, 실패 통계 일부는 진짜 에이전트의 실패가 아닐 수 있습니다.
성공한 곳과 실패한 곳의 차이
왼쪽 칸의 부품 이름을 누르면 3번 섹션의 해당 설명으로 이동합니다.
| 루프 조건 | 코딩 에이전트 · 성공 | 상담·사무 에이전트 · 고전 |
|---|---|---|
| (판정 기준) | 컴파일, 테스트, CI가 참/거짓을 냅니다 | "고객이 만족했나"는 스크립트로 판정하기 어렵습니다 |
| (분리) | 테스트와 리뷰어가 만든 쪽과 따로 있습니다 | 자기 응답을 자기가 판단하는 경우가 많습니다 |
| (되돌리기) | 브랜치, 샌드박스, PR 승인 뒤에만 반영됩니다 | 고객에게 나간 답변은 회수할 수 없습니다 |
| 저장소와 커밋 이력이 그대로 상태입니다 | 대화가 끝나면 맥락이 사라지고, 다중 턴에서 무너집니다 | |
| (권한) | 쓰기 범위가 저장소 안으로 제한됩니다 | 여러 시스템을 넘나들며 기밀 정보 경계가 흐려집니다 |
| 사람의 위치 | 결과를 검토할 줄 아는 개발자가 루프 안에 있습니다 | 검토할 수 없는 최종 고객이 결과를 바로 받습니다 |
실패 원인과 빠진 부품
사례: Klarna. AI 상담이 상담원 700명분의 일을 한다고 발표했지만, 고객 만족도가 떨어지고 미해결 문의가 늘자 2025년에 사람 상담원을 다시 채용했습니다. 판정하기 어려운 목표(공감과 해결)에, 되돌릴 수 없는 출력(고객 응대)을, 사람 검토 없이 맡긴 경우입니다.
출처 보기
- Gartner: Over 40% of Agentic AI Projects Will Be Canceled by End of 2027
- Gartner's 2026 Hype Cycle for Agentic AI (nocode.tech)
- MIT report: 95% of generative AI pilots at companies are failing (Fortune)
- AI agents get office tasks wrong around 70% of the time (The Register)
- Why AI agent projects fail in the enterprise (2026 data)
- 2025 Was Supposed to Be the Year of the Agent. It Never Arrived (Reworked)
- Klarna Is Hiring Customer Service Agents After AI Couldn't Cut It (Entrepreneur)
- AI Coding Agents: Adoption Trends (JetBrains)
어떤 업무부터, 어떤 순서로
모든 업무가 루프에 맞지는 않습니다. 후보를 고르고, 한 칸씩 올라가고, 같은 틀로 분해해 보는 순서를 권합니다.
후보 업무 진단
도입 단계
한 번에 다 만들지 않고, 각 단계가 안정된 뒤 다음으로 올라갑니다. 트리거 자동화는 가장 마지막입니다.
사례로 분해해 보기
루프 설계 캔버스
7칸을 채우면 오른쪽에서 흔한 실수를 바로 짚어 줍니다. 작성 내용은 이 브라우저에만 임시 저장되고, Markdown으로 복사해 설계 문서나 이슈에 붙일 수 있습니다.
첫 루프를 돌리기 전 체크리스트
- 완료 기준을 스크립트로 참/거짓 판정할 수 있습니다.
- 완료 판정을 만든 에이전트가 아닌 쪽(테스트, 검증 에이전트)이 합니다.
- 최대 반복, 토큰·시간 한도, 무진전 감지가 코드로 걸려 있습니다.
- 상태 파일을 프롬프트가 아니라 코드가 매 반복마다 기록합니다.
- 스킬의 첫 단계가 상태 읽기이고, 각 단계에 진입 조건과 산출물이 있습니다.
- 사람에게 물어볼 때 에이전트를 종료하지 않고 같은 스레드에서 대기합니다.
- job마다 파일, 브랜치, 대화 상태가 분리되어 있고, 외부 쓰기에는 멱등 키가 있습니다.
세 줄로 줄이면 이렇습니다. 테스트(판정 기준)를 먼저 쓰고, 검사는 남이 하게 하고, 기억은 파일에 남깁니다.