콘텐츠로 이동

ReAct 패턴

ReActReasoning + Acting의 합성어입니다. 2022년 Yao et al.이 발표한 논문에서 제안된 이 패턴은, LLM이 단순히 답을 생성하는 것이 아니라 생각하고 → 행동하고 → 관찰하는 사이클을 반복하도록 구조화합니다.

ReAct 이전의 접근법은 두 가지였습니다:

  • 추론만 하는 방식: Chain-of-Thought처럼 생각은 하지만 실제 도구를 사용하지 못함
  • 행동만 하는 방식: 도구를 사용하지만 왜 그 도구를 쓰는지 설명이 없음

ReAct는 이 두 가지를 결합했습니다.

┌─────────────────────────────────────┐
│ 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 "최대 스텝 초과: 목표 미달성"

다음은 “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
...
상황적합 여부이유
탐색적 태스크 (버그 찾기, 코드 이해)적합중간 결과에 따라 방향 전환 가능
단계가 사전에 명확한 태스크비적합Plan-and-Execute가 더 효율적
외부 도구 결과가 다음 결정에 영향적합관찰 기반 적응 가능
병렬 실행이 필요한 태스크비적합ReAct는 본질적으로 순차적
짧은 응답 시간이 중요한 경우주의 필요여러 번의 LLM 호출 발생

ReAct는 “생각하고 행동하고 관찰하는” 사이클로 에이전트가 복잡한 문제를 단계적으로 해결하게 합니다. 탐색적이고 중간 결과에 따라 방향을 바꿔야 하는 태스크에 강점이 있습니다. 다음 챕터에서는 사전 계획이 더 적합한 Plan-and-Execute 패턴을 다룹니다.