https://arxiv.org/abs/2311.05772
LLM을 Agent로 사용하는 방식엔 크게 두 가지이다.
1. 다음 작업을 반복적으로 결정
2. LLM을 통해 계획 생성, 하위 작업을 실행
그러나 이러한 방법들은 하위 작업들을 실패하면 작업이 실패해 버린다
-> 계획을 실행할 수 없는 경우 다시 재귀적으로 분해하여 문제를 해결하는
As-Needed Decomposition And Planning for complex Tasks(ADaPT)를 제안한다.
이 이미지가 너무 명확하게 ADaPT를 설명해줍니다.
Excutor에게는 간결한 언어 작업 사양이 제공됩니다. LLM을 통해 Action을 진행하고, 환경과 반복적으로 상호작용하며 완료되거나, 설정된 최대 반복 제한까지 계속됩니다.
Task를 원자 수준의 명령(엄청 단순한 명령)을 조합하여 해결하고, Task가 완성되었는지, 실패했는지에 대해 판단하여 복잡한 작업을 해결합니다.
Planner는 복잡한 작업을 더 작은 3~5개의 하위 작업으로 나눕니다.
머그컵의 위치가 어디있는지도 모르는데 10단계의 세부적인 목표를 세우는 것은 연쇄오류가 발생할 수 있기에 동적으로 간결하게 나눈다고 합니다.
And와 Or연산자를 통해 순차적인 작업은 And, 알수 없는 상황에서 탐색이 필요한 경우 Or을 통해 확인한다고 합니다.
Controller는 작업이 실패하면 Planner를 호출하여 점차 세부적으로 목표를 나눕니다.
이러한 전반적인 함수와 같은 역할을 담당합니다.
성능이 모든 면에서 좋은 것은 아니지만 그래도 평균은 제일 높습니다.
모델을 바꿔서 사용해도 성능이 오름을 볼 수 있다.
그저 단일 사용을 이겼을 뿐이지만....
1. 문제 정의 및 해결 목표
기존의 대형 언어 모델(LLMs)을 활용한 의사결정 및 계획 수립에서, 복잡한 작업 수행 시 실패율이 높다는 문제가 있습니다.
특히 두 가지 기존 접근 방식에 한계가 있었습니다:
- Iterative Executors (반복 실행자): 매 단계마다 다음 행동을 예측하지만, 작업이 길어지거나 복잡해질 때 진행 실패.
- Plan-and-Execute (계획 및 실행): 전체 계획을 한 번에 수립하고 실행하지만, 하위 작업 중 하나라도 실패하면 전체 작업이 중단.
📝 해결 목표
복잡한 작업에서도 높은 성공률을 유지하기 위해:
- 작업 도중 실패 시 동적으로 하위 작업을 추가 분해.
- 언어 모델(LLM)의 실행 능력과 작업 복잡도에 따라 적응적으로 계획을 조정.
2. 제안 방법: ADaPT (As-Needed Decomposition and Planning for complex Tasks)
ADaPT는 필요 시 동적 분해 및 계획을 수행하는 새로운 방법입니다.
핵심 아이디어
- 초기에는 전체 작업을 직접 실행 시도.
- 실패 시, LLM 기반 계획자(Planner)를 호출하여 해당 하위 작업을 더 작은 작업으로 분해.
- 분해된 작업을 다시 실행자(Executor)가 수행.
- 필요 시 재귀적으로 반복하여 작업 성공률을 높임.
시스템 구성 요소
- LLM Executor: 실제 작업 실행 담당.
- LLM Planner: 실패 시 작업을 적절히 분해하여 실행 가능하게 만듦.
- Controller:
- Executor가 실패하면 Planner 호출.
- 최대 분해 깊이(dmax)에 도달하거나 작업 성공 시 종료.
3. 실험 설정 및 데이터셋
세 가지 환경에서 실험을 진행했습니다:
환경 | 설정 | 목표 |
ALFWorld | 가상 가정 내 탐색 및 물체 조작 작업 | 예: "깨끗한 머그컵을 책상 위에 두기" |
WebShop | 웹 상의 실제 제품 검색 및 구매 | 예: "가격이 $30 이하인 물병 구매" |
TextCraft | Minecraft 유사 환경에서 아이템 제작 작업 | 예: "벌집 제작을 위해 재료 수집 및 조합" |
4. 실험 결과 및 성능 분석
🔑 ADaPT vs 기존 방법 비교
모든 데이터셋에서 ADaPT가 가장 높은 성공률을 기록했습니다.
방법 | ALFWorld | WebShop | TextCraft |
ReAct | 43.3% | 32.0% | 19.0% |
Plan-and-Execute | 43.3% | 17.0% | 27.0% |
Reflexion | 57.5% | 35.0% | 32.0% |
ADaPT (제안 방법) | 71.6% | 44.0% | 52.0% |
✅ 성능 향상 폭:
- ALFWorld: +28.3%p (기존 최고 대비)
- WebShop: +9%p
- TextCraft: +20%p
5. 상세 분석
5.1. 분해 깊이(dmax)와 성능 관계
- 분해 깊이가 증가할수록 성능 향상.
- dmax=1 (반복 실행만) < dmax=2 (간단 분해 추가) < dmax=3 (심층 분해) 순으로 성능 개선.
5.2. 작업 복잡도와 적응력
TextCraft에서 레시피 깊이 증가 시 성능 분석:
깊이 | ReAct | ADaPT |
깊이 2 | 26.9% | 78.2% |
깊이 3 | 1.8% | 38.7% |
👉 복잡할수록 ADaPT의 효과가 더 두드러짐.
5.3. 다양한 LLM과의 호환성
GPT-3.5, GPT-4, LLaMA-2 등 다양한 LLM에서 테스트:
- 모든 모델에서 ADaPT 사용 시 성능 개선 확인.
- LLaMA-2 (성능 낮음) → 최대 +15%p 향상
- GPT-4 (성능 높음) → 최대 +37%p 향상
5.4. 플래너-실행자 모델 혼합 사용
- 강력한 플래너(GPT-3.5) + 가벼운 실행자(LLaMA-2) 조합 시:
→ 실행자 단독 대비 +22.9%p 성능 증가. - ✅ 비용 절감 + 성능 유지 가능.
6. 한계 및 향후 방향
한계
- 실행 성공 여부 판단의 주관성: LLM 자체 평가가 과대평가될 수 있음.
- 특히 WebShop에서 30% 이상의 성공률 차이 발생.
향후 개선 방향
- 외부 검증 시스템 추가: 실행 성공 여부의 정확성 향상.
- 다중 모델 협력(Theory of Mind): 모델 간 상호 피드백으로 평가 보완.
- 보다 정밀한 분해 전략 연구: 불필요한 과분해 방지 및 효율성 확보.
7. 결론 및 기여
🎯 핵심 기여 요약
✅ 동적 작업 분해: 실행 실패 시 필요할 때만 하위 작업 추가 분해.
✅ 높은 성공률 달성: 기존 최고 방법 대비 최대 +33%p 성능 향상.
✅ 작업 복잡도 및 LLM 능력에 맞춘 적응적 계획.
✅ 다양한 모델과 호환성 확보 및 비용 효율적 구조 제시.
🔍 연구자 관점의 인사이트
이 논문은 기존의 단일 접근 방식에서 벗어나, 실행 실패 시 필요에 따라 적응적으로 계획을 수정하는 접근법을 제시합니다.
👉 AGI 개발 및 다중 에이전트 시스템에 시사점
- 모델 자율성 강화: 실패 시 자체 해결 능력 확보.
- 효율적 자원 분배: 불필요한 작업 반복 최소화.
- 다중 에이전트 협력 연구에 응용 가능: 각 에이전트가 ADaPT 방식을 적용하면 보다 안정적인 협력 가능.
📚 1. 관련 연구 및 기존 접근 방식
LLM(Large Language Models)을 활용한 의사결정 및 계획 수립에는 크게 두 가지 접근 방식이 존재합니다:
📝 1.1 반복 실행 기반 (Iterative Executors)
대표 방법: ReAct [(Yao et al., 2023b)]
- 작동 방식:
- 작업을 단계별로 예측하며 즉각 실행.
- 각 단계에서 "생각(Thought)" → "행동(Action)" → "관찰(Observation)" 반복.
- 장점:
- 간단한 작업에서 빠른 피드백과 실행.
- 환경 변화에 즉각 반응 가능.
- 단점:
- 작업이 복잡하거나 단계가 길어질수록 실패 확률 증가.
- 전체 계획이 머릿속에 있어야 하며, 긴 실행 이력으로 인한 혼란 및 오류 발생.
- 부분 작업 실패 시 재시도 시에도 동일한 오류 반복.
📝 1.2 계획 후 실행 기반 (Plan-and-Execute)
대표 방법: Plan-and-Solve [(Wang et al., 2023b)], Reflexion [(Shinn et al., 2023)]
- 작동 방식:
- 전체 작업을 미리 계획하여 정적인 계획 수립 후 실행.
- 계획자는 상위 작업을 몇 개의 하위 작업으로 분해하고, 실행자는 이를 수행.
- 장점:
- 복잡한 작업에서 긴 실행 경로 관리 용이.
- 진행 상황을 추적하며 일부 실행 실패 시 피드백 기반 재시도 가능.
- 단점:
- 계획 수립 시 작업 난이도를 정확히 예측하기 어려움.
- 초기 계획에서 단일 하위 작업 실패 시 전체 작업 실패.
- 계획이 비적응적이라 환경 변화나 실패 상황을 동적으로 처리하지 못함.
🚀 2. ADaPT의 혁신적 접근 및 기존 방식과의 차별점
🌟 2.1 ADaPT의 핵심 혁신점
- 실행 도중 실패 시에만 필요할 때 작업을 동적 분해:
- 기존의 고정된 계획과 달리, 성공 가능한 가장 작은 작업 단위를 찾아가며 실행.
- 재귀적 계획 및 실행 구조:
- 실패 시 작업을 점진적으로 더 작은 하위 작업으로 분해하며 문제 해결.
- 작업 복잡도와 LLM 실행 능력에 따라 적응적 계획 수립.
- 실행자의 자체 평가 기반 실행 성공 여부 판단.
🆚 2.2 기존 방식 대비 ADaPT의 장점 요약
비교 항 | 반복 실행(ReAct) | 계획 후 실행(Plan and Execution) | ADaPT |
실행 실패 시 대응 | 동일 방법 반복, 오류 반복 | 실패 시 전체 계획 재수립 필요 | 실패 시 하위 작업 추가 분해 후 재시도 |
작업 복잡도 처리 | 복잡할수록 오류 및 실패 증가 | 일정 복잡도 이상 시 계획 실행 불가 | 복잡할수록 동적 분해로 안정적 수행 |
계획 유연성 | 계획 없음 | 초기 고정 계획 (비적응적) | 필요할 때만 계획 수정 (적응적) |
실행 시간 | 짧은 작업에 빠름, 긴 작업에 시간 소모 | 초기 계획 시간 소요, 실패 시 재계획으로 지연 | 실패 시만 추가 계획, 평균 시간 절감 |
모델 자원 사용량 | 반복 실행으로 모델 호출 증가 | 고정 계획으로 모델 호출은 제한적이나 실패 시 추가 호출 | 필요 시 호출로 자원 효율적 사용 |
환경 변화 대응력 | 낮음 | 낮음 | 높음 (실패 시 바로 계획 수정) |
📊 3. 실험 결과에서 나타난 기존 방식 대비 ADaPT의 우수성
🔥 3.1 주요 데이터셋별 성능 비교
방법 | ALFWorld | WebShop | TextCraft |
ReAct | 43.3% | 32.0% | 19.0% |
Plan-and-Execute | 43.3% | 17.0% | 27.0% |
Reflexion | 57.5% | 35.0% | 32.0% |
ADaPT (제안 방법) | 71.6% | 44.0% | 52.0% |
✅ 성능 향상 주요 포인트
- 복잡한 환경(ALFWorld): +28.3%p 향상
- 실제 웹 탐색(WebShop): +9%p 향상
- 복합적 제작 작업(TextCraft): +20%p 향상
🧪 3.2 복잡도 증가 시 기존 방식과의 차이
레시피 깊이 ReAct Plan-and-Execute ADaPT
깊이 | ReAct | Plan-and-Execute | ADaPT |
깊이 2 | 26.9% | 27.0% | 78.2% |
깊이 3 | 1.8% | 3.2% | 38.7% |
🔎 분석:
- 기존 방식은 복잡도 증가 시 급격한 성능 저하.
- ADaPT는 실패 시 동적 분해를 통해 복잡한 작업도 안정적 처리.
🏆 4. ADaPT의 적용 및 확장 가능성
🧠 4.1 다양한 LLM 조합 및 비용 효율성
- 강력한 플래너(GPT-3.5) + 경량 실행자(LLaMA-2) 사용 시:
→ 실행자 단독 대비 +22.9%p 성능 증가 - ✅ 비용 절감과 성능 유지 모두 달성 가능
🤖 4.2 사용자님의 연구에의 시사점
- 다중 에이전트 시스템:
- 각 에이전트가 ADaPT 구조를 따를 경우 자율적 문제 해결 능력 강화
- 협력적 연구 환경에서 에이전트 간 동적 역할 분배 가능
- LLM의 지속 학습 시스템 구현:
- 실패와 성공 경험을 통한 자체 계획 최적화 가능
📝 5. 결론 및 핵심 차별점 요약
✅ 실패 시만 계획 분해하여 불필요한 계산 최소화.
✅ 작업 복잡도 및 LLM 실행 능력에 따라 적응적으로 계획 변경.
✅ 기존 방식 대비 최대 +33%p의 성능 개선.
✅ 환경 변화 대응력 및 자원 효율성에서 우수함.
👉 사용자님의 AI 연구 및 다중 에이전트 시스템 개발에 ADaPT 적용 시:
- 에이전트 자율성 향상
- 다중 모델 조합으로 비용 절감 + 성능 유지
- 동적 분해를 통한 안정적 연구 진행 가능
이 논문이 사용자님의 AI 연구에 실질적 도약을 제공하길 바랍니다! 😊
이 부분은 ADaPT에서 LLM Executor가 어떻게 동작하는지, 그리고 그 과정에서 자체 성공 판단(Heuristic)을 어떻게 사용하는지에 대한 설명입니다. 이 내용은 ADaPT 시스템에서 작업을 어떻게 실행하고 판단하는지를 이해하는 데 중요한 핵심 요소입니다.
1. Executor와 Task의 실행
Executor는 주어진 환경에서 주어진 작업을 수행하는 역할을 합니다. ADaPT에서는 간단한 자연어 작업 명세를 입력받아 이를 수행합니다. 이 작업 명세는 간결한 설명으로 주어지며, 예를 들어 "깨끗한 머그컵을 책상 위에 두기"와 같은 형태입니다.
- 작업 수행 과정:
- Executor는 자연어 명령을 받아 이를 LLM (Large Language Model)을 통해 처리합니다.
- 주어진 작업이 완료되거나, 최대 반복 횟수에 도달할 때까지 환경과 상호작용하면서 작업을 수행합니다.
2. Atomic Skills
Executor는 atomic skills(기본 기술)을 활용하여 작업을 수행합니다. 이 atomic skills는 환경에 특화된 저수준의 작업들로, 예를 들어 "물건을 청소하는 방법"이나 "음식을 데우는 방법"과 같은 것이 포함됩니다.
- 예시:
- ALFWorld 환경에서 "컵을 청소하는 것"은 atomic skill이 됩니다.
- LLM은 이러한 atomic skill을 반복해서 실행하며, 작은 작업을 처리합니다.
3. 실패 시, 여러 기술을 조합하여 복잡한 작업 수행
실행 중 실패가 발생하면, LLM Executor는 여러 개의 기술을 결합하여 더 복잡한 작업을 수행할 수 있습니다. 예를 들어, "깨끗한 머그컵을 찾고 그것을 청소해서 책상에 두는 것"을 하나의 작업으로 처리할 때, "머그컵 찾기"와 "청소하기" 기술을 결합하여 "깨끗한 머그컵을 찾기"라는 새로운 atomic skill을 만들 수 있습니다.
- 예시:
- LLM은 "머그컵을 찾은 후 청소하기"를 결합해 복합적인 작업을 처리할 수 있습니다.
4. Self-generated Success Heuristic (자체 성공 판단 기준)
Self-generated Success Heuristic는 Executor가 작업의 성공 여부를 스스로 판단하는 방법입니다. 이 시스템에서는 완료된 작업인지 실패한 작업인지를 판단하는 기준을 LLM이 자동으로 생성합니다.
- 작동 원리:
- LLM Executor는 작업을 수행한 후, 작업이 성공했는지 여부를 스스로 판단합니다.
- 만약 성공했다고 판단되면 "작업 완료"라고 출력하고, 실패했다고 판단되면 "작업 실패"라고 출력합니다.
- 이 판단은 환경에서의 피드백이나 외부 보상 없이 이루어집니다. 즉, LLM이 스스로 작업이 끝났는지 확인하는 방식입니다.
5. 성공 판단 기준의 예시
- 예시:
- "컵을 청소하는 작업"을 수행하는 경우, LLM은 "컵이 청소되었는지"를 스스로 판단합니다. 작업이 성공하면 "청소 완료"라고 보고하고, 실패하면 "실패"라고 보고합니다.
- LLM은 이 방식으로 작업을 분해하여 점진적으로 작은 하위 작업들을 해결해 나갑니다.
6. 이 성공 판단 기준의 중요성
- 효용:
- 자체 판단 기준(Heuristic)은 작업이 끝났는지 여부를 정확하게 파악할 수 있게 해줍니다.
- 이를 통해 작업을 더 세분화하거나 다시 시도할 수 있는 판단을 내리게 됩니다.
- 예를 들어, "컵을 찾는 작업"이 실패할 경우, LLM은 "컵을 찾지 못했다"고 판단하고 다시 시도하거나 다른 방법을 시도할 수 있습니다.
7. Binary Classification 모델과의 유사성
이 과정은 이진 분류(Binary Classification) 모델과 유사한 방식으로 작동합니다. 즉, "작업 성공" 또는 "작업 실패"의 두 가지 선택지를 기반으로 판단이 이루어집니다. 이는 Shinn et al. (2023)에서 사용된 이진 분류 모델과 유사한 구조입니다.
결론: 이 부분의 핵심
- Executor는 주어진 작업을 실행하며, 실패 시 기술을 조합하거나 작업을 세분화하여 재시도합니다.
- 자체 성공 판단(Self-generated Success Heuristic)은 LLM이 작업의 성공 여부를 스스로 평가하여, 필요에 따라 작업을 다시 분해하거나 재시도할 수 있도록 합니다.
- 이 접근법은 작업을 동적으로 처리하며, 기존의 하드코딩된 계획 방식보다 더 적응적이고 유연한 방식으로 문제를 해결합니다.
그럼 Executor는 주어진 작업에 대해 진행을 하고, 결과에 대해 성공, 실패 판단을 진행하는 거네?
그리고, 원자 수준으로 명령을 내리면서 Task들을 해결해나가고, 원자 수준의 명령을 조합해서 복잡한 수준의 작업을 해결하는 것이고?
네, 맞습니다! 설명하신 대로 Executor는 주어진 작업을 진행하고 결과를 판단하는 역할을 합니다. 구체적으로 설명하면 다음과 같습니다:
1. Executor의 역할
Executor는 주어진 작업에 대해 실행을 담당하며, 작업이 완료되었는지 성공/실패 여부를 판단합니다.
- 진행:
- 작업을 수행하고, 이를 진행하는 동안 상호작용을 하며 문제를 해결합니다. 예를 들어, 주어진 작업이 "깨끗한 머그컵을 책상에 놓기"라면, 이를 실행하기 위해 컵을 찾고 청소한 후, 책상에 놓는 행동을 차례대로 수행합니다.
- 성공/실패 판단:
- 실행이 완료되면, 작업이 성공했는지 아니면 실패했는지를 자체적으로 판단합니다. 예를 들어, 컵을 찾을 수 없었다면 "작업 실패"라고 판단하고, 성공적으로 컵을 청소하여 책상에 놓았다면 "작업 완료"라고 판단합니다.
2. 원자 수준의 명령 (Atomic Skills)
원자 수준의 명령은 아주 기본적이고 독립적인 작업입니다. 예를 들어 "컵을 청소하는 방법" 또는 "컵을 집어 올리는 방법" 같은 기본적인 작업들이 원자 수준의 명령에 해당합니다.
- 예시:
- "컵을 청소" → "컵을 물로 씻다" 또는 "컵을 닦다"와 같은 구체적이고 간단한 동작들.
- "컵을 찾다" → "책상에서 찾다" 혹은 "서랍에서 찾다"와 같이 구체적인 위치를 지정하여 수행하는 작업들.
이러한 원자 수준 명령은 LLM Executor가 반복적으로 실행하면서 작업을 차근차근 해결하는 기본 단위입니다.
3. 원자 수준의 명령을 조합하여 복잡한 작업 해결
Executor는 원자 수준의 명령을 조합하여 복잡한 작업을 해결합니다.
- 예를 들어, "깨끗한 머그컵을 책상에 놓기"라는 작업은 원자 명령들을 여러 번 조합해야 합니다.
- 첫 번째 명령은 "컵을 찾다".
- 두 번째 명령은 "컵을 청소하다".
- 세 번째 명령은 "컵을 책상에 놓다".
이런 식으로 여러 개의 원자 명령이 모여서 복합적인 작업을 수행하게 되는 거죠. Executor는 이 명령들을 차례대로 실행하면서 작업을 완료합니다.
4. 실패 시, 조합된 명령으로 복잡한 작업 해결
- 실패 처리:
만약 "컵을 찾다"라는 원자 명령이 실패하면, Executor는 이 실패를 감지하고 "컵을 찾는 방법을 바꾼다"거나 "다른 장소를 찾아본다"는 새로운 원자 명령을 조합하여 문제를 해결하려고 시도합니다.
즉, 원자 수준 명령을 결합하여 복잡한 작업을 수행하지만, 작업 중 실패할 경우에는 다시 조합을 시도하거나 새로운 방법으로 원자 명령을 결합하는 방식으로 문제를 해결합니다.
정리하자면:
- Executor는 주어진 작업을 진행하고, 그 결과에 대해 성공/실패를 스스로 판단합니다.
- 기본적인 원자 수준의 명령(예: "컵을 찾다", "컵을 청소하다")을 통해 작업을 차례대로 실행하며,
- 원자 명령을 조합하여 복잡한 작업을 해결하고, 작업 중 실패 시 새로운 명령을 조합하여 재도전합니다.
이 방식은 기존의 고정된 계획을 따르지 않고, 동적으로 적응하며 작업을 해결하기 때문에, 복잡한 환경에서 더 유연하고 효율적으로 문제를 해결할 수 있습니다.