안녕하세요, 아오씬나입니다.
지난 글에서 LLM Agent 에 대해 얘기해보며 그 중 가장 먼저 알아야 할 구조인 리액트 패턴에 대해 설명 드렸었는데요.
https://aaoossiinnaa.tistory.com/92
LLM 에이전트 ReAct 패턴: 프롬프트와 루프 구조로 이해하기
안녕하세요 아오씬나입니다. 지난 글에서 AI Agent의 기본적인 개념을 설명한데 이어 이번에는 ReAct 구조를 뜯어보겠습니다.이전 글이 궁금하시다면! 아래 링크를 참고하세요. 오랜만에 블로그 글
aaoossiinnaa.tistory.com
저는 사실 LLM이 태동하고, GPT-3가 나오면서 “이제 정말 쓸만한 AI가 나오는구나” 하는 기대가 커지던 시기에
출산과 육아휴직으로 업을 잠시 떠나 있었습니다.
오늘 다뤄볼 논문이 나온 2022년에도 업을 떠나 있었기 때문에, 논문을 제대로 마주하는 건 사실 처음이에요.
AI 가장 중요한 시기에, 저는 인생에서 가장 중요한 일을 하고 있었으니, 너무 아쉬워 하진 않겠습니다.ㅎ 각설하고 시작할게요!
Title: ReAct: Synergizing Reasoning and Acting in Language Models
Authors: Shunyu Yao, Jeffrey Zhao, Dian Yu, Nan Du, Izhhak Shafran, Karthik Narasimhan, Yuan Cao
(처음 나온 건 2022년 arXiv, 이후 ICLR 2023로 알려져 있습니다.)
저는 이 논문이 “프롬프트 예쁘게 만드는 법”이라기보다, Agent가 왜 루프/제어 문제인지를 초반에 아주 직관적으로 보여준다는 점에서 여전히 참고할 만하다고 느꼈습니다.
다만 2022년 논문이라, 지금 기준으로 보면 구식으로 보일 수 있는 부분도 분명 있고요(그 얘기도 아래에 같이 적어둘게요).
배경을 한 문장으로 요약하면 이거였던 것 같습니다.
- 추론(CoT) 은 그럴듯하지만, 외부 근거 없이 “머리 속에서만” 굴리다 보면 환각이나 오류 전파가 생기기 쉽다.
- 행동(Acting) 만 시키면, 계획을 업데이트하거나 예외를 처리하는 “생각”이 약해질 수 있다.
- 그래서 둘을 섞어서, 모델이 추론 흔적(reasoning traces) 과 행동(actions) 을 번갈아 생성하게 해보자.
이걸 논문에서는 “시너지(synergizing)”라는 표현으로 제목부터 계속 밀고 갑니다.
추론이 행동을 더 똑똑하게 만들고, 행동이 추론을 더 사실에 붙게 만든다… 이런 그림이죠.
[Contribution]
1) Reasoning과 Acting을 교차(interleaved)로 생성하는 프롬프트 패러다임 제시
“생각 → 행동 → 관찰 → 생각…” 같은 트레이스를 명시적으로 텍스트로 남기게 만들었습니다. 이게 지금 보면 단순해 보이지만, 당시엔 “LLM이 환경과 상호작용하면서 문제를 푼다”를 설득력 있게 보여줬습니다.
2) 지식형 과제에서 CoT의 환각/오류 전파를 외부 행동으로 완화
HotpotQA(멀티홉 QA), FEVER(팩트체크)에서 위키피디아 같은 외부 지식에 질의하는 액션을 끼워 넣으면서, CoT가 겪는 문제를 “상호작용”으로 완화할 수 있다고 주장합니다.
3) 인터랙티브 환경에서도 프롬프트만으로 성능 향상
ALFWorld, WebShop 같은 “행동을 순서대로 해야 하는” 환경에서, 강화학습/모방학습 기반 베이스라인보다 성공률이 크게 올랐다고 보고합니다.
저는 이 파트가 의미 있었던 게, “LLM 에이전트는 결국 RL 해야 하는 거 아냐?”라는 생각에 한 번 제동을 걸어줍니다. 적어도 강화학습을 적용하지 않더라도, 프롬프트와 루프만으로도 효과가 있다는 걸 숫자로 증명했기 때문입니다.
4) 추론 트레이스를 통한 디버깅 가능성 제시
논문/구글 리서치 블로그에서 “사람이 추론 문장 하나를 고쳐주면 이후 행동이 그 방향으로 정렬되는” 식의 HITL(human-in-the-loop) 사례를 보여줍니다.
이게 왜 중요하냐면, Agent가 망가질 때 보통 “왜 저렇게 했는지”가 안 보이거든요.
ReAct는 적어도 흔적을 남기니까, 디버깅이 가능하다. 최소한 어느 부분에서 잘못 생각했는지가 보인다는 의미입니다.

