🤖 AI/ML

ReAct

Reasoning and Acting

추론과 행동을 교차하는 에이전트 프레임워크. 복잡한 작업 해결에 효과적.

📖 상세 설명

ReAct(Reasoning and Acting)는 LLM이 추론(Reasoning)과 행동(Acting)을 교차하며 복잡한 문제를 해결하는 프롬프팅 프레임워크입니다. 단순히 답을 생성하는 것이 아니라, 생각하고, 도구를 사용하고, 결과를 관찰하는 사이클을 반복하여 더 정확한 결과를 도출합니다.

ReAct는 2022년 Google Research와 Princeton에서 발표되었습니다. 기존 Chain-of-Thought(CoT)는 추론만 수행하고 외부 정보를 활용하지 못했고, Action-only 방식은 맥락 없이 도구만 사용했습니다. ReAct는 이 둘을 결합하여 추론과 행동의 시너지를 창출했습니다.

ReAct의 핵심은 "Thought-Action-Observation" 루프입니다. 먼저 현재 상황을 분석하고(Thought), 필요한 도구나 API를 호출하고(Action), 결과를 확인한 뒤(Observation) 다음 단계를 결정합니다. 이 과정이 목표 달성까지 반복됩니다.

실무에서 ReAct는 AI 에이전트의 핵심 패턴으로 자리잡았습니다. LangChain, LlamaIndex 등 주요 프레임워크가 ReAct 패턴을 기본 지원하며, 웹 검색, 데이터베이스 조회, API 호출 등 다양한 도구와 결합하여 복잡한 태스크를 자동화합니다.

💻 코드 예제

LangChain을 활용한 ReAct 에이전트 구현 예제입니다.

# pip install langchain langchain-openai duckduckgo-search
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
from langchain_community.tools import DuckDuckGoSearchRun

# 1. 도구 정의
search_tool = DuckDuckGoSearchRun()
tools = [search_tool]

# 2. LLM 초기화
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 3. ReAct 프롬프트 로드
prompt = hub.pull("hwchase17/react")

# 4. ReAct 에이전트 생성
agent = create_react_agent(llm, tools, prompt)

# 5. 에이전트 실행기
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # Thought-Action-Observation 출력
    max_iterations=5,
    handle_parsing_errors=True
)

# 6. 실행
result = agent_executor.invoke({
    "input": "2024년 노벨 물리학상 수상자와 그들의 연구 주제는?"
})

print(f"최종 답변: {result['output']}")

# 출력 예시:
# Thought: 2024년 노벨 물리학상 정보를 검색해야겠다
# Action: duckduckgo_search
# Action Input: 2024 Nobel Prize Physics winner
# Observation: 검색 결과...
# Thought: 수상자 정보를 찾았다. 정리해서 답변하겠다
# Final Answer: ...

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"단순 RAG로는 실시간 정보 반영이 안 되니까 ReAct 에이전트로 웹 검색 도구를 연결하면 최신 정보도 답변할 수 있어요."
💬 면접에서
"ReAct의 핵심은 Thought-Action-Observation 루프입니다. 추론과 행동을 분리하여 LLM의 계획 능력을 극대화합니다."
💬 기술 토론에서
"ReAct 에이전트의 한계는 루프가 길어지면 컨텍스트가 부족해진다는 점이에요. 중간 요약이나 메모리 시스템을 추가하면 개선할 수 있습니다."

⚠️ 흔한 실수 & 주의사항

무한 루프 방지 미설정: max_iterations 없이 실행하면 에이전트가 무한 반복할 수 있습니다. 항상 최대 반복 횟수를 설정하세요.
도구 설명 부실: 도구의 description이 불명확하면 LLM이 적절한 도구를 선택하지 못합니다. 명확하고 구체적인 설명을 작성하세요.
에러 핸들링 추가: handle_parsing_errors=True로 파싱 에러를 처리하고, 도구 실패 시 대체 로직을 구현하세요.

🔗 관련 용어

📚 더 배우기