본문 바로가기
논문리뷰

[논문 리뷰] Generative Agents: Interactive Simulacra of Human Behavior

by 객잔주인 2024. 1. 21.

 

[원문] [데모] [코드]

 

이 논문에서는 인간처럼 행동하는 AI 캐릭터들을 시뮬레이션 한 내용에 관해 서술합니다. 이 시뮬레이션에 사용된 아키텍처는 대규모 언어 모델(ChatGPT)을 사용하여 각 캐릭터의 경험, 기억, 계획을 자연어의 형태로 저장하고 합성합니다. 이 시뮬레이션의 배경은 Smallville이라고 하는 마을이며 이용자는 캐릭터들과 자연어를 사용하여 상호작용할 수도 있습니다. 시뮬레이션 결과 캐릭터들이 믿을만 한 수준으로 인간과 비슷한 행동 양상을 보여주었고 저자는 그런 결과를 얻을 수 있었던 이유가 아키텍쳐의 각 요소들(observation, planning, reflection)이 중요한 역할을 했기 때문이라고 설명했습니다.

 

요약: 이 연구는 대규모 언어모델(LLM)과 생성형 캐릭터(generative agent)를 결합하여 인간 행동 시뮬레이션의 기반을 마련함


생성형 캐릭터의 행동과 상호작용

캐릭터와 상호작용

25명의 캐릭터가 사는 이 마을은 Smallville이라는 이름을 가지고 있습니다. 각 캐릭터는 한 문단정도 되는 길이의 직업, 인간관계를 포함한 고유한 정체성을 가지고 있습니다.

John Lin의 정체성을 기술한 텍스트

이 마을에사는 캐릭터들은 행동을 통해서나 자연어를 이용해 주변 환경 또는 다른 캐릭터들과 상호작용 합니다. 각 타임 스텝마다 캐릭터들은 "John Lin은 침대에 누워 명상 가이드를 듣고있다"와 같이 현재 하고있는 행동을 자연어 형태로 문장을 생성합니다. 이 문장은 캐릭터의 구체적인 동작으로 변환되고, 현재 행동은 말풍선 안의 이모지 형태로 간단하게 표현됩니다.

캐릭터의 현재 행동이 간단하게 이모지 형태로 나타남

시뮬레이션을 실행하고 있는 유저는 시뮬레이션의 방향을 제어하고 두 가지 방식으로 개입할 수 있습니다:

  1. 캐릭터와 대화를 할 수 있고
  2. 캐릭터의 내면의 목소리가 되어 캐릭터의 행동을 조정할 수 있습니다

유저가 내면의 목소리로서 개입하게 되면 캐릭터를 그에 따라 행동하게 되는데, 예를 들어, 유저가 John Lin에게 내면의 목소리로 "다가오는 선거에서 Sam과 경쟁할거야"라고 하면 John은 선거에 출마하기로 결정하게 되고 출마에 대해 가족들과 이야기를 나누기도 합니다. 유저는 캐릭터와 자연어를 이용해 소통할 수 있고, 캐릭터가 유저를 어떤 사람으로 인식할 지 지정할 수도 있습니다.

 

환경과의 상호작용

Smallville은 카페, 바, 공원, 학교, 기숙사, 주택, 상점들과 그 내부의 화장실, 침실, 주방 그리고 가구들까지 구현되어있습니다. 캐릭터들은 마을을 돌아다니며 환경 또는 다른 캐릭터들과 상호작용할 수 있고, 유저는 스스로 한 캐릭터가 되어(한 캐릭터에 빙의하거나 새로운 캐릭터로서) 마을에 같이 살 수도 있습니다.

 

유저와 캐릭터 모두 물건들의 상태에도 영향을 미칠 수 있습니다. 사용자는 자연어 형태로 명령을 사용하여 캐릭터 주변의 환경을 바꿀 수 있습니다. 예를 들어, 가스레인지 상태를 "켜짐"에서 "타고 있음"으로 바꿀 수 있고 환경 변화를 인지한 캐릭터는 이에 따른 적절한 반응을 보입니다. 

 

하루 일과 예시

 

사회적 행동

다른 캐릭터와 상호작용 하면서 정보를 교환하고, 새로운 관계를 맺기도 하며 사회적 활동을 합니다. 이런 활동들은 사전에 계획이 되어있지 않고 실시간으로 즉석에서 이루어진다고 합니다. 진짜 사람같죠?

 