Figure 1은 Standard / CoT / Act-only / ReAct를 같은 문제에 적용했을 때 결과가 어떻게 달라지는지 보여줍니다.
특히 ReAct는 단순히 생각을 더 길게 쓰는 것이 아니라, 행동과 관찰을 통해 답을 점점 수정해 나간다는 점에서 차이가 있다는 것을 저자는 강조하고 싶어 합니다.
실험에 사용된 환경은 두 가지입니다.
- HotpotQA
대규모 지식 기반 QA 데이터셋 - ALFWorld
텍스트 기반 강화학습 환경
논문의 Figure 1은 이 네 가지 방법이 같은 문제를 어떻게 해결하는지를 비교해서 보여줍니다.
논문들을 읽다보면, 우리 모델이 최고다. 우리 방법론이 SOTA를 달성했다!고 추켜세우기 바쁩니다만, 이 논문은 그래도 솔직하더라고요.

하지만 이 논문에서는 기존 CoT와 적절히 융합해 더 나은 결과를 만드는 방법을 설명한 문단이 있어 의미있습니다.
- ReAct(Reason+Act)는 위키 같은 외부 지식에 직접 가서 확인하니까 결과가 더 “팩트에 붙는” 느낌이 납니다.
(grounded / factual) - 반면 CoT(생각만 하는 방식)는 논리 구조를 만드는 데는 강하지만, 근자감있게 틀릴 수 있습니다.
한 번 헛다리를 디디면 그럴듯한 문장으로 계속 밀어붙이기도 하고요.
그래서 저자들이 제안하는 건 단순합니다.
“내 머리(내부 지식)만으로 확실하지 않을 때는 외부로 나가서 확인하고,
외부에서도 길이 막히면 내부에서 여러 번 다시 생각해보자.”
여기서 중요한 건, 이걸 “감”으로 하지 않고 스위칭 규칙(heuristics) 으로 써놨다는 점입니다.
1) ReAct → CoT-SC: “찾아봤는데도 답이 안 나오면, 생각 모드를 켠다”
ReAct를 돌려도 답이 안 나오는 경우가 있습니다.
- 검색 결과가 계속 빗나가거나
- Observation을 보고도 다음 액션을 제대로 못 잡거나
- 스텝만 계속 늘어나면서 결론이 안 나는 경우
이럴 때 논문은 “무한정 더 돌리지 말고”, 정해진 스텝 안에 답을 못 찾으면 CoT-SC로 백오프하라고 제안합니다.
여기서 CoT-SC는 그냥 CoT가 아니라, 여러 번 생각을 샘플링해서(여러 개 CoT) 다수결로 답을 고르는 방식입니다.
즉 한 번의 추론이 아니라 여러 번 생각해서 가장 일관된 답을 뽑는 쪽으로 가는 거죠.
이건 실무적으로도 납득이 됩니다.
검색이 계속 실패할 때는 검색어를 바꾸는 것도 한계가 있으니, 차라리 내부 지식으로 가능한 답을 여러 각도에서 재검증해보는 게 낫습니다.
2) CoT-SC → ReAct: “생각을 여러 번 해도 결론이 안 모이면, 외부로 나간다”
반대로, CoT-SC를 돌렸는데도 답이 한쪽으로 모이지 않는 경우가 있습니다.
- 샘플링한 CoT들이 각자 다른 답을 내놓고
- 다수결이 애매하거나
- 과반이 나오지 않는 수준으로 흩어질 때
논문은 이걸 “내부 지식만으로는 확신이 없는 상황”으로 보고, 그때는 ReAct로 전환하라고 합니다.
이 전환은 인간 사고랑 꽤 비슷합니다.
“내가 아무리 머리로 굴려도 답이 안 나오네 → 확인하러 가자(검색/조회)”
즉, CoT-SC의 “불확실성”을 스위치 신호로 쓰는 겁니다.
진짜 사람이 생각에 빠져 행동을 못하는 경우, 일단 행동을 했을때 답이 나와버리는 경우와 동일한 방식으로 동작하게 됩니다.
초기 LLM 연구에서 기여를 많이 한 논문입니다만, 2026년 현재에도 여전히 유효한지는 따져볼 필요가 있습니다.
- 구식으로 보일 수 있는 부분
- 당시 예시는 “Action: … / Observation: …” 같은 텍스트 포맷에 많이 기대고 있습니다. 실무에서는 이게 파싱이 깨지기 쉬워서, 요즘은 구조화된 tool call(JSON 스키마/함수 호출) 쪽이 훨씬 일반적입니다.
- 또 하나는, 요즘 상용 모델들은 보안/안전/품질 때문에 “생각을 길게 노출”하는 방향을 피하는 경우가 많습니다. 그래서 ReAct의 reasoning trace를 그대로 사용자에게 다 보여주기보단, 내부 로그로만 쓰거나 요약만 남기는 식으로 바뀌는 편입니다(이건 구현/정책 선택의 영역).
- 그럼에도 여전히 남아 있는 부분
- “모델이 행동을 선택 → 시스템이 실행 → 결과를 다시 넣고 반복”이라는 루프 자체는 지금도 에이전트의 기본입니다. ReAct라는 이름을 안 붙여도, 형태는 거의 같습니다.
제가 궁금한 건 GPT가 현재도 ReAct 패턴을 따르냐? 는 부분이었습니다.
- ChatGPT/GPT가 내부적으로 ‘ReAct 프롬프트’를 그대로 쓴다 라는 명제 자체를 참이라고 답할 수는 없습니다.
- 다만, OpenAI가 공식 문서에서 안내하는 tool calling/agent 실행 흐름은 ReAct와 매우 닮아 있습니다.
예를 들어 OpenAI의 function/tool calling 가이드는 “모델이 tool call을 만들고 → 애플리케이션이 실행하고 → 결과를 다시 모델에 넣고 → 최종 답(또는 추가 tool call)” 같은 다단계 흐름을 설명합니다.
또 OpenAI Agents SDK 문서도 “LLM 출력에 tool call이 있으면 실행하고 결과를 붙여서 루프를 다시 돈다 / final_output이면 종료 / max_turns로 제한” 같은 형태를 명시합니다.
GPT가 ‘ReAct’라는 이름을 쓰는지는 확인할 수 없지만,
OpenAI가 공개한 에이전트/툴 사용 방식은 “행동-관찰-반복” 루프를 기본으로 하고 있고, 그 구조는 ReAct와 같은 계열이라고 볼 수 있다.
오랜만에 논문을 읽으니, 일주일에 하나..는 아니더라도 2주에 하나라도 꾸준히 읽어야 겠다는 생각이 듭니다.
새롭게 등장하는 기술에 대해서도, 그리고 고전(?)에 대해서도 관심있게 들여다보겠습니다.
ReAct는 오래된 논문이지만, Agent를 이해하는 출발점으로는 여전히 좋은 논문이었습니다.
오늘도 읽어주셔서 감사합니다. : )
참고자료:
Paper (arXiv): https://arxiv.org/abs/2210.03629
Project page: https://react-lm.github.io/
Google Research blog: https://research.google/blog/react-synergizing-reasoning-and-acting-in-language-models/
Official code: https://github.com/ysymyth/ReAct
OpenAI tool calling flow: https://developers.openai.com/api/docs/guides/function-calling/
OpenAI Agents SDK loop: https://openai.github.io/openai-agents-python/running_agents/
댓글