NeurIPS 2023 [paper]
Noah et al.
10 Oct 2023
Introduction
본 논문에서는 가중치를 업데이트하지 않고 '언어적'인 피드백을 통해 언어 에이전트를 강화하는 Reflexion 프레임워크를 제안하였다. 구체적으로, Reflexion 에이전트는 task feedback 신호를 언어적으로 반영한 다음, 에피소드를 저장하는 메모리 버퍼에 자기성찰을 위한 피드백 텍스트를 저장함으로써, 이후 시도에서 더 나은 decision-making을 할 수 있도록 유도한다. 자기성찰 피드백을 생성하는 것은 모델의 실수를 이해할 수 있고 이를 개선할 수 있는 통찰력을 제공해줄 수 있다.
그렇다면 자기성찰 피드백은 어떻게 생성할까? 저자들은 이를 해결하기 위해 세 가지 방법으로 1) 간단한 이진 환경 피드백, 2) 일반적인 실패 상황에 대한 사전 정의된 휴리스틱들, 3) LLM을 사용한 이진 분류 or 자체적으로 작성한 unit tests (programming task) 와 같은 평가에 대해 탐구하였다. 모든 실행들에서 evaluation 출력 결과는 자연어 요약 형태로서 장기 메모리에 저장되어 증폭된다.
Task는 세 개로 분류하였다.
1. Decision-making 작업은 긴 trajectory에 대해서 순차적으로 각 결정들을 테스트한다.
2. Programming 작업은 에이전트가 외부 도구(컴파일러, 인터프리터)를 효과적으로 사용할 수 있도록 이끈다.
3. Reasoning 작업은 지식이 응축된 내용에 대해 단계를 생성하고 테스트한다.
Reflexion 에이전트는 12 epochs의 학습을 통해 decision-making 성능을 22% 향상시키고, programming 성능을 11% 향상시키고, reasoning 성능을 20% 향상시켰다.
Reflexion: reinforcement via verbal reflection
Reflexion 프레임워크는 세 개의 모듈로 구성되어 있다. 각 모듈마다 LLM을 사용한다.
1. 텍스트와 액션을 생성하는 Actor
2. Actor가 생성한 출력에 대해 점수를 매기는 Evaluator
3. Actor의 자기 개선을 돕기 위해 언어적 강화 신호를 생성하는 Self-Reflection
Actor
Actor는 state를 관찰하고 필요한 텍스트와 액션을 생성하라는 prompt가 구체적으로 명시된 LLM을 기반으로 한다. 기존의 정책 기반 RL 세팅과 유사하게, 시간 t의 정책에서 텍스트 혹은 액션을 생성하고 이는 환경에서 실험된다. 이 떄 모델은 Chain-of-Thought(CoT), ReAct 등으로 실험한다. 또한 이 에이전트에 추가 컨텍스트를 제공하는 메모리 요소도 추가된다.
Evaluator
Evaluator는 주어진 작업 컨텍스트 내에서 Actor에서 생성된 출력의 품질에 대한 reward score를 계산한다. Decision-making 작업은 특정 평가 기준에 맞게 미리 정의된 휴리스틱 함수를 사용한다. Programming 작업은 LLM의 차별화된 인스턴스화 능력을 사용함으로써 LLM 자체를 사용한다. Reasoning은 생성된 출력이 예상 솔루션과 일치하는지 Exact Match(EM) 방법으로 reward function을 탐색한다.
Self-reflection
Self-reflection은 자연어 형태의 자기 성찰을 생성하는 LLM이다. 입력으로 이진 성공 상태(성공/실패), 현재 trajectory 및 메모리와 같은 신호가 주어지면 Self-reflection 모델은 피드백을 생성한다. 그런 다음 스칼라 보상보다 더 유용하다면 이 피드백은 에이전트의 메모리에 저장된다. 예를 들어, multi-step decision-making 작업에서 에이전트가 실패 신호를 수신했다면, 특정 행동 ai가 후속적인 잘못된 행동 ai+1, ai+2로 이어졌다고 추론할 수 있다. 그렇다면 에이전트는 다른 행동 ai'을 취했어야 된다고 자연어로 말할 수 있고 이 경험을 메모리에 저장한다. 후속 시도에서는 에이전트가 과거 경험을 활용하여 ai'을 선택함으로써 decision-making을 조정할 수 있다.
The Reflexion process
Reflexion은 아래 그림과 같은 반복적인 최적화 과정으로 진행된다 (가장 상단의 그림도 같이 참고하면 도움이 된다).
(첫 번째 trial)
1. Actor는 환경과 상호작용하여 trajectory τ0 를 생성한다.
2. Evaluator는 rt = Me(τ0) 로 계산되는 점수 r0 을 계산한다.
(이후 trial)
3. Self-reflection은 {τ0, r0} 을 분석하여 언어 형태로 요약된 피드백 srt 를 생성하고, 메모리 mem에 저장한다.
4. Actor, Evaluator, Self-reflection 모델은 Evaluator가 τt 가 옳다고 판단할 때까지 이를 반복한다.
Experiments
본 실험에서는 decision-making, reasoning 에 대한 자연어 RL 세팅을 평가한다.
Sequential decision making: ALFWorld
ALFWorld는 다양한 대화형 환경에서 에이전트가 multi-step task를 해결하도록 도전하는 텍스트 기반 환경이다. 134개의 ALFWorld 환경에서 이 실험은 서랍에서 주걱 찾기, 도마로 칼 이동 등 6개의 작업들을 에이전트가 실행하도록 한다. 이 때 ReAct를 action generator로 사용한다.
ALFWorld task는 작업이 완료된 경우에만 환경이 신호를 보낼 수 있기 때문에 자연스럽게 self-evaluation를 한다. 이러한 과정을 완전히 자율화하기 위해 LLM과 직접 작성한 휴리스틱을 사용한 자연어 분류라는 두 가지 self-evaluation 기술을 적용했다. 휴리스틱은 에이전트가 동일한 작업을 실행하고 3번 이상의 사이클 동안 동일한 응답을 받거나 현재 환경에서 수행한 작업 수가 30개를 초과하는 경우(inefficient planning) self-reflection을 한다. 에이전트는 self-reflection을 통해 실수를 찾고 메모리를 업데이트하며, 환경을 재설정하고 새로운 시작을 한다.
이 때, LLM의 최대 컨텍스트 제한 때문에 prompt에는 에이전트 메모리의 마지막 3번의 self-reflections로 자른다. 또한 syntactic errors를 방지하기 위해서 에이전트에 두 가지 도메인별 few-shot trajectory를 제공한다. 아래 그림은 Reflexion 예시이다.
ReAct + Reflexion은 hallucinations과 inefficient planning을 감지하기 위해 단순 휴리스틱을 사용하였다. 그 결과 134개의 task 중 130개를 완료했다. 또한 ReAct + Reflexion은 12번의 연속적인 시도에서 학습하면서 추가 작업을 해결하는 방법을 배우는 반면, ReAct 전용은 6번째, 7번째 시도 사이에서 성능이 중단되는 것을 확인할 수 있다.
ALFWorld trajectories에서 일반적인 실패 기준은 에이전트 입장에서는 아이템을 소유하고 있지만, 아이템 입장에서는 소유되지 않는 경우이다. Reflexion은 self-reflection을 이용하여 실패한 trajectorues를 미래에 "self-hints"로 사용함으로써 이러한 경우를 거의 모두 제거한다.
Reasoning: HotpotQA
HotPotQA는 위키피디아 기반 데이터 세트로, 에이전트가 여러 문서에 대해 내용을 추론하도록 도전할 수 있는 데이터셋이다. 추론 능력만 향상시킬 수 있도록 Q -> A 및 Q, Cgt -> A 구현에 대해서 Reflection + Chain-of-Thought(CoT)를 구현했으며, 여기서 Q는 질문, Cgt는 데이터셋의 ground truth 컨텍스트, A는 최종 답변이다. Cgt를 제공하는 이유는, CoT는 multi-step decision-making 기술이 아니기 때문에 텍스트에서 reasoning action을 분리하기 위해서 제공한다. 질문 및 답변 능력을 테스트하기 위해 위키피디아 API를 이용하여 관련 컨텍스트를 검색하고 스텝별로 명시적인 사고를 통해서 답변을 추론할 수 있는 Reflexion + ReAct 에이전트를 구현했다. CoT 구현의 경우 6-shot prompt를 사용하고 ReAct의 경우 2-shot prompt를 사용한다. 예시는 아래와 같다.
Reflexion은 에이전트가 특정 작업에 대해 3번 연속 실패 시도를 할 때까지 경험을 수집하고 실패한 작업을 다시 시도할 수 있도록 했다. 자연스럽게 CoT(GT)에 접근하면서 더 높은 정확도를 달성했다. CoT(GT) 에이전트는 39%에 대한 정답을 올바르게 추론할 수 없지만 Reflexion은 에이전트가 ground truth 없이도 실수를 수정하여 정확도를 약 14% 향상시켰다.
Conclusion
Reflexion은 언어적인 강화 기법으로 에이전트가 과거 실수로부터 배울 수 있도록 가르치는 방법이다. Reflexion 에이전트는 self-reflection을 활용하여 여러 task에서 성능을 대폭 개선하였다. Reflexion의 장단점 살펴보면서 마무리하겠다.
Pros
1. 가볍고 LLM을 fine-tuning할 필요가 없다.
2. 정확한 크레딧 할당이 어려운 스칼라 또는 벡터 보상에 비해 더 미묘한 형태의 피드백을 가능케 한다.
3. 이전 경험에 비해 에피소드 메모리가 더 명확하고 해석 가능한 형태이다.
4. 향후 에피소드의 액션에 대한 더 명확한 힌트를 제공한다.
Cons
1. LLM에 너무 의존하기 때문에 성공에 대한 공식적인 보장이 없다.
2. LLM으로 인한 안전성이나 신뢰성에 위협을 받을 수 있다.
3. Policy optimization 문제이므로 local minima에 빠질 수 있다.
4. 코드 생성 함수, API 상호작용 함수, 하드웨어 사양에 따라 출력이 달라지는 함수 등 정확한 입출력 매핑을 지정하는 데에 있어서 현실적인 한계에 부딪힌다.