이종관
Back to Posts

ReAct: 추론과 행동의 결합

Reasoning + Acting - 생각한 후 도구를 사용하고, 결과를 관찰하는 순환 구조

2026년 2월 1일·5 min read·
ai
ai-agent
llm
react
tool-use
reasoning

Reasoning + Acting

개념

ReAct는 추론(Reasoning)과 행동(Acting)을 결합한 에이전트 프레임워크입니다. 생각한 후 외부 도구를 사용하고, 결과를 관찰하는 순환 구조를 가집니다.

동작 구조

Thought: 현재 상황 분석, 다음 단계 계획
    ↓
Action: 외부 도구 호출 (검색, 계산 등)
    ↓
Observation: 행동 결과 수신
    ↓
[반복] → 목표 달성까지

예시

[질문] "롯데월드타워의 높이는?"

Thought: 롯데월드타워 높이를 알아야 함. 검색 필요.
Action: [Search] "롯데월드타워 높이"
Observation: 554.5미터
Thought: 정보를 얻었음. 답변 가능.
Answer: 554.5미터

다단계 추론 예시

[질문] "한국에서 가장 높은 건물과 두 번째로 높은 건물의 높이 차이는?"

Thought: 먼저 가장 높은 건물을 알아야 한다.
Action: [Search] "한국 가장 높은 건물"
Observation: 롯데월드타워 (554.5m)

Thought: 두 번째로 높은 건물도 알아야 한다.
Action: [Search] "한국 두 번째로 높은 건물"
Observation: 해운대 LCT 더샵 (411.6m)

Thought: 이제 차이를 계산할 수 있다.
Action: [Calculate] 554.5 - 411.6
Observation: 142.9

Answer: 142.9미터

장점

장점설명
검증 가능성어떤 도구를 사용했는지 투명
최신 정보검색으로 실시간 정보 접근
투명성추론 과정이 명확
확장성새로운 도구 쉽게 추가

CoT만으로는 해결할 수 없는 문제

[질문] "오늘 서울 날씨는?"

CoT만 사용:
Thought: 서울은 한국의 수도이고...
Answer: 서울은 사계절이 뚜렷하여... (할루시네이션)

ReAct 사용:
Thought: 실시간 날씨 정보가 필요하다
Action: [Search] "오늘 서울 날씨"
Observation: 맑음, 기온 -2°C
Answer: 오늘 서울은 맑고, 기온은 영하 2도입니다.

성능

벤치마크기존ReAct
HotpotQA29%36.4%
FEVER45%79%

FEVER는 팩트 검증 작업으로, ReAct가 특히 강점을 보입니다.

사용 가능한 도구들

도구용도예시
Search정보 검색최신 뉴스, 사실 확인
Calculate수학 계산복잡한 연산
Wikipedia백과사전 조회개념 설명
Code코드 실행프로그래밍 작업
Calendar날짜 계산요일, 기간 계산

한계

  1. 복잡한 다단계 도구 사용 시 실패 가능

    • 도구 사용 순서가 복잡해지면 오류 증가
  2. 잘못된 경로에서 회복 어려움

    • 한 번 잘못된 방향으로 가면 되돌리기 어려움
  3. 도구 의존성

    • 적절한 도구가 없으면 해결 불가

Reflexion과의 결합

ReAct의 한계를 극복하기 위해 Reflexion과 결합할 수 있습니다:

[1차 시도]
Thought: 검색하자
Action: [Search] "잘못된 검색어"
Observation: 관련 없는 결과
→ 실패

[Reflexion]
"검색어가 너무 모호했다. 더 구체적으로 검색해야 한다."

[2차 시도]
Thought: 더 구체적인 검색어 사용
Action: [Search] "구체적인 검색어"
Observation: 정확한 결과
→ 성공

구현 패턴

def react_loop(question, max_iterations=5):
    context = f"Question: {question}\n"

    for i in range(max_iterations):
        # Thought 생성
        thought = llm.generate(context + "Thought:")
        context += f"Thought: {thought}\n"

        # Action 결정
        action = llm.generate(context + "Action:")

        if action.startswith("[Search]"):
            result = search(action.query)
        elif action.startswith("[Calculate]"):
            result = calculate(action.expression)
        else:
            break

        context += f"Action: {action}\n"
        context += f"Observation: {result}\n"

    # 최종 답변 생성
    answer = llm.generate(context + "Answer:")
    return answer

관련 개념

  • Chain of Thought (CoT): 기반 기술 (추론만)
  • Reflexion: 실패 복구 추가
  • LATS: 트리 탐색 결합
  • Toolformer: 도구 사용 자동 학습