-
Reflexion: language agents with verbal reinforcement learning카테고리 없음 2026. 5. 4. 21:35반응형
type: paper
source: https://arxiv.org/abs/2303.11366
Reflexion: language agents with verbal reinforcement learning
항목 내용 저자 Noah Shinn, Federico Cassano, Beck Labash, A. Gopinath, Karthik Narasimhan, Shunyu Yao 연도 2023 arXiv 2303.11366 분야 인용 수 3033 (Semantic Scholar 기준)
1. 배경 및 문제 정의
기존 LLM 에이전트는 실패로부터 학습하려면 모델 가중치를 업데이트(fine-tuning)해야 했다. 이 방식은 세 가지 근본적 제약을 안고 있다. 첫째, 대규모 학습 데이터셋이 필요하여 비용이 크다. 둘째, 모델 가중치에 직접 접근할 수 없는 API 전용 모델에서는 적용 자체가 불가능하다. 셋째, 매번 전체 파라미터를 갱신해야 하므로 소규모 태스크 단위의 경량 학습이 어렵다.
인간은 실패 후 "왜 틀렸는지"를 언어로 반추(verbal reflection)하여 다음 시도에 반영한다. 그러나 LLM 에이전트에는 이러한 자기 반성 메커니즘이 부재했다. Reflexion은 이 간극을 메우기 위해 제안된 프레임워크로, 언어적 강화(verbal reinforcement)를 핵심 원리로 삼는다. 스칼라 보상(scalar reward, 숫자 하나로 표현되는 보상 신호) 대신 자연어 피드백을 생성하여 에피소딕 메모리(episodic memory, 과거 경험을 저장하는 슬라이딩 윈도우 버퍼)에 축적하고, 후속 시도의 프롬프트에 주입한다. 모델 가중치는 고정된 채로, 프롬프트 컨텍스트만 변경하여 행동을 개선하는 것이 핵심이다.
2. 핵심 기여
Reflexion은 네 가지 기여를 제시한다.
- Reflexion 패러다임: 가중치 업데이트 없이 자연어 반성만으로 에이전트가 학습하는 새로운 접근법
- 자기 반성의 창발적 속성 입증: 충분히 큰 LLM에서 자기 반성 능력이 자연스럽게 나타남을 실험으로 확인
- LeetcodeHardGym 벤치마크 공개: 기존 벤치마크보다 난이도 높은 코드 생성 평가셋 제공
- HumanEval SOTA 달성: 91% pass@1로 당시 최고 성능 기록
프레임워크의 장점은 다음 네 가지로 요약된다.
- 경량성: fine-tuning 없이 프롬프트만 변경하므로 API 전용 모델에서도 즉시 적용 가능
- 세밀한 피드백: 스칼라 보상 대신 자연어로 구체적 개선 방향을 제시
- 해석 가능한 메모리: 메모리 내용이 자연어이므로 사람이 직접 읽고 디버깅 가능
- 명시적 행동 지침: 다음 시도에 대한 구체적 수정 방향을 포함
3. 아키텍처
3.1 세 모듈 구조
Reflexion은 세 개의 독립 모듈로 구성된다.
Actor (): LLM 기반 행동 생성기로, 환경 관찰 를 입력받아 행동 를 출력한다. 내부적으로 Chain-of-Thought(단계적 사고) 또는 ReAct(추론+행동 교차) 프롬프팅을 사용한다. 핵심은 Actor가 단독으로 정책을 구성하지 않는다는 점이다. 정책은 로 표현되며, 으로 매개변수화된다. 즉, Actor의 가중치와 메모리 내용을 합쳐서 하나의 정책으로 본다. 가중치는 고정된 채 메모리만 갱신되므로, 역전파(backpropagation) 없이 정책이 개선된다.
이 정책 매개변수화는 이론적으로 중요하다. 전통적 강화학습에서 정책은 신경망 가중치로만 정의되지만, Reflexion에서는 "고정된 LLM + 변하는 메모리"가 정책이다. 이는 문맥 내 학습(in-context learning)의 일종으로, 프롬프트에 포함되는 정보를 바꿔서 행동을 변화시키는 메커니즘이다.
Evaluator (): Actor가 생성한 궤적(trajectory, 행동의 연속 기록)을 평가하여 스칼라 보상 를 산출한다. 도메인에 따라 평가 방식이 달라진다.
평가 방식 설명 적용 도메인 정확 매칭(EM) 정답과 출력을 문자열 비교 QA 태스크 휴리스틱 함수 환경 제공 규칙 기반 점수 의사결정 태스크 LLM 기반 평가 별도 LLM이 출력 품질 판정 정답 불명확 태스크 Self-Reflection (): Reflexion의 핵심 차별 모듈이다. Evaluator의 스칼라 보상을 자연어 피드백으로 변환한다. 단순히 "실패"라는 신호 대신, "2단계에서 검색 쿼리가 너무 광범위했고, 특정 연도로 한정했어야 했다"와 같은 구체적 진단을 생성한다. 이 자연어 반성이 장기 메모리에 저장된다.
3.2 이중 메모리 구조
메모리는 두 계층으로 분리된다.
- 단기 메모리(Short-term memory): 현재 에피소드의 궤적 전체 (). 매 에피소드마다 초기화된다. Actor가 현재 시도의 맥락을 유지하는 데 사용한다.
- 장기 메모리(Long-term memory): 과거 시도들에서 생성된 자기 반성 텍스트의 목록. 에피소드 간 유지되며, 슬라이딩 윈도우 방식으로 최대 개(보통 1~3개)까지 보관한다.
구성 요소 메모리 상한 비고 장기 메모리 1~3 슬라이딩 윈도우 단기 메모리 제한 없음 (현재 에피소드) 매 시도마다 초기화 를 작게 설정하는 이유는 LLM의 컨텍스트 윈도우 제한과, 오래된 반성이 현재 상태와 무관해질 수 있기 때문이다.
3.3 반복 최적화 루프
Algorithm 1: Reflexion ──────────────────────────────────────── 입력: Actor M_a, Evaluator M_e, Self-Reflection M_sr 메모리 상한 Ω, 최대 시도 횟수 max_trials 초기화: mem ← [] for trial = 1 to max_trials do 1. 궤적 생성: τ ← M_a(환경, mem) # Actor가 메모리 참조하여 행동 생성 2. 평가: r ← M_e(τ) # Evaluator가 궤적 채점 3. 성공 여부 확인: if r == 성공 then return τ # 성공 시 종료 4. 자기 반성 생성: sr ← M_sr(τ, r) # 실패 원인을 자연어로 진단 5. 메모리 갱신: mem ← mem + [sr] # 반성을 메모리에 추가 if |mem| > Ω then mem ← mem의 최근 Ω개만 유지 # 슬라이딩 윈도우 end for이 루프의 핵심은 기울기(gradient) 계산이 전혀 없다는 점이다. 전통적 강화학습이 로 가중치를 업데이트하는 것과 달리, Reflexion은 로 메모리만 갱신하여 정책을 개선한다.
3.4 모듈 입출력 예시
Actor 입력 (ReAct 스타일):
이전 반성(장기 메모리): - "이전 시도에서 'pick up' 전에 대상 물체의 위치를 확인하지 않아 실패했다. 먼저 goto로 이동한 뒤 pick up을 실행해야 한다." 현재 관찰: 당신은 방 한가운데 있습니다. 책상 위에 열쇠가 보입니다. 태스크: 열쇠를 서랍에 넣으세요.Actor 출력:
Thought: 이전 반성을 참고하면, 먼저 물체 위치로 이동해야 한다. Action: goto desk 1 Observation: 책상 위에 열쇠 1이 있습니다. Action: pick up key 1Self-Reflection 출력:
"drawer 2로 이동했지만 실제로 열어야 할 서랍은 drawer 3이었다. open 명령의 대상을 현재 위치의 서랍과 일치시켜야 한다. 다음 시도에서는 goto drawer 3 → open drawer 3 → put key 1 in drawer 3 순서로 실행할 것."4. 관련 연구 비교
4.1 추론 및 의사결정 영역
Self-refine은 LLM이 자신의 출력을 반복 개선하는 방식이지만, 외부 환경의 숨겨진 제약(hidden constraints, 사전에 명시되지 않은 환경 규칙)을 처리하지 못하고 이진 보상(binary reward, 성공/실패만 알려주는 신호)에서 작동하지 않는다. Beam search 기반 접근은 자기 정제와 숨겨진 제약 대응 능력을 갖추고 여러 후보를 동시에 탐색하지만, 실패 경험을 메모리에 축적하는 메커니즘이 없어 동일한 실수를 반복할 수 있다.
Reflexion은 다섯 가지 속성을 모두 갖춘 유일한 프레임워크다.
방법론 자기 정제 숨겨진 제약 순차적 의사결정 이진 보상 메모리 Self-refine O X X X X Beam search O O O O X Reflexion O O O O O AlfWorld에서 "책상 위 펜을 찾아라" 태스크 실패 시, Reflexion 에이전트는 "이전 시도에서 책상 위만 확인했지만 서랍을 열어보지 않았다. 다음에는 서랍을 먼저 열어 내부를 확인해야 한다"와 같은 자기 반성을 생성한다. 이 반성이 메모리에 저장되어 다음 에피소드의 프롬프트에 추가된다. Self-refine은 이런 메모리 축적 없이 현재 출력만 반복 수정하므로 에피소드 간 학습이 불가능하다.
4.2 프로그래밍 영역
방법론 테스트 실행 디버깅 자체 테스트 생성 다중 언어 자기 반성 AlphaCode O X X O X CodeT O X O X X Self-Debugging O O X X X CodeRL O O X X X Reflexion O O O O O AlphaCode는 수백만 개 후보를 생성한 뒤 클러스터링으로 해를 찾으며, 대규모 샘플링에 의존하므로 연산 비용이 극히 높다. CodeT는 LLM 자체 생성 테스트로 후보를 필터링하지만 반복 개선이 없다. Self-Debugging은 코드 실행 결과를 보고 수정하지만 주어진 테스트에만 의존한다. CodeRL은 강화학습 보상 모델을 사용하지만 자연어 수준의 반성이 부재하다.
Reflexion은 테스트 실행, 디버깅, 자체 테스트 생성, 다중 언어 지원, 자기 반성을 모두 갖춘 유일한 접근법이다.
5. 실험 결과
5.1 의사결정: AlfWorld
AlfWorld는 텍스트 기반 가상 가정환경에서 에이전트가 물건을 찾고, 이동하고, 조작하는 태스크다. 총 134개 환경이 6종 태스크 유형(Pick, Clean, Heat, Cool, Examine, Pick Two)으로 구성된다.
자기 평가 메커니즘. 두 가지 방식이 비교된다.
- 휴리스틱 자기 평가: 동일한 행동을 3회 연속 반복하거나, 총 행동 수가 30을 초과하면 "실패"로 판정하고 반성을 트리거한다. LLM 호출 없이 규칙만으로 작동하므로 비용이 없다.
- GPT 자기 평가: GPT-3가 궤적 전체를 읽고 성공/실패를 판단한다. 더 유연하지만 비용이 발생한다.
실험 결과 휴리스틱 방식이 충분히 효과적이었다.
성능 결과:
방법 완료 수 (/134) 완료율 비고 ReAct (baseline) ~103 ~77% 시도 6-7회차에서 정체 ReAct + Reflexion 130 ~97% 12회 시도 기준 지표 값 Baseline 환각율(hallucination rate) 22% 개선 폭 ~22%p 초기 급등 구간 시도 1→2회차 Baseline 정체 구간 시도 6-7회차 미완료 태스크 4/134 학습 곡선 패턴. 12회 시도에 걸친 학습 곡선에서 두 가지 뚜렷한 패턴이 관찰된다. 첫째, 첫 2회 시도에서 완료율이 급격히 상승한다. 첫 실패에서 얻은 반성이 가장 정보량이 높기 때문이다. "어디를 찾아봤는데 없었다"는 정보가 다음 시도의 탐색 범위를 즉시 좁혀준다. 둘째, 시도 3~11회차에서 느리지만 꾸준히 개선된다. 반면 baseline은 시도 6~7회차에서 정체하며, 환각율이 약 22%에 수렴한다. 즉, baseline은 아무리 많은 시도를 해도 약 1/5의 태스크에서 환각에 의한 실패를 극복하지 못한다.
장기 메모리 활용 패턴.
- 패턴 1 — 단일 에피소드 깊은 분석: 한 번의 긴 시도(예: 30 action) 내에서 초기에 잘못된 방향으로 간 지점을 반성이 정확히 짚어내고, "처음부터 다른 위치를 먼저 확인하라"는 구체적 대안 계획을 제시한다.
- 패턴 2 — 다중 에피소드 탐색 기억 축적: 시도 1에서 "desk 1, desk 2를 확인했지만 목표 물체 없음", 시도 2에서 "shelf 1, shelf 2도 없음"과 같이 탐색 결과가 누적되면, 시도 3에서는 미확인 위치만 남아 효율적 탐색이 가능해진다.
구체적 예시: mug + desklamp 태스크.
태스크 목표는 "mug을 desklamp 아래에서 관찰하라"이다.
시도 1 (실패):
Think: mug을 찾아야 한다. desk 1을 확인하자. Act: go to desk 1 Obs: On desk 1, you see a mug 1, a pen 2, ... Act: take mug 1 from desk 1 Obs: You pick up mug 1 from desk 1. Think: 이제 desklamp를 찾아야 한다. desk 2로 가보자. Act: go to desk 2 Obs: On desk 2, you see a desklamp 1, a book 3, ... Act: use desklamp 1 Obs: Nothing happens. Act: use desklamp 1 [동일 행동 반복 → 실패 판정]자기 반성:
mug을 desk 1에서 집은 뒤 desk 2의 desklamp로 이동하여 사용하려 했지만 실패했다. 다음에는 desklamp가 있는 위치를 먼저 파악하거나, mug이 이미 desklamp와 같은 위치에 있다면 그 자리에서 바로 사용해야 한다.시도 2 (성공):
[메모리에 시도 1의 반성이 로드된 상태] Think: 이전 반성을 참고하면, mug을 집은 위치에서 바로 desklamp를 사용해야 한다. Act: go to desk 1 Obs: On desk 1, you see a mug 1, a desklamp 1, a pen 2, ... [실제로 desk 1에 둘 다 있었지만, 시도 1에서는 desklamp 존재를 간과] Act: take mug 1 from desk 1 Act: use desklamp 1 Obs: Task completed!이 예시는 반성이 실패의 근본 원인(위치 이동 후 사용 불가)을 정확히 진단했고, 이를 바탕으로 시도 2에서 전략 자체를 변경(같은 위치에서 모든 조작 수행)하여 성공한 과정을 보여준다.
5.2 추론: HotPotQA
HotPotQA는 다중 문서를 조합해 답해야 하는 멀티홉 질의응답 벤치마크로, 113k 문제 중 100문제를 샘플링하여 평가했다. 평가 지표는 정확 매칭(EM, 모델 출력과 정답이 문자열 수준에서 정확히 일치하는지 판정)이다.
세 가지 Actor 설정:
- CoT (Chain-of-Thought): 질문만 입력으로 받아 6-shot 예시를 참고하며 모델 내부 지식만으로 답한다.
- CoT GT (Ground Truth context): 질문과 함께 정답 도출에 필요한 실제 지원 문서를 제공한다. 검색 오류를 제거하고 순수 추론 능력만 측정하는 상한선(oracle) 역할이다.
- ReAct: Wikipedia API를 통해 실시간 검색-관찰-행동 루프를 수행한다.
핵심 발견: Baseline의 확률적 개선 불가.
세 baseline 모두 temperature 0.7로 샘플링하더라도 후속 시도에서 이전 실패 문제를 확률적으로 해결하지 못한다. 같은 프롬프트를 반복 실행해도 실패 패턴이 고착되어 무작위 변동만으로는 정답에 도달하지 못하며, 이는 단순 재시도가 아닌 구조화된 피드백 메커니즘의 필요성을 직접 보여준다. 3회 연속 실패 시 해당 문제에 대한 시도를 종료하는 조건이 적용된다.
성능 결과:
설정 Baseline 정확도 Reflexion 정확도 CoT GT ~61% ~75% CoT GT 설정에서 39%의 미해결 문제 중 14%를 추가로 해결하여, 정답 문서가 주어진 상황에서도 추론 실패가 발생하며 자기 반성이 이를 교정할 수 있음을 입증한다.
Ablation 분석 (CoT GT 기준):
단계 상대 향상 CoT GT baseline 기준 + EPM (궤적 메모리 포함) 일부 향상 + Self-Reflection EPM 대비 +8% 이 ablation은 단순히 이전 시도 기록을 보여주는 것보다, 실패 원인을 자연어로 명시적으로 분석하는 자기 반성이 더 효과적임을 입증한다. Self-reflection이 궤적에서 핵심 오류를 추출하고 요약하는 역할을 하여, 모델이 다음 시도에서 더 정확한 교정 방향을 잡을 수 있게 한다.
다중 모델 결과 (100문제):
전략 모델 Baseline Reflexion CoT GT text-davinci-003 0.60 0.77 CoT GT gpt-3.5-turbo 0.57 0.71 CoT GT gpt-4 0.68 0.80 ReAct text-davinci-003 0.30 0.55 ReAct gpt-3.5-turbo 0.26 0.38 ReAct gpt-4 0.39 0.51 모델 규모가 클수록 Reflexion의 절대 성능이 높아지며, gpt-4에서 가장 큰 향상을 보인다. 자기 반성의 품질이 모델의 기본 추론 능력에 의존하기 때문으로, 더 강력한 모델이 더 정확한 반성문을 생성하여 후속 시도의 교정 효과가 커진다. 한편 ReAct + text-davinci-003에서 가장 큰 절대 향상(+0.25)이 관찰되어, 일정 임계 규모 이상에서는 상대적으로 약한 모델일수록 개선 폭이 클 수 있음을 시사한다.
구체적 예시들:
- 검색 전략 수정(ReAct): "'Allo 'Allo!" 관련 질문에서 첫 시도에 프로그램 제목을 직접 검색하지만 관련 정보를 찾지 못해 실패한다. 반성 후 "프로그램 제목 대신 출연 배우인 Sam Kelly를 검색해야 한다"는 피드백을 생성하고, 두 번째 시도에서 정답에 도달한다.
- 과도한 일반화 수정(CoT): 두 인물의 직업을 비교하는 질문에서 첫 시도에 한 인물의 직업을 지나치게 넓은 범주로 일반화하여 오답을 낸다. 반성에서 "구체적인 직업명을 사용해야 한다"는 피드백을 생성하고 정답에 도달한다.
- 추론 경로 교정(CoT GT): 지원 문서가 주어졌음에도 문서 내 정보를 잘못 연결하여 오답을 내는 경우, 반성을 통해 어떤 정보가 어떤 대상에 해당하는지 정리한 뒤 정답에 도달한다.
5.3 코드 생성
코드 생성 실험은 5개 벤치마크에서 수행된다: HumanEval Python, HumanEval Rust, MBPP Python, MBPP Rust, LeetcodeHardGym.
자기 생성 테스트 파이프라인.
코드 생성 도메인에서는 외부 스칼라 피드백을 구하기 어렵기 때문에, 에이전트가 스스로 테스트를 만들어 자기 코드를 검증한다. 절차는 다음과 같다.
- CoT 기반 테스트 생성: 문제 설명을 입력으로 받아 LLM이 단위 테스트를 생성
- AST 유효성 필터링: 생성된 테스트를 추상 구문 트리(Abstract Syntax Tree) 파싱하여 문법적으로 유효하지 않은 테스트를 제거
- 최대 6개 샘플링: 유효한 테스트 중 최대 6개를 선택하여 테스트 스위트 구성
에이전트는 생성한 코드를 이 테스트 스위트에 대해 실행하고, 모든 테스트를 통과하면 시도를 종료한다. 실패하면 Self-Reflection 모듈이 실패 원인을 분석하여 메모리(, 가장 최근 반성 1개만 유지)에 저장한다.
pass@1 결과:
(※ GPT-4의 HumanEval Python 결과 80.1%와 MBPP Python 결과 80.1%는 모두 공식 테이블 기준 값이나, 본문 텍스트에서는 82% vs 80%로 약간 다르게 기술된 부분이 있다 — 논문 내부 불일치)
모델 HumanEval PY HumanEval RS MBPP PY MBPP RS LeetcodeHard GPT-4 80.1 - 80.1 - - CodeT + GPT-3.5 65.8 - - - - CodeT + Codex - - 67.7 - - Reflexion + GPT-4 91.0 68.0 77.1 75.4 15.0 벤치마크별 분석:
- HumanEval Python: 91.0% pass@1로 GPT-4 대비 약 11%p 향상하여 SOTA 달성. 자기 생성 테스트의 거짓 양성(FP, false positive — 틀린 코드가 테스트를 통과하는 현상) 비율이 1.4%로 극히 낮아 테스트 스위트 신뢰도가 높다.
- HumanEval Rust: 68.0% pass@1로 SOTA. Rust는 타입 시스템이 엄격하여 AST 필터링 단계에서 잘못된 테스트가 더 효과적으로 걸러진다.
- MBPP Python: 77.1%로 GPT-4에 미달하는 유일한 벤치마크다. FP 비율이 16.3%로, HumanEval의 1.4% 대비 약 12배 높다. MBPP 문제들이 HumanEval보다 설명이 모호하여 LLM이 정확한 테스트를 생성하기 어렵기 때문이다. FP가 높으면 틀린 코드가 테스트를 통과하여 에이전트가 조기 종료(premature termination)한다.
- MBPP Rust: 75.4%로 SOTA. Python보다 오히려 나은 이유는 Rust 컴파일러의 정적 검사가 추가 필터 역할을 하여 FP를 줄이기 때문으로 추정된다.
- LeetcodeHardGym: 15.0%로 SOTA이나 절대 수치는 낮다. 경쟁 프로그래밍 수준의 고난도 문제로 LLM의 근본적 추론 한계에 부딪힌다.
거짓 양성 분석:
벤치마크 FP 비율 의미 HumanEval PY 1.4% 테스트 신뢰도 높음 MBPP PY 16.3% 틀린 코드가 테스트 통과 빈번 Ablation 분석 (HumanEval Rust, 최고 난이도 50문제):
구성 pass@1 baseline 대비 Baseline (반성 제거) 0.60 - 테스트 생성 제거 0.52 -0.08 (하락) 반성 제거 (테스트만) 0.60 0.00 (동일) 전체 Reflexion 0.68 +0.08 (개선) 테스트 생성을 제거하면 baseline 이하로 하락한다. 테스트 없이 반성만 하면 정오 판단 기준이 없어 이미 맞는 코드를 "틀렸다"고 잘못 판단하여 유해한 편집(harmful edits)이 발생한다. 테스트만 있고 반성이 없으면 baseline과 동일하다. 두 구성요소가 반드시 함께 작동해야 시너지가 발생한다.
5.4 모델 규모와 창발적 속성
starchat-beta(소형 오픈소스 모델)에서 Reflexion을 적용한 결과, 효과가 전혀 없었다.
모델 방법 Pass@1 표준편차 starchat-beta Baseline 0.26 ~0.005 starchat-beta Reflexion 0.26 ~0.003 이는 자기 수정(self-correction) 능력이 대형 모델에서만 나타나는 창발적 속성(emergent quality)임을 시사한다. 모델이 자신의 오류를 인식하고 개선 방향을 자연어로 정확히 표현하려면 일정 수준 이상의 추론 능력이 전제되어야 한다. 임계 규모 미만의 모델에 Reflexion을 적용하면 메모리 저장·검색의 계산 비용만 추가되고 성능 이득은 없다.
6. 한계 및 향후 방향
6.1 근본적 한계
LLM 자기 평가 능력 의존. Self-Reflection 모듈은 LLM이 자신의 실패 원인을 정확히 진단할 수 있다는 전제에 의존한다. 모델의 추론 능력이 부족하거나 실패 원인이 모델의 지식 범위 밖에 있으면, 반성 내용 자체가 부정확해져 오히려 후속 시도를 악화시킬 수 있다.
수렴 보장 부재. Reflexion은 시행착오 루프를 반복하지만, 반드시 정답에 도달한다는 수학적 보장이 없다. 잘못된 반성이 축적되면 같은 실수를 반복하거나, 메모리에 모순된 지침이 쌓여 성능이 정체될 수 있다.
공로 귀속(credit assignment) 문제. 궤적이 길어질수록 어느 행동이 실패를 유발했는지 특정하기 어렵다. 10단계 행동 중 3단계의 오류가 7단계에서야 드러나는 경우, Self-Reflection이 7단계를 잘못 지목할 수 있다.
반성 품질 저하 루프. 잘못된 반성이 메모리에 저장되면, 다음 시도의 Actor가 잘못된 지침을 따라 더 나쁜 결과를 만들고, 이에 대한 반성이 다시 오염된 메모리 위에 쌓이는 악순환이 발생할 수 있다. 이를 방지하는 자체 검증 메커니즘은 아키텍처에 포함되어 있지 않다.
6.2 탐색 다양성 부족
WebShop에서 100개 환경을 대상으로 4회 시도 후에도 성능 개선이 전혀 없었다.
시도 횟수 성능 변화 1 기준선 2 개선 없음 3 개선 없음 4 개선 없음 WebShop은 넓은 탐색 공간에서 다양한 전략을 시도해야 하는 태스크로, 반성이 기존 전략의 미세 조정에 편향되어 완전히 다른 접근법을 시도하지 못하는 경향이 있다. 자연어 반성만으로는 행동 공간의 근본적 재탐색을 유도하기 어렵다.
6.3 메모리 윈도우 한계
슬라이딩 윈도우 방식의 에피소딕 메모리는 시도 횟수가 많아지면 초기의 유용한 반성이 밀려나 손실될 수 있다. 또한 메모리가 길어지면 LLM의 컨텍스트 윈도우를 압박하여 Actor의 행동 생성 품질이 저하된다. 를 크게 설정하면 정보 보존은 좋아지지만 컨텍스트 압박이 심해지는 트레이드오프가 존재하며, 최적값은 태스크마다 다르다.
6.4 자기 생성 테스트의 구조적 취약점
코드 생성에서 다음 네 가지 유형의 함수에서는 자기 생성 테스트가 근본적으로 부적합하다.
- 비결정적(non-deterministic) 함수: 랜덤 요소가 포함되어 동일 입력에 다른 출력이 나오는 함수
- 비순수(impure) 함수: 파일 I/O, 네트워크 호출 등 부수 효과가 있는 함수
- 하드웨어 의존 함수: GPU 연산, 특정 아키텍처 의존 코드
- 동시성(concurrent) 함수: 멀티스레드/비동기 코드에서 실행 순서에 따라 결과가 달라지는 경합 조건(race condition) 문제
또한 자기 생성 테스트의 거짓 양성 문제는 Reflexion의 반복 개선 메커니즘 자체를 무력화하는 구조적 취약점이다. 틀린 코드가 테스트를 통과하면 에이전트가 더 이상 반복을 시도하지 않는다.
6.5 향후 방향
저자들은 두 가지 확장을 제안한다.
- 자연어 가치 학습(value learning in natural language): 보상 함수 자체를 자연어로 학습하는 방향. 현재는 외부 평가자가 이진 피드백을 주지만, 가치 판단까지 언어적으로 수행하는 것이 목표다.
- 비정책 탐색(off-policy exploration): 현재 Reflexion은 자기 경험만 반성하는 정책 내(on-policy) 방식인데, 다른 에이전트의 경험이나 외부 시연을 활용한 탐색 다양성 확보가 필요하다. 이는 WebShop local minima 문제의 직접적 해결책이 될 수 있다.
6.6 해석 가능성과 안전성
Reflexion이 제시하는 언어적 강화학습 패러다임은 두 가지 상반된 함의를 갖는다. 긍정적으로는, 반성 내용이 자연어로 기록되므로 에이전트의 학습 과정이 사람에게 해석 가능하다. 전통적 강화학습에서 가중치 변화로만 표현되던 학습이 명시적 텍스트로 남아 진단 가능해진다. 부정적으로는, 자기 개선 능력이 자동화되면 잘못된 목표를 추구하는 에이전트가 사람의 개입 없이 전략을 정교화하는 안전 위험이 증폭된다.
참고: 핵심 선행 연구
- ReAct: 추론(Reasoning)과 행동(Acting)을 교차하는 프롬프팅 프레임워크. Reflexion의 Actor 모듈 기반으로 사용됨
- Chain-of-Thought(CoT): 중간 추론 단계를 명시적으로 생성하여 LLM의 복합 추론 능력을 향상시키는 프롬프팅 기법
- Self-refine: LLM이 자신의 출력을 반복 개선하는 방식. 에피소드 간 메모리 축적이 없어 Reflexion과 차별화
- AlphaCode: 대규모 코드 후보 생성 + 클러스터링으로 프로그래밍 문제를 해결. 높은 연산 비용이 단점
- CodeT: LLM 자체 생성 테스트로 코드 후보를 필터링. 반복 개선 메커니즘 부재
- Self-Debugging: 코드 실행 결과를 보고 수정하는 방식. 주어진 테스트에만 의존
- CodeRL: 강화학습 보상 모델로 코드 디버깅 수행. 자연어 반성 부재
반응형