Reflexion 완전 정리, 가중치 대신 메모리를 갱신하는 강화학습
요약
- LLM 에이전트가 시행착오로 배우려면 보통 강화학습으로 가중치를 다시 학습해야 합니다. 학습 샘플이 많이 들고 파인튜닝 비용이 비쌉니다.
- Reflexion의 아이디어는 이겁니다. 가중치를 건드리지 말고, 실패를 언어로 복기해 메모리에 적어두고 다음 시도의 프롬프트로 다시 읽게 하자. 논문은 이를 verbal reinforcement learning이라 부릅니다.
- 진짜 기여는 학습 신호를 스칼라 보상에서 자연어 성찰로 바꾼 것입니다. 보상 숫자 하나 대신 "왜 틀렸고 다음엔 뭘 바꿔라"라는 문장을 다음 시도의 컨텍스트에 넣습니다.
- 구조는 셋입니다. Actor(시도), Evaluator(채점), Self-Reflection(복기)이 에피소드 메모리를 매개로 순환합니다.
- 결과는 코딩 HumanEval에서 pass@1 91%, 의사결정 ALFWorld에서 134과제 중 130 완료, 추론 HotpotQA에서 +20%입니다.
- 전제가 둘 있습니다. 성공과 실패를 판정하는 Evaluator, 그리고 재시도가 가능한 과제입니다. 둘 중 하나라도 없으면 성찰이 근거 없는 추측이 됩니다.
1장. 왜 나왔나
1.1 논문 정보
제목 Reflexion: Language Agents with Verbal Reinforcement Learning
저자 Noah Shinn, Federico Cassano, Edward Berman, Ashwin Gopinath,
Karthik Narasimhan, Shunyu Yao
출처 arXiv:2303.11366 (2023년 3월 최초 공개), NeurIPS 2023처음 공개된 v1의 제목은 *"Reflexion: an autonomous agent with dynamic memory and self-reflection"이었고, 이후 NeurIPS 버전에서 *verbal reinforcement learning**이라는 프레이밍과 3모듈 구조로 정리됐습니다.
1.2 시행착오로 배우기가 왜 어려운가
논문 초록이 문제를 짚습니다.
LLM 은 게임과 컴파일러와 API 같은 외부 환경과 상호작용하는
목표지향 에이전트로 점점 많이 쓰이고 있다
그런데 이런 언어 에이전트가
시행착오로부터 빠르고 효율적으로 배우기는 여전히 어렵다
전통적인 강화학습은
많은 학습 샘플과 값비싼 모델 파인튜닝을 요구하기 때문이다1.3 그렇다고 아무것도 안 하면
순수 ReAct 같은 에이전트는
한 번 실패한 경로를 기억하지 못해
다음 시도에서 같은 실수를 반복한다
채점 결과(보상)를 받아도
그 신호가 스칼라 숫자 하나뿐이라
"구체적으로 뭘 어떻게 고쳐야 하는지"가 담기지 않는다Reflexion의 출발점은 여기입니다. 가중치를 다시 학습하는 대신, 실패의 교훈을 말로 남겨 다음 시도에 넘겨주면 되지 않을까?
2장. verbal reinforcement learning
2.1 무엇을 바꿨나
표준 RL
스칼라 보상 ──► 정책 가중치를 갱신
Reflexion
자연어 성찰 ──► 에피소드 메모리를 갱신
갱신 대상이 가중치에서 컨텍스트로 바뀌었다2.2 두 가지 성질
① 가중치가 아니라 메모리를 갱신합니다.
에이전트는 과제 피드백을 언어로 복기하고
그 성찰 텍스트를 에피소드 메모리 버퍼에 쌓아
이후 시도의 의사결정을 개선한다
파인튜닝이 없다
그래서 싸고 빠르고, 무엇보다 해석 가능하다② 피드백의 형태와 출처가 유연합니다.
형태 스칼라 값이든 자유 형식 언어든
출처 외부에서 온 신호든 내부에서 시뮬레이션한 신호든
모두 성찰의 재료가 된다2.3 왜 문장이 숫자보다 나은가
보상 숫자 하나보다 문장 한 단락이 정보 밀도가 높다
"실패, 보상 0"
다음에 뭘 바꿔야 하는지 알 수 없다
"중복 값을 고려하지 않았다. set 으로 중복을 제거한 뒤 정렬하자"
다음 행동이 바로 나온다
그래서 더 적은 시도로 개선된다
그리고 사람이 그 개선 과정을 읽고 이해할 수 있다해석 가능성이 부수효과가 아니라 실무에서 큰 이점입니다. 왜 나아졌는지가 로그로 남습니다.
3장. 3모듈 구조
3.1 전체 루프
① Actor ReAct 나 CoT 로 과제를 시도
행동과 관찰의 시퀀스, 즉 궤적(trajectory)을 만든다
│
▼
② Evaluator 그 궤적에 성공과 실패 신호를 매긴다
단위테스트, 정답 매칭, 휴리스틱, 보상 함수
│
▼
③ Self-Reflection 실패한 궤적과 평가 신호를 함께 보고
"왜 실패했고 다음엔 어떻게 다르게 할지"를 언어로 생성
│
▼
에피소드 메모리에 저장 (최근 N개 유지)
│
└──► 다음 시도의 프롬프트 앞에 붙여 ①로 되돌아감3.2 Actor
ReAct나 CoT 방식으로 과제를 실제로 시도해 궤적을 만듭니다.
Reflexion의 Actor는 보통 ReAct입니다. 즉 Reflexion은 ReAct를 대체하는 게 아니라 그 위에 얹힙니다.
3.3 Evaluator
코딩 단위테스트
QA 정답 매칭
그 밖 휴리스틱이나 보상 함수이 모듈이 없으면 Reflexion이 성립하지 않습니다. 6.2에서 다시 짚습니다.
3.4 Self-Reflection
실패한 궤적과 평가 신호를 함께 보고 "왜 실패했고 다음엔 어떻게 다르게 할지"를 언어로 생성합니다.
이 성찰이 학습 신호의 본체입니다.
3.5 메모리 두 종류
단기 메모리
지금 진행 중인 시도의 궤적. 상태와 행동과 관찰
장기 메모리 (에피소드)
과거 시도들의 성찰 요약 누적장기 메모리가 무한정 커지지 않도록 보통 최근 N개만 유지하는 슬라이딩 윈도를 씁니다.
3.6 오답노트 비유
한 회차 시험(시도)을 치고 채점(Evaluator)한 뒤
틀린 이유를 말로 적은 오답노트(self-reflection)를 남긴다
다음 회차엔 그 오답노트를 펴 놓고 푼다
머리(가중치)를 새로 학습하는 게 아니라
노트(메모리)를 보고 더 잘 푸는 것이다4장. 한 바퀴 따라가기
4.1 과제
"리스트에서 두 번째로 큰 고유값을 반환하라"
4.2 시도 1
Actor
리스트를 정렬해 뒤에서 두 번째 원소를 반환하는 코드를 짠다
Evaluator
단위테스트 실행
입력 [5, 5, 3] 에서 기대값은 3 인데 코드는 5 를 반환
└──► 실패
Self-Reflection
"중복 값을 고려하지 않았다.
'두 번째로 큰 값'이 아니라 '두 번째로 큰 고유값'이므로,
다음엔 set 으로 중복을 제거한 뒤 정렬하자"
└──► 이 문장을 메모리에 저장4.3 시도 2
Actor
메모리의 성찰을 프롬프트로 읽고
sorted(set(xs))[-2] 로 다시 짠다
└──► 단위테스트 통과4.4 여기서 읽어야 할 것
시도 1 과 2 사이에서 가중치는 하나도 안 바뀌었다
바뀐 것은 오직 프롬프트에 얹힌 성찰 한 문장이다
그리고 Evaluator(단위테스트)가 명확한 실패 신호를 주었기에
성찰이 근거 있는 개선책이 될 수 있었다
Evaluator 가 없으면 이 성찰은 그냥 추측이 된다5장. 실험 결과
5.1 세 과제군
| 과제군 | 벤치마크 | 결과 |
|---|---|---|
| 코딩 | HumanEval | pass@1 91%. 당시 SOTA인 GPT-4의 80%를 상회 |
| 의사결정 | ALFWorld | 134과제 중 130 완료, 강한 베이스라인 대비 절대 +22% |
| 추론 | HotpotQA | 베이스라인 대비 +20% |
성격이 전혀 다른 세 과제군에서 통했다는 게 이 논문의 설득력입니다.
5.2 어블레이션, 성찰이 정말 기여하나
이 결과가 중요합니다.
단순 에피소드 메모리만 둔 것 대비
성찰(self-reflection) 이 절대 +8% 의 추가 이득을 준다
즉 "과거 궤적을 그냥 기억"하는 것보다
"실패를 언어로 해석해 기억"하는 것이 확실히 낫다"메모리를 붙였으니 좋아진 것 아니냐"는 반론에 대한 답입니다. 메모리만으로는 부족하고 해석이 들어가야 합니다.
5.3 수치를 읽을 때
위 수치는 특정 base LLM 과 세팅에 의존한다
HumanEval 91% 는 GPT-4 베이스(80%) 대비 값
ALFWorld 는 ReAct + Reflexion 을 12 iterative step 위에서 돌린 결과
벤치마크와 모델이 바뀌면 수치는 달라진다6장. 실무 판단
6.1 이웃 기법과 어떻게 다른가
자리매김이 명확해야 언제 쓸지 판단이 섭니다.
ReAct
한 시도 "안"에서 추론과 행동을 엮는다
Reflexion 은 그 위에 시도 "간" 학습을 더한다
Reflexion 의 Actor 자체가 보통 ReAct 다
Self-Refine
한 과제 "안"에서 출력을 다듬는다
Reflexion 은 과제를 통째로 재시도하는 단위다
Tree of Thoughts, LATS
탐색을 트리로 넓혀 실패를 회피한다
Reflexion 은 탐색을 넓히는 대신 실패를 복기해 다음 시도를 고친다
둘을 결합할 수도 있다비용을 어디에 쓰느냐로 보면 대비가 선명합니다.
같은 예산이라면
ReAct "한 번 더 깊이" 가는 데 쓴다
ToT "한 번에 여러 갈래로" 넓히는 데 쓴다
Reflexion "한 번 더 다시" 시도하는 데 쓴다6.2 두 가지 전제
전제가 깨지면 Reflexion이 작동하지 않습니다.
① Evaluator 가 있어야 한다
성공과 실패를 판정할 수 없으면
성찰이 근거 없는 추측이 된다
② 재시도가 가능해야 한다
한 번에 끝나야 하는 과제에는 적용할 수 없다6.3 비용 구조
시도마다 Actor 의 전체 궤적을 재실행한다
토큰과 지연이 (시도 수 x 시도당 스텝) 에 비례한다
즉 재시도가 싸야 실용적이다여기서 적합한 자리와 부적합한 자리가 갈립니다.
잘 맞는다
오프라인 평가
자동 코드수정
재시도가 싸고 성공 판정이 명확한 배치 작업
부담이 크다
관찰마다 모델을 재호출하는 지연 민감 경로
대화형 검색 같은 실시간 응답6.4 자주 하는 실수 셋
① Evaluator 없이 적용
성찰이 근거 없는 추측이 된다
② 장기 메모리를 무한 누적
컨텍스트가 폭증한다. 슬라이딩 윈도나 요약이 필요하다
③ 무한 재시도 가드 부재
같은 실패를 반복하며 비용만 쓴다세 번째를 위해 시도 상한과 조기 종료 조건을 반드시 둬야 합니다.
6.5 구현
공식 구현
원저자의 레퍼런스 구현이 GitHub 에 공개돼 있다
HumanEval, ALFWorld, HotpotQA 재현 코드 포함
LangGraph
공식 Reflexion 튜토리얼을 제공한다
초안 생성 → 도구 실행으로 사실 확인 → 비평 반영 수정 루프를 그래프로
LlamaIndex
전용 Reflexion 에이전트는 없다
이벤트 기반 Workflows 로 reflection 루프를 직접 구성하는 패턴을 안내7장. 이후 흐름
7.1 발전 계보
| 시기 | 발전 |
|---|---|
| 2023-03 | Reflexion v1. dynamic memory와 self-reflection으로 첫 공개 |
| 2023 (NeurIPS) | verbal reinforcement learning 프레이밍으로 정리. 3모듈 + 에피소드 메모리 정식화 |
| 2024 | 성찰을 단기와 장기, 일화와 의미 메모리로 구조화해 환각을 줄이는 방향 |
| 2024 | Exemplar-Guided Reflection with Memory. 실패뿐 아니라 성공 예시까지 활용 |
| 2025-01 | Agent-R. 성찰을 프롬프트가 아니라 학습으로 내재화 |
7.2 두 갈래 방향
① 성찰을 모델 안으로 넣는 방향
Agent-R 은 MCTS 로 오류에서 정답으로 가는 복구 궤적을 합성하고
step-level 자기훈련으로 가중치에 내재화한다
Reflexion 이 "프롬프트에 얹는" 방식이었다면
이건 "학습으로 굳히는" 방식이다
② 성찰의 재료를 넓히는 방향
실패만 보던 성찰을 성공 예시까지 활용해
샘플 효율과 강건성을 올린다두 방향 모두 Reflexion의 원래 장점(싸고 해석 가능)과 일부 교환 관계에 있습니다. 가중치에 굳히면 해석 가능성이 줄고, 성공 예시까지 모으면 수집 비용이 늡니다.
8장. 정리
8.1 핵심 셋
① 학습 신호를 스칼라 보상에서 자연어 성찰로 바꿨다
이게 진짜 기여다
② 가중치를 안 건드린다
파인튜닝 없이 메모리만으로 시도 사이를 개선한다
그래서 싸고 빠르고 해석 가능하다
③ 공짜가 아니다
Evaluator 가 반드시 있어야 하고
재시도가 불가능하거나 채점이 모호한 과제엔 부적합하다8.2 남는 질문
- 잘못된 성찰이 다음 시도를 오도하는 걸 어떻게 막나. 성찰 자체의 품질을 검증하는 장치가 없습니다.
- 성찰을 어디까지 누적해야 하나. 슬라이딩 윈도의 N이 성능에 얼마나 민감한지는 충분히 보고되지 않았습니다.
- 가중치 내재화와 프롬프트 주입 중 무엇이 나은가. 전자는 반복 비용이 없고 후자는 해석 가능한데, 경계가 아직 불분명합니다.
8.3 용어 정리
| 용어 | 한 줄 뜻 |
|---|---|
| verbal reinforcement learning | 스칼라 보상 대신 자연어 성찰로 개선하는 학습 방식 |
| Actor | ReAct나 CoT로 과제를 실제 시도해 궤적을 만드는 모듈 |
| Evaluator | 궤적에 성공과 실패 신호를 매기는 모듈 |
| Self-Reflection | 실패 원인과 개선책을 언어로 생성하는 모듈 |
| 궤적 (trajectory) | 한 시도에서 만들어진 행동과 관찰의 시퀀스 |
| 에피소드 메모리 | 과거 시도들의 성찰을 누적해 두는 장기 메모리 |
| 슬라이딩 윈도 | 최근 N개 성찰만 유지해 컨텍스트 폭증을 막는 장치 |
| pass@1 | 한 번의 시도로 통과한 비율 |
| across-trial 학습 | 시도와 시도 사이에서 일어나는 개선 |
8.4 참고자료
- Shinn et al., "Reflexion: Language Agents with Verbal Reinforcement Learning" (NeurIPS 2023, arXiv:2303.11366)
- noahshinn/reflexion, 원저자 공식 구현
- Yao et al., "ReAct: Synergizing Reasoning and Acting in Language Models" (ICLR 2023, arXiv:2210.03629)
- Madaan et al., "Self-Refine: Iterative Refinement with Self-Feedback" (NeurIPS 2023, arXiv:2303.17651)
- Yuan et al., "Agent-R: Training Language Model Agents to Reflect via Iterative Self-Training" (arXiv:2501.11425)
'AI Agent > Patterns' 카테고리의 다른 글
| DoT (Division of Thoughts) (0) | 2026.08.11 |
|---|---|
| Plan and Solve (0) | 2025.10.05 |
| ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models (0) | 2024.10.14 |
| ReAct (Reasoning + Acting) (0) | 2024.02.05 |
댓글