← 커리큘럼으로

에이전트 루프 직접 구현: 120줄로 이해하는 ReAct

운영자 직접 작성 · 2026년 9월 업데이트 · 약 10분 분량

에이전트 프레임워크를 쓰기 전에 루프를 직접 써보세요. 저는 LangChain을 먼저 썼다가 디버깅에서 막혔고, 120줄짜리 루프를 손으로 쓴 뒤에야 "도구 호출이 실패하면 어디서 멈추는지"가 보였습니다.

루프의 뼈대

MAX_STEPS = 10

def run(query, tools, llm):
    history = [{"role": "user", "content": query}]
    for step in range(MAX_STEPS):
        msg = llm(history)
        if msg.get("tool_calls"):
            for call in msg["tool_calls"]:
                try:
                    result = tools[call["name"]](**call["args"])
                except Exception as e:
                    result = f"ERROR: {e}"
                history.append({"role": "tool", "id": call["id"], "content": str(result)})
            continue
        return msg["content"]
    raise RuntimeError("Step limit exceeded")

꼭 넣어야 할 3가지

  1. 스텝 제한: 무한 루프 방지의 최소 장치. 10에서 시작하세요.
  2. 도구 오류를 히스토리에: 예외를 삼키지 말고 모델에게 보여주세요. 모델이 스스로 복구합니다.
  3. 대화 기록 절단: 히스토리가 길어지면 오래된 도구 결과부터 요약·삭제하세요.

실패 패턴 3가지와 처방

다음: Phase 14-01 The Agent Loop · RAG 가이드