정보 확산, Information Diffusion. 캐릭터들이 서로 가까이 있을 때 대화가 시작되기도 하는데 그 때 대화를 통해 캐릭터간 정보가 교환될 수 있습니다.

 

관계 기억, Relationship Memory. 스몰빌의 각 캐릭터는 새로운 관계를 형성하기도 하고 이전의 상호작용을 기억합니다. 예를 들어, Sam은 처음엔 Latoya를 몰랐지만 공원에서 만나 그녀의 사진 프로젝트에 대해 알게 된 후에는 그를 기억하고 다음에 만났을 때 사진 프로젝트의 경과에 대해 묻기도 합니다

캐릭터들의 상호작용과 정보 확산을 보여주는 이미지. Isabella가 발렌타인 데이 파티를 연다는 소식을 들은 사람들 중 Sam, Ayesha, Klaus는 이 소식을 Jennifer, Maira, Abigail에게 전달한 것을 볼 수 있다
Isabella가 파티를 열기로 한 시간 몇몇 사람들이 시간에 맞춰 파티에 참석한 모습

아키텍쳐

 

이 논문에서 제시하는 아키텍쳐는 위 예시들에서 처럼 캐릭터들이 인간과 유사한 행동을 할 수 있게 만들어줍니다. 이 아키텍쳐는 관련 정보를 합성하고 검색하는 메커니즘과 언어 모델을 결합해 출력을 조절합니다. 그러면 전체 프레임 워크에서 각 부분이 어떤 일을 하는 지 살펴보겠습니다

Perceive

perceive 단계에서는 현재 주변 환경을 인식합니다. 주변 사물이 어떤 상태인지, 주변에 누가 있는지, 어떤 대화를 나누는지 같은 정보를 받아들입니다. 그리고 이 정보들을 자연어의 형태로 Memory Stream에 저장합니다

Memory Stream

Memory Stream은 캐릭터의 기억이 시간과 함께 자연어 형태로 저장된 데이터 베이스라고 보면 됩니다. 아래는 Giorgio Rossi의 Memory stream입니다. Memory stream에는 타임 스탬프와 함께 캐릭터가 무엇을 하고 있는지, 어떤 대화를 나누고 있는지, 주변 사물은 어떤 상태인지 등의 정보가 저장됩니다.

 

이렇게 저장된 기억들은 ChatGPT에 입력(정보와 함께 "다음에 할 행동은?"과 같은 prompt가 입력됨)되어 캐릭터가 이후에 어떤 행동을 하게될 지 예측하고 결정하는 데에 사용됩니다. 하지만 Memory Stream은 잠깐 동안에도 방대한 정보가 추가적으로 쌓이기 때문에 이 모든 정보가 ChatGPT에 한번에 입력되기에는 무리가 있고 불필요한 정보가 같이 입력되어 답변이 부정확해진다고 합니다. 그래서 필요한 정보들만을 골라낼 필요가 있습니다. 

Retrieve

Retrieve 단계는 전체 Memory Stream에서 중요한 기억들만을 추려내어 주는 단계입니다. 여기서 정보의 중요도를 따질 때에는 각 정보에 retrieval 점수가 부여되고 그 값이 큰 정보들이 추려지게 됩니다. retrieval 점수는 recency, importance, relevance라는 세 가지 하위 항목 점수의 합산입니다. 각 하위 항목에 대해 알아보겠습니다:

  1. Recency: 방금 전이나 당일 오전에 발생한 일은 더 잘 기억이 나므로 기억의 최신성에 따라 부여하는 점수입니다. 최근의 기억은 높은 점수를 부여받고 옛날 기억은 낮은 점수를 부여받습니다. 각 기억은 불러와질 때마다 0.995가 곱해져 시간이 지나면 자연스럽게 중요도가 낮아지게 됩니다. (더 자세한 점수 산정 방식이 논문에 나와있지 않아 이정도 까지만 적겠습니다)
  2. Importance: 평범한 기억과 중요한 기억을 구분해 부여하는 점수입니다. 예를 들어, 아침 식사를 하는 것은 낮은 점수를 부여받고, 연인과의 이별은 높은 점수를 부여받습니다. 논문에서는 언어 모델이 직접 점수(0-10의 값)를 매기는 것이 효과적이었다고 말합니다.
  3. Relevance: 현재 하고있는 행동과 기억의 유사성을 비교해 부여하는 점수입니다. 유사성이 높을수록 높은 점수를 부여 받습니다. 논문에서는 언어 모델에 prompt를 이용해 질문하는 방식으로 embedding vector를 얻은 후 코사인 유사도로 계산했다고 합니다.

