ReAct Framework¶
개념¶
ReAct(Reasoning + Acting)는 Yao et al. (2022)가 제안한 프레임워크로, 추론(Reasoning)과 행동(Acting)을 번갈아 가며 수행하여 외부 도구와 정보를 활용하면서 복잡한 문제를 해결하는 방식입니다.
기본 아이디어¶
전통적인 접근의 한계¶
Chain-of-Thought는 사고만 하고 행동하지 않습니다: - 내부 지식에만 의존 - 실시간 정보 활용 불가 - 계산 오류 발생 가능 - 최신 정보 부재
ReAct의 혁신¶
Yao et al. (2022) 프레임워크¶
핵심 루프¶
1. Thought (생각)
현재 상태 분석, 다음 행동 결정
2. Action (행동)
외부 도구나 정보 소스에 접근
- 웹 검색
- 계산기 사용
- 데이터베이스 조회
- API 호출
3. Observation (관찰)
행동의 결과 수집
4. 다시 반복
새로운 정보를 바탕으로 다음 행동 결정
루프 다이어그램¶
┌─────────────────────────────────┐
│ Thought: 현재 상태 분석 │
└────────────┬────────────────────┘
↓
┌─────────────────────────────────┐
│ Action: 도구 사용/정보 검색 │
└────────────┬────────────────────┘
↓
┌─────────────────────────────────┐
│ Observation: 결과 수집 │
└────────────┬────────────────────┘
↓
(조건 확인)
↙ ↘
완료됨 아직 불완전
↓ ↓
답변 Thought로 돌아가기
지식 집약적 작업 vs 의사결정 작업¶
지식 집약적 작업 (Knowledge-Intensive Tasks)¶
외부 정보가 필수적인 작업:
예제 1: 최신 뉴스 요약
Thought: 2026년 2월의 최신 기술 뉴스를 찾아야 한다.
Action: search("2026년 2월 기술 뉴스")
Observation: [검색 결과 10개 반환]
Thought: 가장 관련성 있는 3개 기사를 자세히 본다.
Action: fetch_article("기사1 URL")
Observation: [기사 내용]
Action: fetch_article("기사2 URL")
Observation: [기사 내용]
...
Thought: 수집한 정보를 종합하여 요약한다.
예제 2: 제품 가격 비교
Thought: 노트북 가격을 비교해야 한다.
Action: search_price("삼성 노트북 2026")
Observation: A쇼핑몰 150만원, B쇼핑몰 145만원...
Thought: 배송료와 AS를 포함한 전체 비용을 계산해야 한다.
Action: get_details("B쇼핑몰 배송료")
Observation: 배송료 5000원 무료 배송 조건 100만원 이상
...
의사결정 작업 (Decision-Making Tasks)¶
올바른 판단과 분석이 필수적인 작업:
예제: 투자 의사결정
Thought: 회사 A에 투자할지 판단해야 한다.
Action: analyze_financials("Company A 2025 earnings")
Observation: 수익 증가율 15%, 부채 비율 45%
Thought: 경쟁사와 비교 분석이 필요하다.
Action: analyze_competitors("동일 업종 회사들 2025")
Observation: 산업 평균 수익 증가율 10%
Thought: 위험 요소를 평가한다.
Action: assess_risks("Company A 시장 위험")
Observation: 시장 변동성, 규제 위험 등...
Thought: 종합 분석 결과를 토대로 판단한다.
실전 예제¶
1. 한국 정보 검색 + 추론¶
프롬프트:
당신은 한국 관광 정보 시스템입니다.
다음 질문을 ReAct 방식으로 해결하세요.
질문: 서울에서 볼 수 있는 벚꽃 명소는 어디이고,
2026년 예상 만개 시기는 언제입니까?
Thought: 서울의 벚꽃 명소와 2026년 개화 예측을 찾아야 한다.
Action: search_korean_database("서울 벚꽃 명소")
Observation: 여의도 공원, 남산, 덕수궁, 한강공원 등이 주요 명소
Action: search("2026년 서울 벚꽃 개화 예측")
Observation: 기상청 예측에 따르면 2026년 서울 벚꽃 개화는
3월 28일~4월 5일 예상
Thought: 각 명소의 특징과 함께 정보를 정리한다.
최종 답변:
1. 여의도 공원: 도시 공원 중 가장 많은 벚꽃
2. 남산: 서울 시내를 배경으로 한 벚꽃
3. 덕수궁: 전통 궁궐 배경의 벚꽃
예상 개화: 2026년 3월 28일~4월 5일
2. 다단계 문제 해결¶
프롬프트:
당신은 수학 튜터입니다.
다음 문제를 ReAct 방식으로 풀어주세요.
문제: 서울에서 대구까지 기차 요금은 어떻게 되고,
편도 요금으로 왕복할 경우 총 비용은?
Thought: 현재 서울-대구 기차 요금을 찾아야 한다.
Action: search("KTX 서울 대구 요금 2026년")
Observation: KTX 일반석 58,000원
Thought: 이제 왕복 비용을 계산한다.
Action: calculate(58000 * 2)
Observation: 116,000원
Thought: 혹시 할인 정보가 있는지 확인해보자.
Action: search("KTX 왕복 할인 2026년")
Observation: 왕복 구매 시 5% 할인 가능
Thought: 할인을 적용한 최종 가격을 계산한다.
Action: calculate(58000 * 2 * 0.95)
Observation: 110,200원
최종 답변: 왕복 기차 요금은 일반 가격 116,000원이며,
5% 할인 적용 시 110,200원입니다.
3. 한국 음식 관련 정보 검색¶
프롬프트:
당신은 한국 음식 전문가입니다.
다음을 ReAct 방식으로 해결하세요.
질문: 전주 비빔밥의 특징은 무엇이고,
정통 레시피의 주요 재료는 무엇입니까?
Thought: 전주 비빔밥의 특징과 레시피를 찾아야 한다.
Action: search_korean_food("전주 비빔밥 특징")
Observation: 전주 비빔밥은 산채를 많이 사용하고
고추장양념이 특징
Action: search_recipe("전주 비빔밥 정통 레시피")
Observation: 주요 재료는 소고기, 계란, 고추장,
도라지, 숙주, 고구마, 버섯 등
최종 답변:
특징: 산채의 신선함과 맛, 진한 고추장 양념
주요 재료: 소고기, 달걀, 도라지, 숙주, 고구마,
표고버섯, 고추장, 참기름
외부 도구와의 통합¶
활용 가능한 도구¶
도구 종류 예제
─────────────────────────────────
검색 엔진 Google Search
정보 시스템 Wikipedia API
계산기 Calculator
데이터베이스 SQL Database
웹 스크래핑 BeautifulSoup
API 호출 Weather API, Stock API
코드 실행 Python REPL
도구 통합 예제¶
def react_agent(question):
thought = analyze_question(question)
while not is_complete(thought):
action = decide_action(thought)
if action['type'] == 'search':
observation = search(action['query'])
elif action['type'] == 'calculate':
observation = calculate(action['expression'])
elif action['type'] == 'fetch':
observation = fetch_url(action['url'])
else:
observation = execute_tool(action)
thought = update_thought(thought, observation)
return generate_answer(thought)
CoT와 ReAct 비교¶
| 특성 | Chain-of-Thought | ReAct |
|---|---|---|
| 추론만 사용 | 예 | 아니오 |
| 외부 도구 | 불가 | 가능 |
| 최신 정보 | 제한적 | 가능 |
| 복잡한 작업 | 약함 | 우수 |
| 계산 정확도 | 낮음 | 높음 |
| 구현 복잡도 | 낮음 | 높음 |
| 반복 가능성 | 제한적 | 높음 |
💡 실전 팁¶
효과적인 ReAct 프롬프트
- 명확한 루프 구조: Thought → Action → Observation 반복 명시
- 도구 명시: 사용 가능한 도구 목록 제공
- 종료 조건: "충분한 정보를 수집했을 때 답변하세요" 명시
- 형식 일관성: 매번 같은 형식 사용
- 관찰 통합: 각 관찰을 다음 생각에 명시적으로 반영
ReAct 프롬프트 템플릿
주의사항
- 무한 루프 방지: 최대 반복 횟수 정하기
- 도구 오류: 검색 실패 등 예외 처리
- 정보 신뢰성: 여러 소스에서 검증
- 토큰 소비: ReAct는 많은 토큰 사용
📝 핵심 정리¶
- ReAct는 추론과 행동을 번갈아 수행하는 프레임워크
- Yao et al. (2022)가 제안하여 복잡한 작업에서 성능 향상 입증
- Thought → Action → Observation의 반복 루프
- 외부 도구와 정보를 활용하여 더 정확하고 신뢰할 수 있는 답변 제공
- 지식 집약적 작업과 의사결정 작업 모두에 효과적
- 웹 검색, 계산, 데이터베이스 조회 등 다양한 도구 통합 가능
- CoT보다 복잡하지만 더 강력한 결과 제공
- 대규모 프로젝트와 실전 응용 프로그램에 적극 권장