에이전트 리플렉션
에이전트가 자신이 만든 결과나 궤적을 스스로 비평하고, 그 비평을 문장으로 남겨 다음 시도의 입력에 끼워 넣어 결과를 고치는 루프입니다. 기준 시점: 2026-10
Java의 리플렉션과는 이름만 같고 관련이 없습니다. 그쪽은 런타임에 클래스 구조를 들여다보는 기능이고, 여기서 말하는 리플렉션은 에이전트가 자기 행동을 돌아보는 과정입니다.
왜 필요한가
에이전트 루프는 환경 피드백을 받아 다음 행동을 고르지만, 그 피드백은 보통 "이 툴 호출이 무엇을 반환했다" 수준입니다. 작업 전체가 왜 실패했는지, 다음 시도에서 무엇을 바꿔야 하는지는 그 안에 들어 있지 않습니다. 실패한 궤적을 그대로 다시 넣으면 모델은 같은 실패를 되풀이하기 쉽습니다.
리플렉션은 실패와 그 원인을 말로 정리한 문장을 만들어 다음 시도에 함께 넣습니다. Reflexion 논문은 이를 가중치를 갱신하지 않는 강화라고 설명하며 "verbal reinforcement learning"이라 부릅니다. 비평 문장을 에피소드 메모리 버퍼에 쌓아 다음 시도의 행동을 바꾸는 방식이라, 모델을 재학습시키지 않고 프롬프트만으로 학습 효과를 노린다는 점이 특징입니다.
구조
Reflexion은 역할을 세 개의 LLM 컴포넌트로 나눕니다.
┌──────────── mem (에피소드 메모리) ────────────┐
│ 지난 시도의 자기비평 문장 (보통 1~3개) │
└───────────────────┬───────────────────────────┘
│ 다음 시도의 입력에 끼워 넣는다
▼
Actor ──▶ 궤적 τ 생성 (행동과 관찰의 기록)
│
▼
Evaluator ──▶ 궤적에 점수를 매긴다
│ (정답 일치 / 휴리스틱 / 단위 테스트)
▼
Self-Reflection ──▶ 점수와 궤적을 읽고 "무엇이 왜 틀렸는지"를 문장으로 쓴다
│ └──▶ mem에 추가
└────────────────────────────────────────▶ 다음 시도로
Evaluator가 통과시키거나 최대 시도 횟수에 닿으면 종료
- Actor: 관찰을 받아 행동을 생성한다. 논문은 Chain-of-Thought와 ReAct를 Actor로 실험했다
- Evaluator: 궤적을 채점한다. 추론 과제는 정답 일치, 의사결정 과제는 직접 만든 휴리스틱, 프로그래밍은 LLM이나 스스로 생성한 단위 테스트를 쓴다
- Self-Reflection: 희소한 보상 신호와 궤적을 읽어 언어 피드백으로 바꾼다
메모리는 두 층입니다. 지금 시도의 궤적 기록이 단기 메모리, 자기비평 문장이 쌓이는 mem이 장기 메모리입니다. mem은 무한히 쌓지 않고 저장 경험 수에 상한을 두는데, 논문은 보통 1~3개를 쓴다고 밝힙니다(AlfWorld는 최근 3개, 프로그래밍은 1개).
비평을 누가 주는가
같은 "스스로 고치기"라도 비평의 근거가 어디서 오는지가 다릅니다.
- Self-Refine: 한 모델이 생성자·비평자·수정자를 모두 맡는다. 외부 신호 없이 자기 출력만 보고 피드백을 만든다
- Reflexion: Evaluator가 환경에서 온 신호(테스트 통과 여부, 과제 성공 여부)를 점수로 만들고, 그 점수를 근거로 비평을 쓴다
이 차이가 다음 절의 수렴 문제로 바로 이어집니다.
비용과 수렴 문제
리플렉션은 공짜가 아닙니다. 한 번의 시도가 생성·채점·비평·재시도로 늘어나 LLM 호출 수와 지연이 배로 늘고, 궤적과 비평이 함께 들어가므로 컨텍스트도 커집니다.
더 근본적인 문제는 외부 신호 없는 자기 수정이 잘 수렴하지 않는다는 점입니다. Huang 등은 모델이 자기 능력만으로 답을 고치는 것을 intrinsic self-correction이라 부르고, 추론 과제에서는 외부 피드백 없이 모델이 자기 답을 제대로 고치지 못하며 오히려 성능이 떨어지는 경우도 있다고 보고합니다(ICLR 2024).
Reflexion 논문도 스스로 한계를 적어둡니다.
- 정책 최적화 기법이므로 국소 최솟값에 갇힐 수 있다
- 메모리가 용량이 제한된 슬라이딩 윈도우다
- 테스트 기반 채점은 비결정적·하드웨어 의존적·동시성 코드에서 잘 동작하지 않고, 불안정한 테스트는 거짓 통과를 만든다
- 다양한 탐색이 필요한 과제(WebShop)에서는 ReAct를 유의미하게 넘지 못했다
주의사항
- 채점 신호를 먼저 만든다. 환경에서 오는 점수(테스트 결과, 성공 판정)가 없으면 비평은 근거 없는 추측이 된다
- 시도 횟수에 상한을 둔다. 통과 조건과 최대 시도 횟수가 없으면 비용만 쓰며 같은 자리를 돈다
- 비평을 무한히 쌓지 않는다. 원 논문도 1~3개로 제한한다. 쌓을수록 컨텍스트만 늘고 최근 실패가 묻힌다
- 붙이면 좋아진다고 가정하지 않는다. 성능이 떨어질 수 있다고 보고 전후를 측정한다
핵심 정리
- 가중치를 바꾸지 않고 비평을 문장으로 남겨 다음 시도에 끼워 넣는 루프
- Reflexion은 Actor·Evaluator·Self-Reflection으로 역할을 나누고, 비평을 에피소드 메모리에 1~3개만 유지한다
- 비평의 근거가 환경에서 온 신호인지 모델의 자기 판단인지가 효과를 가른다
- 외부 피드백 없는 자기 수정은 추론 과제에서 성능을 떨어뜨릴 수 있다 — 측정 없이 믿지 않는다