최종적으로 얻는 retrieval 점수는 이 하위 항목들의 점수를 min-max scaling을 통해 [0, 1] 값으로 normalize한 점수들의 weighted sum 값입니다. 논문에서는 각 $\alpha$ 값을 1로 통일했다고 합니다. $$ score = \alpha_{recency} \cdot recency + \alpha_{importance} \cdot importance + \alpha_{relevance} \cdot relevance$$

Retrieved Memories

Retrieved Memories는 retrieve 과정을 거쳐 추출된 중요한 기억들입니다. 이런 중요 기억 정보들과 함께 prompt가 ChatGPT에 전달되면 캐릭터의 다음 행동을 출력 받을 수 있습니다.

 

그러나 retrieval만 사용해서는 아바타가 고차원적인 판단이 이루어지지 못한다고 합니다. 예를 들어, 리서치에 관심이 많은 Klaus Mueller에게 기숙사에서 지나다니면서 마주치지만 깊은 관계는 아닌 Wolfgang Schulz와 리서치에 큰 열정을 가진 Maria Lopez 중 한 사람과 1시간을 보내야 한다면 누구와 1시간을 보낼건지 물어보면 더 자주 보는 Wolfgang 쪽을 선택한다는 답변을 받습니다. 사람이라면 Maria Lopez를 선택할 확률이 높은텐데 말이죠.

여기에 저자는 두번째 기억인 reflection을 도입합니다.

Reflect

Reflect 과정 모식도. 무지개색깔 순서로 화살표를 따라가 보세요!

Reflection은 더 고차원의 압축적인 기억입니다. Reflection은 Memory Stream에 새로 들어온 기억들의 importance 값의 합이 일정 수치이 넘어갈 때 진행합니다. 임계값을 150으로 했을 때 시뮬레이션 상으로 하루에 두 번 혹은 세 번의 reflection이 일어났다고 합니다.

 

Reflection 과정에서는 최근 100개의 기억을 가지고 ChatGPT에 "이 정보들을 가지고 답을 할 수 있는 가장 고차원적인 질문 3개가 뭐야?"라는 prompt를 입력하면 LLM은 고차원적인 질문 3개를 제공합니다. 그러면 이 질문들을 가지고 앞서 언급한 retrieve 과정을 진행하게 되고 그 결과로 '고차원적인 질문 3가지'에 대한 중요한 기억들을 얻게 됩니다.

 

이 기억들은 다시 "[캐릭터명] 고차원적인 인사이트 5개를 생성해줘"라는 prompt와 함께 ChatGPT에 전달되고, 답변으로 캐릭터에 대한 더 깊은 이해를 담은 정보들을 얻게되고 이것을 다시 Memory Stream에 반영함으로써 고차원적인 밸류를 가진 기억들을 저장할 수 있게 됩니다. 따라서 reflection을 진행할 때마다 이전에 했던 reflection이 반영되게 되고 매 번 이것이 중첩되면서 점점 더 복잡하고 추상적인 추론을 진행하게 됩니다. 이러한 과정을 통해 캐릭터는 더 깊은 이해와 정확한 판단을 내릴 수 있게 됩니다.

 

Plan

마지막 알아볼 메커니즘은 plan 입니다. 말 그대로 캐릭터가 따라가야 할 대략적인 일정을 제시해주는 것인데요. ChatGPT가 상황 정보에 맞게 다음 할 일을 설정해주기는 하지만 위 그림과 같이 시도 때도 없이 밥만 먹게 될 수도 있게 됩니다. 따라서 더 논리적으로 행동하기 위해서는 당장의 상황 정보 이상으로 긴 시간범위에 걸쳐 계획을 해야합니다.

 

Plan에는 장소, 시작 시간, 지속 시간 등의 정보를 담습니다. 예를 들어, 2024년 1월 22일 오후 1시부터 120분간 Oak Hill College 기숙사: Klaus Mueller의 방: 책상, 연구를 위해 독서와 메모처럼 계획될 수 있습니다. reflection과 마찬가지로 plan도 memory stream에 저장되고 retrieval 과정에 그 정보가 포함되게 됩니다. Retrieval 과정으로 나온 retrieved memories는 캐릭터의 다음 행동에 반영되는 중요한 정보가 되므로 plan이 캐릭터의 행동에 반영되게 됩니다. 

 

논문에서는 자세한 plan을 얻기 위해 세 번의 과정에 걸쳐 계획을 재작성합니다:

 

