한줄 요약: 가중치 업데이트 없이, 자연어 자기 반성을 에피소딕 메모리에 저장하여 LLM 에이전트가 실수에서 학습한다.
| 항목 | 내용 |
|---|---|
| 저자 | Noah Shinn, Federico Cassano, Ashwin Gopinath, Karthik Narasimhan, Shunyu Yao |
| 소속 | Northeastern University, MIT, Princeton University |
| 발표 | NeurIPS 2023 |
| 링크 | arxiv.org/abs/2303.11366 |
| 키워드 | Self-Reflection, Agent Memory, Gradient-free Learning |
LLM 에이전트는 한 번 실패하면 같은 실수를 반복한다. RL로 가중치를 업데이트하면 해결되지만, 이는 비용이 크고 범용 능력을 해칠 수 있다. ReAct 같은 프롬프팅 방식은 한 에피소드 내에서는 추론하지만, 에피소드 간 학습(cross-episode learning) 은 불가능하다.
핵심 질문: 파라미터를 건드리지 않고, 에이전트가 과거 실수에서 학습하는 방법이 있는가?
┌─────────────────────────────────────────────────┐
│ Actor: 환경에서 행동하는 LLM 에이전트 │
│ ↓ 행동 궤적(trajectory) │
│ Evaluator: 결과를 평가 (성공/실패 + 구체적 피드백) │
│ ↓ 평가 결과 │
│ Self-Reflection: 실패 원인을 자연어로 분석 │
│ ↓ 반성 내용 │
│ Episodic Memory: 반성을 저장, 다음 시도에 제공 │
└─────────────────────────────────────────────────┘
시도 1: 함수 구현 → 테스트 실패
에러: IndexError: list index out of range
Self-Reflection:
"빈 리스트 입력을 처리하지 않아 IndexError가 발생했다.
다음 시도에서는 입력 검증을 먼저 수행하고,
edge case(빈 리스트, 단일 원소)를 테스트해야 한다."
시도 2: 반성 참조 → 입력 검증 추가 → 테스트 통과 ✓
| 방법 | 에피소드 내 학습 | 에피소드 간 학습 | 가중치 업데이트 |
|---|---|---|---|
| Standard Prompting | ✗ | ✗ | ✗ |
| ReAct | ✓ | ✗ | ✗ |
| RL (PPO 등) | ✓ | ✓ | ✓ (비용 높음) |
| Reflexion | ✓ | ✓ | ✗ |
| 벤치마크 | 태스크 유형 | 기존 SOTA | Reflexion | 향상 |
|---|---|---|---|---|
| HumanEval | 코드 생성 | 80.1% | 91.0% | +10.9%p |
| MBPP | 코드 생성 | 72.0% | 77.1% | +5.1%p |
| AlfWorld | 가사 태스크 (텍스트) | 75.0% | 97.0% | +22.0%p |
| HotPotQA | 다단계 QA | 34.0% | 51.0% | +17.0%p |
| 시도 | pass@1 |
|---|---|
| 1회 (baseline) | 80.1% |
| 2회 (1회 반성) | 88.3% |
| 3회 (2회 반성) | 91.0% |
| 4회 | 91.3% (수렴) |
→ 2-3회 반성으로 대부분의 개선이 달성됨. 4회 이상은 한계 수익 체감.
저자들이 수작업으로 반성 내용의 품질을 분석:
Reflexion의 핵심 인사이트는 "반성의 내용 자체가 프롬프트 엔지니어링이 된다"는 것이다. 첫 시도의 실패 경험이 자연어로 요약되어 다음 시도의 프롬프트에 추가되면, 이는 사실상 경험 기반의 자동 프롬프트 최적화다.
실전 적용 관점에서 가장 유용한 시나리오는 코드 생성이다. 테스트 케이스가 구체적인 에러 피드백을 제공하고, 코드의 정답/오답이 명확하기 때문이다. 반면 "좋은 에세이를 써라" 같은 태스크에서는 피드백이 모호해서 반성의 질이 떨어진다.
DeepSeek-R1의 RL 기반 자기 개선과 비교하면 흥미로운 대비가 있다: R1은 가중치를 업데이트하여 능력 자체를 향상시키고, Reflexion은 가중치를 고정한 채 프롬프트를 개선한다. 전자가 더 근본적이지만, 후자는 기존 모델을 그대로 활용할 수 있다는 실용적 이점이 있다.
관련 논문: ReAct, Self-RAG, Inner Monologue, LATS