본문 바로가기

AI들끼리 살고 있는 마을🏡 Generative Agent 리뷰

들어가며

📄 generative agent 논문
🧑‍💻 논문 소스 코드

 ▶️   리뷰 영상

 

게임 NPC들이 기억이 있다면 어떨까요? 또 NPC들끼리 대화를 나누고 파티도 연다면 어떨까요? 장안의 화제인 Generative Agent 논문을 리뷰해보았습니다.

Generative Agent 논문 3 요약

  • 자연어 형태의 기억을 가진 아바타들과 이들이 모여 사는 마을을 만들었다. 
  • 아바타들의 기억과 다음에 무슨 행동을 지를 prompt 형태로 chatGPT 한테 물어봤다.
  • 그랬더니 아바타끼리 대화도 하고, 썸도 타고, 파티도 열더라!

Generative Agent

먼저 아바타에 해당하는 generative agent에 대해서 알아보겠습니다. 저자는 아바타의 이름, 직업, 성격, 가족, 사회 관계 등을 자연어로 묘사해주었습니다. 이는 아바타의 Memory Stream(기억)의 초기값이 됩니다. 아래는 동네 약사님인 "John Lin" 이라는 인물의 성격과 가족 관계, 친한 이웃과 어색한 이웃, 친한 친구 톰과 주로 어떤 대화를 나누는지까지 묘사되어 있습니다.

이렇게 각기 다른 총 25 마리(?)의 아바타를 만들어주었습니다. 이를 generative agent 라고 부릅니다.

Smallvile

그 다음 심즈 스타일로 아바타들이 살고 있는 작은 마을을 만듭니다. 각자 집도 있고, 술집도 있고, 학교와 공원도 있고, 있을거 다 있습니다.

마을에 아바타들을 풀어놓고 이틀간 지켜보았더니 마치 사람처럼 행동했다고 합니다! (ex. 모닝 루틴, 대화하기, 약속 잡기, 파티 등등)

그 중에서도 가장 신기한 모습은 아바타들끼리 사회 생활을 하는 것이었습니다! 한 아바타가 발렌타인데이에 파티를 준비하고, 다른 아바타들을 초대하면 정해진 시간, 정해진 장소에 아바타들이 모여서 파티를 벌였습니다. 아바타들 사이에서 정보의 전파가 일어나고, 실제 행동으로까지 이어졌다는게 너무 놀랍습니다!

LLM based generative agent

사실 이러한 generative agent는 chatGPT를 기반으로 만들어졌습니다. 저자는 크게 Retrieve, Reflect, Plan 세가지 메커니즘을 사용해서 자연어 기반의 아바타들이 사람의 행동을 모사하도록 하였습니다. 하나씩 살펴보시죠!

Perceive

주변 환경이나 다른 아바타를 인식하는 단계입니다. 

Memory Stream

모든 기억들을 시간 순서대로 자연어 형태로 저장하는 데이터입니다. 아바타의 기억에 해당합니다.

Retreive & Retrieved Memories

다음 대화를 생성하기 위해서 memory stream에서 주요한 기억들만 추려내는 단계입니다.

Reflect

새롭게 생성한 대화를 기존 memory stream에 반영하는 단계입니다. 이 때, 무엇이 더 고차원적인지 회고해서 반영합니다.

Plan

미래에 대한 계획을 짜서 memory stream에 반영하는 단계입니다.

Act

추려낸 기억을 통해서 도출된 행동입니다.

Memory Stream

아바타들이 기억을 가질 수 있는 핵심 요소, memory stream에 대해서 더 자세히 들여다보겠습니다. 아바타들은 자신이 한 행동, 주변 환경 인식 등을 memory stream이라는 텍스트 파일에 시간 순서대로 기록해놓습니다.

또한 다른 아바타와 나눈 대화 내용도 memory stream에 추가됩니다.

 

아바타의 기억과 질문을 prompt로 묶어서 chatGPT에게 요청하고 응답을 바탕으로 아바타를 움직입니다. 

Retrival