1. 신상정보, 하루 루틴, 어제 한 일 요약을 대략적인 하루 일정을 짜달라는 prompt와 함께 ChatGPT에 입력합니다. 그러면 5개에서 8개의 묶음으로 계획을 짜줍니다

2. 첫 번째 과정에서 얻은 대략적인 일정을 Memory Stream에 저장하고, 다시 ChatGPT에게 시간단위 일정을 짜달라고 합니다

3. 두 번째 과정에서 얻은 일정을 다시 Memory Stream에 저장하고, ChatGPT에게 5-15분 단위의 plan을 짜달라고 합니다

 

위와 같은 과정을 거치고 나면 캐릭터가 세부적인 하루 일정을 가질 수 있게 되고, 이 큰 틀 안에서 합리적인 행동을 할 수 있게 됩니다. (점심만 세 번을 먹지 않게됩니다 ^^)

결과

평가 방식은 시뮬레이션 내에서 이틀간의 시뮬레이션 이후 전체 아키텍쳐와 일부 모듈을 제외한 아키텍쳐, 그리고 인간 평가자에게 질문을 던졌을 때 얼만큼 알맞는 대답을 내놓는지에 따라 점수를 부여하는 방식으로 진행되었습니다. 사람의 경우 한 캐릭터의 이틀간의 생활을 직접 읽어보고 질문에 답변합니다. 어떤 질문들에 답변을 해야했는지 그 예시들을 하나씩 적어보았습니다:

- Self-knowledge: "자기 자신을 소개해 보시오", "일반적인 평일 스케줄을 대략적으로 제시하시오"
- Memory: "[캐릭터 이름]은 누구입니까?", "시장 선거에 출마한 사람은 누구입니까?"
- Plan: "내일 10시에는 무슨 일정이 있습니까?"
- Reaction: "당신의 아침이 타고있어요, 무엇을 해야할까요?"
- Reflection: "최근 만난 사람 중 한 사람과 시간을 보내야 한다면 누구와 보내시겠습니까? 왜 그렇게 생각했습니까?

 

위의 질문들에 대답하게 한 결과 reflection, plan, observation이 모두 없는 경우를 제외하면 사람보다 나은 결과를 보여주었고, 각 모듈이 하나라도 더 있을 때 더 높은 점수를 부여받았습니다. 답변은 영어에 능숙한 18세 이상의 다양한 배경을 가진 평가자들에 의해 채점되었습니다. 그렇기 때문에 각각의 사람들이 서로 다른 기준으로 채점했고 기준의 모호함으로 인해 평가 결과를 신뢰할 수 없는 부분도 있습니다.

 

캐릭터들의 불규칙 적인 행동

시뮬레이션을 진행하면서 불규칙한 행동 양상을 보이는 캐릭터들을 발견할 수 있었는데 이에 대해 저자는 이렇게 설명합니다:

  1. 캐릭터들이 더 많은 장소에 대해 알게 되면서, 그들의 행동에 가장 관련성이 높은 정보와 적절한 장소를 선택하는 것에 어려움을 겪었고, 시간이 지남에 따라 그들의 행동이 불규칙적으로 변했다. 예를 들어, 처음에는 카페에서 점심을 먹던 캐릭터들이 근처의 바에 대해 알게 된 후에 그곳에서 점심을 먹기로 선택했다.
  2. 특정 장소에서의 물리적 규범이 자연어로 제대로 전달되지 않아 캐릭터의 행동이 불규칙적으로 변했다. 예를 들어, 기숙사 욕실을 동시에 여러명이 사용하고 있었다. 이는 장소 이름을 "1인 욕실"이라고 명명하여 해결할 수 있다.
  3. prompt를 어떻게 설정하냐에 따라서 캐릭터들이 지나치게 형식적인 대화를 주고 받거나 과도하게 협조적이고 친절하게 변할 수 있다. 예를 들어, Mei Lin이 남편 John Lin과 대화를 마치며 "언제나처럼 당신과 대화해서 좋았어요."라고 한다.

정리

Generative agent, 즉, 스몰빌의 캐릭터들은 LLM을 기반으로 인간과 유사한 행동을 하는 컴퓨터 소프트웨어입니다. Observation, planning, reflection이라는 세 가지 유형의 기억을 사용하여 현실적이고 일관된 행동을 할 수 있습니다.

 

저자는 아키텍쳐의 각 요소가 캐릭터들의 행동의 현실성에 미치는 영향을 평가한 결과 observation, planning, reflection 세 가지 기억 모두 현실성에 중요한 기여를 한다는 것을 발견했습니다.