자율 에이전트 및 에이전트 시뮬레이션
요약
본 글은 AutoGPT, BabyAGI 등 자율 에이전트와 CAMEL, Generative Agents 같은 에이전트 시뮬레이션 프로젝트의 최신 동향을 분석합니다. 이들 프로젝트가 가진 새로운 기능과 개념적 차이를 설명하고, 이를 LangChain 프레임워크에 구현함으로써 LLM 및 벡터스토어 제공업체 간의 유연한 전환과 생태계 연결성을 확보하는 방법을 논합니다.
핵심 포인트
- 자율 에이전트는 장기 목표 설정과 새로운 계획 기법을 필요로 합니다.
- 에이전트 시뮬레이션은 환경 적응 및 사건 반영 장기 메모리가 핵심입니다.
- LangChain 구현은 LLM/VectorStore 전환의 유연성을 제공합니다.
- 에이전트는 추론 엔진(LLM), 도구, 메모리로 구성됩니다.
지난 2주 동안 LLM을 에이전틱(agentic) 방식으로 사용하는 것이 엄청나게 증가했습니다. 구체적으로 AutoGPT, BabyAGI, CAMEL, Generative Agents와 같은 프로젝트들이 등장했습니다. LangChain 커뮤니티는 현재 이 모든 프로젝트의 일부를 LangChain 프레임워크에 구현했습니다. 이러한 프로젝트들을 연구하고 구현하는 과정에서, 우리는 그들 간의 차이점과 각자의 새로운 기능(novel features)이 무엇인지 이해하려고 노력했습니다. 본 블로그는 우리가 배운 내용을 설명합니다.
참고: 이 글은 상당히 기술적인 내용입니다. LangChain 및 관련 프로젝트에 대한 어느 정도의 지식이 있다고 가정합니다. 만약 이러한 프로젝트들에 익숙하지 않다면, 좀 더 입문자용인 글(예: Sophia Yang이 작성한 멋진 글)을 읽어보는 것이 도움이 될 수 있습니다.
요약:
‘자율 에이전트’ 프로젝트(BabyAGI, AutoGPT)는 장기 목표 설정에서 크게 새롭습니다. 이는 새로운 유형의 계획 기법과 메모리의 다른 사용 방식을 필요로 합니다. ‘에이전트 시뮬레이션’ 프로젝트(CAMEL, Generative Agents)는 시뮬레이션 환경과 사건을 반영하고 적응하는 장기 메모리 측면에서 크게 새롭습니다.
또한 우리는 각 프로젝트의 어떤 부분을 LangChain 프레임워크에 복제했는지, 그리고 왜 그 부분들을 선택했는지 논의합니다. 이를 LangChain 프레임워크에 구현하면 다음과 같은 이점이 있습니다:
- LLM 제공업체 간 쉬운 전환 허용
- VectorStore 제공업체(또는 대체 검색 방법) 간 쉬운 전환 허용
- LangChain이 보유한 도구 모음과의 연결 허용
- 전반적인 LangChain 생태계와의 연결 허용
배경
먼저, 몇 가지 배경 지식부터 시작하겠습니다. '에이전트(agents)'란 무엇이며 왜 중요한가요? 이 논의를 위해 우리는 LangChain 명명법을 사용할 것이지만, 이 분야는 너무 새롭기 때문에 표준화된 용어 자체가 없다는 점을 언급할 가치가 있습니다.
에이전트는 일반적으로 언어 모델을 추론 엔진으로 사용하고 이를 두 가지 핵심 구성 요소인 도구(tools)와 메모리(memory)에 연결하는 아이디어를 의미합니다.
도구(Tools)는 LLM을 다른 데이터 소스나 연산 기능에 연결하는 데 도움을 줍니다. 도구의 예시로는 검색 엔진, API, 기타 데이터 저장소가 있습니다. 도구는 LLM이 학습된 내용만을 알고 있다는 점에서 유용합니다. 이 지식은 빠르게 구식이 될 수 있기 때문입니다. 이러한 한계를 극복하기 위해, 도구는 최신 데이터를 가져와 프롬프트에 컨텍스트로 삽입할 수 있습니다. 또한 도구는 행동을 취하는 데 사용될 수도 있습니다(예: 코드 실행, 파일 수정 등). 그리고 그 행동의 결과는 LLM이 관찰하고 다음으로 무엇을 할지 결정하는 과정에 반영될 수 있습니다.
메모리(Memory)는 에이전트가 이전 상호작용을 기억하도록 돕습니다. 이러한 상호작용은 다른 개체(인간 또는 다른 에이전트)와 하거나 도구와의 것일 수 있습니다. 이 메모리는 단기적일 수도 있고(예: 이전 5번의 도구 사용 목록), 장기적일 수도 있습니다(현재 상황과 가장 유사해 보이는 과거의 도구 사용 기록).
LangChain 내에서 우리는 '에이전트(Agent)'를 어떤 행동을 취할지 결정하는 LLM으로, '도구(Tools)'를 에이전트가 수행할 수 있는 행동으로, '메모리(Memory)'를 이전 이벤트를 가져오는 행위로, 그리고 '에이전트 실행기(AgentExecutor)'를 특정 중단 기준이 충족될 때까지 에이전트를 반복 루프(while-loop)로 실행하는 논리로 지칭합니다.
전형적인 LangChain 에이전트는 2022년 11월 Yao 등이 제안한 추론 및 행동(Reasoning and Acting, ReAct) 프레임워크를 기반으로 합니다. 이 접근 방식은 다음 알고리즘의 특징을 가집니다:
- 사용자가 에이전트에게 작업을 부여합니다.
사고(Thought): 에이전트는 무엇을 할지 '생각'합니다.
행동/행동 입력(Action/Action Input): 에이전트는 어떤 행동을 취할지(즉, 어떤 도구를 사용할지)와 해당 도구에 대한 입력을 결정합니다.
관찰(Observation): 도구의 출력입니다. - 에이전트가 완료되었다고 '생각'할 때까지 2~4단계를 반복합니다.
다른 구현 및 프레임워크를 논할 때, 우리는 이 알고리즘과 비교하여 설명할 것입니다.
AutoGPT
링크:
이 프로젝트의 새로운 점은 무엇인가요?
AutoGPT
링크:
이 프로젝트의 새로운 점은 무엇인가요?
AutoGPT 프로젝트와 전통적인 LangChain 에이전트 간의 주요 차이점은 서로 다른 목표에서 비롯됩니다. AutoGPT에서는 목표가 종종 더 개방적이고 장기간 실행되는 경향이 있습니다. 이는 AutoGPT가 다른 AgentExecutor를 가지고 있으며 메모리를 처리하는 방식 또한 다르다는 것을 의미합니다 (두 가지 모두 장기 실행 작업에 더 최적화되어 있습니다). 이전에는 LangChain 에이전트의 메모리가 두 가지 형태였습니다:
- 에이전트 단계 메모리: 이는 해당 작업을 위해 관련 있는 중간 에이전트 단계 목록을 유지하고 전체 목록을 LLM 호출에 전달하는 방식으로 이루어졌습니다.
- 시스템 메모리: 이는 최종 입력과 출력을 기억했지만 (중간 에이전트 단계는 잊었습니다).
AutoGPT가 더 장기간 실행되기 때문에, 모든 에이전트 단계를 LLM 호출에 전달하는 것은 더 이상 실현 가능하지 않습니다. 대신, AutoGPT는 중간 에이전트 단계에 대한 검색 기반 메모리(retrieval-based memory)를 추가했습니다. 내부적으로 이 검색 기반 메모리는 VectorStore를 사용하여 임베딩(embeddings)에 대한 의미론적 검색(semantic search)을 수행합니다. LangChain도 이러한 유형의 검색 기반 메모리를 가지고 있지만, 이전에는 에이전트-도구 상호작용(agent-tool interactions)이 아닌 사용자-에이전트 상호작용에 적용되었습니다.
LangChain에 어떻게 통합했나요?
저희는 이것의 버전을 langchain.experimental에 추가했습니다.
- 이곳은 적절한 추상화(abstractions)를 파악하는 동안 더 실험적이고 새로운 코드를 넣는 곳입니다. 구체적으로, 사용된 프롬프트 템플릿팅 로직과 에이전트를 실행하는 데 사용된
while루프를 구현했습니다. 저희는 이것을 LangChain LLM 래퍼(wrappers), LangChain VectorStore, 그리고 LangChain 도구와 호환되도록 만들었습니다.
또한 이를 사용하는 방법을 보여주는 노트북도 생성했습니다.
BabyAGI
링크:
이 프로젝트의 새로운 점은 무엇인가요?
The BabyAGI 프로젝트는 다음과 같은 측면에서 전통적인 LangChain 에이전트와 차이가 납니다:
- AutoGPT와 유사하게, 중간 에이전트-도구 단계에 검색 기반 메모리를 적용합니다.
- 계획(planning) 단계와 실행(execution) 단계가 분리되어 있으며, 다음 행동 하나만 계획하는 것이 아니라 일련의 행동을 한 번에 계획합니다.
AutoGPT와 유사하게, BabyAGI는 더 장기적으로 실행되는 작업(long running tasks)을 위해 설계되었으며, 이로 인해 두 가지 차이점이 발생합니다.
두 번째 지점을 좀 더 자세히 설명하겠습니다. 이 부분이 가장 중요하고 실질적인 차이점 중 하나이기 때문입니다. 전통적인 LangChain Agent 프레임워크(그리고 AutoGPT 프레임워크)에서는 에이전트가 한 번에 한 단계씩 생각합니다. 주어진 세계 상태에 대해 다음 즉각적인 행동이 무엇이어야 할지 생각한 다음, 그 행동을 수행합니다.
BabyAGI는 명시적으로 일련의 행동을 계획한다는 점에서 다릅니다. 먼저 첫 번째 행동을 실행하고, 그 결과를 사용하여 또 다른 계획 단계를 거치고 작업 목록(task list)을 업데이트합니다. 우리의 직관은 이것이 계획 단계를 본질적으로 상태 추적 시스템(state tracking system)으로 사용함으로써 더 복잡하고 관련된 작업을 수행하는 데 도움이 된다는 것입니다. 우리는 (일화적으로) 여러 단계가 필요한 작업의 경우, 전통적인 LangChain Agent가 몇 단계 후에 원래 목표를 잊어버릴 수 있다는 것을 관찰했기 때문에, 모든 단계를 미리 계획하는 것이 유익할 수 있다고 생각했습니다.
LangChain에 어떻게 통합했나요?
AutoGPT와 유사하게, 저희는 이를 langchain.experimental에 추가했습니다. 구체적으로, 사용된 프롬프트 템플릿팅 로직과 에이전트를 실행하는 데 사용된 while 루프를 구현했습니다. 또한 LangChain LLM 래퍼(wrappers), LangChain 벡터스토어(vectorstores), 그리고 LangChain 도구(tools)와 호환되도록 만들었습니다.
Camel
링크:
이 프로젝트의 참신한 점은 무엇인가요?
이 프로젝트의 주요 참신함은 각자 고유한 개성(personality)을 가진 두 개의 에이전트를 가져와 서로 대화하게 하는 데서 나옵니다. 이러한 관점에서 볼 때, 여기에는 두 가지 새로운 구성 요소가 있습니다. 첫째는 두 에이전트가 협력적인 방식으로 상호 작용하는 아이디어이며, 둘째는 특정 시뮬레이션 환경입니다.
두 에이전트가 상호 작용하는 아이디어 자체는 완전히 새로운 것은 아닙니다. LangChain의 모듈식 특성을 고려할 때, 저희는 오랫동안 에이전트들이 다른 에이전트를 도구(tool)로 사용하는 것을 지지해 왔습니다. 하지만 이 상호작용 방식에서 새롭다고 할 수 있는 점은 두 에이전트가 동등한 위치에 놓인다는 것입니다. 이전 LangChain 구현에서는 항상 하나의 에이전트가 다른 에이전트를 '스태킹(stacking)' 접근 방식으로 도구처럼 호출하는 형태였습니다. 이처럼 두 에이전트를 동등하게 놓고, 한 에이전트가 다른 에이전트를 도구로 사용하는 것이 아니라 상호작용하도록 한다는 아이디어는 특히 흥미로운 진화된 행동을 관찰할 수 있게 해준다는 점에서 큰 의미가 있습니다.
참고로 이 에이전트들은 각자 서로 다른 도구를 가질 수 있으며, 그에 맞춰 전문화될 수도 있습니다. 예를 들어, 코딩에 필요한 도구들로 무장한 한 에이전트와 linear와 상호 작용하는 데 필요한 도구들을 가진 또 다른 에이전트를 둘 수 있습니다. 따라서 여전히 '스태킹' 효과(서로 다른 일에 책임지는 여러 에이전트를 두는 것)를 달성하는 것은 가능합니다.
두 번째 새로운 구성 요소는 특정한 시뮬레이션 환경이었습니다. 이것은 양방향 대화이며, 그리 복잡하지는 않지만 연구 환경에서 이와 같은 구현을 본 것은 처음입니다.
LangChain에 어떻게 통합했나요?
저희는 주로 시뮬레이션 환경(두 에이전트가 서로 채팅하는 것)을 반영하여 노트북을 추가했습니다. 향후에는 이 시뮬레이션 환경을 더 쉽게 사용할 수 있도록 만들 방법을 모색할 수도 있습니다.
생성형 에이전트 (Generative Agents)
링크:
이 프로젝트에서 새로운 점은 무엇인가요?
이 프로젝트에는 두 가지 새롭고(상당히 복잡한) 측면이 있습니다. 첫 번째는 25개의 다른 에이전트로 구성된 시뮬레이션 환경입니다. 이는 상당히 구체적이고 매우 복잡해 보여서, 저희가 깊게 다루지는 않았습니다. 또 다른 새로운 측면은 이 에이전트들이 만든 **장기 기억(long-term memory)**입니다.
저희는 이번 주 초에 이에 대해 심층적으로 분석했습니다. 에이전트들의 기억은 다음으로 구성되어 있습니다:
- 중요도 반성 단계(Importance reflection steps)를 통해 각 관찰(observation)에 중요도 점수(importance score)를 부여합니다. 이 점수는 나중에 검색(retrieval) 과정에서 특히 중요한 기억을 가져오고 기본적인 기억은 무시하는 데 사용될 수 있습니다.
- 성찰 단계(Reflection steps)는 에이전트가 학습한 일반화(generalizations)에 대해 “일시 정지”하고 생각하도록 합니다. 이러한 성찰 내용은 정상적인 기억과 함께 검색될 수 있습니다. 이 성찰 단계는 정보를 응축하고 최근 기억에서 패턴을 관찰하는 데 도움이 될 수 있습니다.
- 근접성(recency), 상황 관련성(relevancy to the situation), 중요도(importance)를 결합한 리트리버(retriever)입니다. 이를 통해 현재 상황과 유사하게 발생했으며, 얼마 전 일어났고, 특히 중요한 기억을 표면화할 수 있습니다. 이 모든 것은 마치 우리 인간이 기억을 “검색”하는 방식을 자연스럽게 반영하는 속성들인 것 같습니다.
이러한 모든 메모리 구성 요소들은 상당히 새롭고 저희에게 매우 흥미롭습니다.
이를 LangChain에 어떻게 통합했나요?
리트리버 로직은 일반화가 가능해 보여서 TimeWeightedVectorStoreRetriever로 추가했습니다.
논문에서 설명한 설정의 일부를 재현하기 위해 성찰 단계와 새로운 리트리버를 사용하는 방법을 보여주는 노트북을 추가했습니다.
시뮬레이션 환경은 복잡하고 그다지 일반화가 가능하지 않아 저희는 아무것도 하지 않았습니다.
결론
이 모든 프로젝트들은 마땅히 많은 주목을 받았습니다. 저희는 이를 두 가지 별개의 범주로 간주합니다:
- 자율 에이전트(Autonomous Agents): 계획 능력(planning abilities)이 개선된 부분
- 에이전트 시뮬레이션(Agent Simulations): 새로운 시뮬레이션 환경과 복잡하고 진화하는 메모리 구성 요소
저희는 LangChain 생태계 내에서 이러한 프로젝트들의 일부를 구현하기 시작한 것이 기대되며, 커뮤니티가 이를 어떻게 사용하고, 추가하며, 결합할지 기대됩니다 🙂
AI 자동 생성 콘텐츠
본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기