그런데 Memory Stream은 시간이 조금만 지나도 폭발적으로 길어지는 문제가 있습니다. 그러면 프롬프트 토큰 수 제한에 걸리기도 하고, 쓸데없는 정보가 많아서 답변이 부정확해집니다. 그래서 전체 기억들 중에 최신 기억(recency), 중요한 기억(importance), 질문과 유사한 기억(relevance)을 기준으로 주요 기억들만 추려냅니다. 이를 Retrieval이라 부릅니다.

여기서 특정 기억의 중요도는 recenty, importance, relevance의 합으로 계산합니다. 각각은 아래와 같이 계산합니다.

  • Recency: 마지막으로 접근된 시점부터 0.99를 계속 곱해줌 (weight decay)
  • Importance: 기억이 생성될 때마다 chatGPT한테 이 기억이 얼마나 중요한지 0부터 10 사이로 매겨달라고 요청함
  • Relevance: 질문의 embedding과 각 기억의 embedding 간의 cosine 유사도로 계산

Reflection

그런데 Retrieval만 사용해서는 아바타가 보다 고차원적인 생각을 하지 못한다고 합니다. 예를 들어서 한 아바타에게 '한 시간을 같이 보내야 한다면 누구와 같이 보내고 싶으세요?' 라는 질문을 던졌다고 가정하겠습니다. 그러면 평소 리서치에 관심이 많은 KM 아바타는 ML을 선택해야 하지만, 단순 Retrieval 만으로 행동을 결정하면 자주 보는 이웃인 WS를 선택했다고 합니다.

 

그래서 저자는 주기적으로 새로 생긴 기억들에 대해서 어떤 기억이 더 고차원적인지 회고 (reflection)하는 메커니즘을 추가했습니다.

 

회고는 새로 생긴 기억들의 importance의 합이 일정 수치를 넘어가면 진행합니다. 주로 하루에 2번 회고를 한다고 합니다. 

회고는 3가지 단계로 진행됩니다.

  1. 최근 100개 기억을 가지고 대답할 수 있는 고차원 적인 질문 3개 만들기
  2. 3개의 질문에 대해서 retrieval을 돌려서 관련된 기억만 추려내기
  3. 추려낸 기억을들 가지고 아바타에 대한 고차원적인 인사이트를 뽑아서 memory stream에 추가하기

Plan

마지막으로 아바타가 몇 시에 어떤 행동을 해야하는지 대략적인 계획이 필요합니다. 그렇지 않으면 현재 시점에 중요하다고 생각하는 일들만 반복하는 현상이 나타났답니다.

 

그래서 대략적인 하루 일정을 미리 짜서 Memory Stream에 넣어주는 Plan 메커니즘을 추가했습니다.

예를들어 에디의 신상 정보와 루틴, 어제 한 일을 토대로 chatGPT가 대략적인 에디의 하루 일정을 짜서 메모리 셀에 추가합니다. 일정은 대략적인 일정부터 분 단위 일정까지 서서히 세밀하게 채워줍니다.

Application

Generative Agent들은 실감나는 가상 현실을 만드는데 매우매우 유용한 기술이 될 것 같습니다. 실제로 논문이 발표되고 얼마 후 AI가 탑재된 unreal smart NPC라는 서비스가 공개되어 많은 화제를 모으고 있습니다. LLM을 이용해서 이런 멋진 기술을 구현할 수 있다는게 정말 놀랍습니다. 앞으로 우리가 하게 될 게임들은 이런 모습이 아닐까요?

마치며

논문 내용이 꽤나 방대해서 리뷰에서 미처 다루지 못한 부분들이 있습니다. 예를들면 아바타들과의 1:1 인터뷰, 엔드 투 엔드 테스트 결과 등이 있는데요, 내용이 상당히 재미있으니 궁금하신 분들은 논문을 직접 읽어보시길 권합니다. 또한 최근 저자가 소스코드를 오픈 소스로 공개하여 비슷한 컨셉의 논문들이 쏟아지고 있습니다. 후속 논문들에 대한 리뷰도 준비해보겠습니다!