ReAct 패턴
ReAct란 무엇인가?
섹션 제목: “ReAct란 무엇인가?”ReAct는 Reasoning + Acting의 합성어입니다. 2022년 Yao et al.이 발표한 논문에서 제안된 이 패턴은, LLM이 단순히 답을 생성하는 것이 아니라 생각하고 → 행동하고 → 관찰하는 사이클을 반복하도록 구조화합니다.
ReAct 이전의 접근법은 두 가지였습니다:
- 추론만 하는 방식: Chain-of-Thought처럼 생각은 하지만 실제 도구를 사용하지 못함
- 행동만 하는 방식: 도구를 사용하지만 왜 그 도구를 쓰는지 설명이 없음
ReAct는 이 두 가지를 결합했습니다.
Observe-Think-Act 사이클
섹션 제목: “Observe-Think-Act 사이클”┌─────────────────────────────────────┐│ Observation (환경 상태 관찰) ││ "파일 목록: [main.py, utils.py ...]"│└──────────────┬──────────────────────┘ ↓┌─────────────────────────────────────┐│ Thought (추론) ││ "main.py를 먼저 읽어서 구조를 파악 ││ 해야 할 것 같다" │└──────────────┬──────────────────────┘ ↓┌─────────────────────────────────────┐│ Action (도구 실행) ││ read_file("main.py") │└──────────────┬──────────────────────┘ ↓ (다음 Observation)이 사이클은 목표가 달성되거나 최대 스텝 수에 도달할 때까지 반복됩니다.
의사코드
섹션 제목: “의사코드”def react_agent(goal: str, tools: dict, max_steps: int = 20) -> str: observation = get_initial_observation(goal)
for step in range(max_steps): # Think: 현재 관찰을 바탕으로 추론 thought = llm.think( goal=goal, observation=observation, history=history, )
# 목표 달성 여부 확인 if thought.is_done: return thought.final_answer
# Act: 도구 선택 및 실행 action = thought.chosen_action tool_fn = tools[action.tool_name]
try: result = tool_fn(**action.parameters) observation = f"도구 결과: {result}" except Exception as e: observation = f"오류 발생: {e} — 다른 접근을 시도하세요"
return "최대 스텝 초과: 목표 미달성"실제 ReAct 실행 예시
섹션 제목: “실제 ReAct 실행 예시”다음은 “src/auth 디렉토리의 버그를 찾아 수정하라”는 목표로 실행되는 ReAct 에이전트의 한 사이클입니다:
Observation: 작업 디렉토리: /workspace/src/auth
Thought: auth 디렉토리의 파일 목록을 먼저 확인해야 한다.
Action: list_directory("src/auth")Result: [login.py, token.py, middleware.py, __init__.py]
Observation: 4개 파일 확인. 버그 관련 최근 커밋을 확인해야 한다.
Thought: git log로 최근 변경 사항을 확인하면 버그 위치를 좁힐 수 있다.
Action: run_command("git log --oneline -5 src/auth/")Result: a3f2c1 fix: token expiry check b8e901 feat: add refresh token ...ReAct가 적합한 상황
섹션 제목: “ReAct가 적합한 상황”| 상황 | 적합 여부 | 이유 |
|---|---|---|
| 탐색적 태스크 (버그 찾기, 코드 이해) | 적합 | 중간 결과에 따라 방향 전환 가능 |
| 단계가 사전에 명확한 태스크 | 비적합 | Plan-and-Execute가 더 효율적 |
| 외부 도구 결과가 다음 결정에 영향 | 적합 | 관찰 기반 적응 가능 |
| 병렬 실행이 필요한 태스크 | 비적합 | ReAct는 본질적으로 순차적 |
| 짧은 응답 시간이 중요한 경우 | 주의 필요 | 여러 번의 LLM 호출 발생 |
ReAct는 “생각하고 행동하고 관찰하는” 사이클로 에이전트가 복잡한 문제를 단계적으로 해결하게 합니다. 탐색적이고 중간 결과에 따라 방향을 바꿔야 하는 태스크에 강점이 있습니다. 다음 챕터에서는 사전 계획이 더 적합한 Plan-and-Execute 패턴을 다룹니다.