Generative Agents Paper review

Generative Agents: Interactive Simulacra of Human Behavior

https://arxiv.org/abs/2304.03442

Generative Agents는 Stanford + Google에서 만든, 가상 마을에서 사람처럼 사는 LLM 에이전트다. (UIST 2023)

지금까지 본 ReAct, Reflexion, Toolformer는 에이전트 하나가 과제를 푸는 논문이었다.
이 논문은 에이전트 25명을 가상 마을에 풀어놓고 살게 한다. 흔히 스몰빌(Smallville) 논문이라고 부른다.

1. Introduction

목표는 과제 해결보다 believability(믿을 만함)다.
일어나서 아침을 만들고, 출근하고, 서로 알아보고 대화를 시작하고, 지난 일을 기억해서 내일을 계획하는 행동이다.

여기서 believability는 실제 사람 행동을 얼마나 정확히 따라 하는지를 말하지 않는다. 자기 경험에 맞게 일관되게 행동하고 답하는지를 말한다.
그래서 평가도 행동의 정답 여부 대신, 에이전트가 자기 기억과 어긋나지 않는 응답을 유지하는지를 본다.

문제는 LLM을 그대로 쓰면 경험에 맞게 오래 일관되게 행동하는 게 안 된다는 점이다.
에이전트의 경험 전체는 컨텍스트 윈도우에 안 들어가고, 요약해서 넣으면 구체적인 내용이 사라진다.
과거 경험에 맞게 반응하고, 오래 일관되게 행동하게 만드는 게 이 논문이 푸는 문제다.

스몰빌 마을 전경 (논문 Figure 1)

실험 무대는 심즈 같은 샌드박스 마을이다. 25명의 에이전트가 가진 건 직업이랑 관계 설정(자연어 한 문단)뿐이다.
그 뒤의 행동은 전부 아키텍처가 만든다. 모델은 gpt-3.5-turbo를 썼다.

마을 지도에 구역 이름을 붙이면 아래와 같다.

구역이 표시된 스몰빌 (논문 Figure 2)

마을에는 카페, 바, 상점, 학교, 기숙사가 있다.
세계는 트리로 표현한다.

  • 루트 : 마을 전체
  • 중간 : 구역 (집, 카페)
  • 리프 : 사물 (테이블, 책장)

에이전트는 트리 전체를 알지 못하고, 자기가 직접 본 부분의 subgraph만 기억한다.
냉장고가 비었다는 것도 마지막으로 봤을 때의 상태로 기억한다. 세계 지식도 기억이랑 같은 방식으로 다룬다.

human-AI interaction, 사람 행동을 믿을 만하게 흉내 내는 에이전트(believable proxies), LLM과 사람 행동 연구를 정리한다.
LLM만으로는 부족하지만 맞는 아키텍처와 함께 쓰면 believable agent를 만드는 새 길이 열린다고 한다.

3. Generative Agent Behavior and Interaction

스몰빌에서 에이전트가 무엇을 할 수 있는지 보여준다. 에이전트끼리 자연어로 대화하고, 사용자가 대화나 지시로 개입하고, 환경 속 사물과 상호작용한다.
그 결과로 정보 확산, 관계 기억, 협동 같은 사회적 행동이 나타나는 예를 든다.

4. Generative Agent Architecture

구조는 4단계다.

  1. 기억(memory stream) : 보고 들은 걸 전부 쌓는다
  2. 회상(retrieval) : 행동할 때 필요한 것만 꺼낸다
  3. 반성(reflection) : 주기적으로 추상화한다
  4. 계획(planning) : 계획을 세워서 움직인다

에이전트 아키텍처 (논문 Figure 5)

전부 자연어로 기록하고 자연어로 처리한다. 반성이랑 계획도 기억의 한 종류라서 다시 회상 대상이 된다.

4.1 Memory and Retrieval

memory stream은 에이전트가 인식한 걸 전부 쌓는 기록이다.
기억 하나는 자연어 설명 + 생성 타임스탬프 + 최근 접근 타임스탬프로 되어 있다.

기본 단위는 관찰(observation)이다. 자기 행동(“Isabella Rodriguez is setting out the pastries”), 다른 사람 행동, 사물 상태(“냉장고가 비어 있다”)가 전부 들어간다.
요약하지 않고 전부 쌓는다.

경험을 요약해서 컨텍스트에 넣으면, Isabella에게 “요즘 무엇에 열정적인가”를 물었을 때 행사, 청소 같은 두루뭉술한 답이 나온다.
원본 기억을 쌓아두고 관련된 것만 꺼내면 “발렌타인 파티를 계획하며 사람들을 환대하는 것”이라는 구체적인 답이 나온다고 한다.
-> 무엇을 버릴지를 저장할 때가 아니라 꺼낼 때 정하는 구조다.

행동을 정할 때 memory stream 전체를 넣을 수는 없다. 컨텍스트에 안 들어가고, 들어가도 잡음이 된다.
그래서 현재 상황을 쿼리로 기억마다 점수를 매겨서 상위 기억만 가져온다.

\[score = \alpha_{recency} \cdot recency + \alpha_{importance} \cdot importance + \alpha_{relevance} \cdot relevance\]
  • Recency : 최근에 접근한 기억일수록 높다. 게임 시간 기준 지수 감쇠(계수 0.995)
  • Importance : 기억이 생길 때 LLM한테 1~10점으로 채점시켜 저장. “방 청소”는 2점, “짝사랑에게 데이트 신청”은 8점
  • Relevance : 현재 상황 임베딩과 기억 임베딩의 코사인 유사도

recency는 생성 시점 대신 마지막 접근 시점 기준이라, 자주 꺼내는 기억은 점수가 계속 유지된다.
세 점수를 min-max 정규화하고 가중치를 전부 1로 해서 더한다. 그리고 컨텍스트에 들어가는 만큼 상위 기억을 프롬프트에 넣는다.

Memory Stream과 회상 (논문 Figure 6)

그림 오른쪽은 Isabella에게 “지금 가장 기대되는 게 뭐냐”고 물었을 때 기억마다 recency, importance, relevance를 더해 점수를 매기는 예다.
점수가 높은 파티 관련 기억들이 뽑혀서 “Hobbs Cafe에서 여는 발렌타인 파티”라는 답이 나온다.

4.2 Reflection

관찰 기억만으로는 일반화가 안 된다.
Klaus에게 “아는 사람 중 한 명과 시간을 보낸다면 누구와?”라고 물으면, 관찰만 가진 에이전트는 제일 자주 마주친 기숙사 이웃 Wolfgang을 고른다. 깊은 대화를 한 적은 없고 스쳐 지나간 횟수만 많은 상대다.

반성은 관찰들을 모아서 더 높은 수준의 결론을 만드는 단계다.
최근 인식한 사건들의 importance 합이 임계값(150)을 넘으면 돌고, 실제로는 하루에 두세 번 일어난다.

과정은 3단계다.

  1. 최근 기억 100개를 주고 “물을 수 있는 가장 중요한 상위 질문 3개”를 모델이 만든다
  2. 질문마다 회상을 돌려서 관련 기억을 모은다 (기존 반성도 대상)
  3. 모은 기억에서 인사이트를 뽑고, 근거가 된 기억 번호를 같이 적게 한다

1단계 질문의 예는 “Klaus는 무엇에 열정적인가?”, 3단계 결과의 예는 “Klaus는 연구에 헌신적이다 (because of 1, 2, 8, 15)” 같은 형태다.
만든 반성은 memory stream에 다시 쌓인다. 반성이 다른 반성을 근거로 삼을 수 있어서 트리 구조가 된다.

Klaus의 반성 트리 (논문 Figure 7)

그림 맨 아래 칸은 반성의 재료가 되는 기억들이다.
“Klaus가 논문을 읽고 메모한다” 같은 관찰이 대부분인데, 그림 왼쪽처럼 “수요일: 아침 루틴 후 연구 논문 작업” 같은 계획도 재료가 된다. 반성은 종류를 가리지 않고 memory stream에 쌓인 최근 기억 100개(관찰·계획·반성)를 재료로 쓴다.

반성이 한 번 돌면 기억 묶음마다 가운데 층의 반성이 하나씩 생긴다. “Klaus는 연구에 헌신적이다” 두 개와 “Klaus는 연구 활동에 몰두하고 있다” 하나다.
이 반성들도 다시 기억이 되니까, 다음 반성에서는 가운데 층의 반성 세 개가 모여서 맨 위의 “Klaus는 연구에 매우 헌신적이다”까지 올라간다.

위로 갈수록 낱개 기억은 없어지고 성격에 가까운 요약만 남는다.
반성이 생기면 Klaus의 선택도 바뀐다. 자주 마주친 Wolfgang 대신, 연구라는 공통 관심사를 반성으로 알게 된 Maria를 고른다.

4.3 Planning and Reacting

계획 없이 매 순간 LLM에게 행동을 물으면, 12시에 점심을 먹고 12시 30분이랑 13시에 또 점심을 먹는 일이 생긴다.
순간순간은 그럴듯한데 시간 순서로 보면 일관성이 없다.

계획은 위에서 아래로 재귀적으로 만든다.

  1. 하루가 시작될 때 에이전트 개요(이름, 성격, 최근 경험 요약)와 전날 요약으로 큰 일정 5~8개를 만든다
  2. 이걸 시간 단위 행동으로 쪼갠다 (“13시~17시: 작곡 작업” → “13시: 아이디어 브레인스토밍 …”)
  3. 다시 5~15분 단위로 쪼갠다 (“16시: 간식”, “16시 5분: 작업실 주변 산책 …”)

계획도 memory stream에 저장되니까 회상 대상이다. “지금 뭐 할 거야?”라는 질문에 계획을 보고 답할 수 있다.

이 계획이 실행되면 이런 하루가 된다.

John Lin의 아침 (논문 Figure 3)

약사 John Lin은 7시에 일어나서 양치하고 샤워하고 아침을 먹는다. 출근 전에 아내 Mei, 아들 Eddy와 짧게 얘기하고 9시쯤 가게 문을 연다.
-> 본문은 7시 기상인데 Figure 3 캡션은 6시쯤이라고 되어 있다. 여기선 본문 기준으로 적었다.

누가 시킨 스케줄이 없고, 에이전트가 스스로 세운 계획이다.

4.3.1 Reacting and Updating Plans

계획은 고정이 아니다.
에이전트는 매 타임스텝 주변을 관찰하고, 그걸 보고 계획대로 갈지 반응할지를 모델에게 묻는다.

이젤 앞에서 그림을 그리다 이젤을 보는 건 반응할 일이 아니다. 그런데 아빠 John이 아들 Eddy가 정원을 산책하는 걸 보면 말을 걸지 판단하게 된다.
반응하기로 하면 그 시점부터 계획을 다시 만든다. 반응이 다른 에이전트와의 상호작용이면 대화로 넘어간다.

4.3.2 Dialogue

에이전트끼리의 대화는 상대에 대한 기억 요약과, 대화를 걸기로 한 의도를 조건으로 발화를 만든다. 상대도 같은 방식으로 자기 기억과 지금까지의 대화를 보고 답하고, 둘 중 하나가 끝낼 때까지 이어간다.

5. Sandbox Environment Implementation

스몰빌은 Phaser 웹 게임 프레임워크로 만들고, 서버가 각 에이전트의 위치·현재 행동·상호작용 중인 사물을 JSON으로 관리한다.
서버는 매 타임스텝 에이전트의 행동을 반영하고, 시야 안에 있는 에이전트와 사물을 그 에이전트의 기억으로 넣어준다.

6. Controlled Evaluation

에이전트 25명을 인터뷰한다.
자기 자신, 기억, 계획, 반응, 반성의 5개 영역 질문에 답하게 하고, 사람 평가자 100명이 조건별 응답의 believability 순위를 매긴다.
순위는 TrueSkill(체스 Elo 점수를 여러 명 순위로 넓힌 점수) 평균값으로 바꾼다.

Believability 평가 결과 (논문 Figure 8)

조건별 TrueSkill 점수는 다음과 같다.
전체 아키텍처(29.89) > reflection 제거(26.88) > reflection+plan 제거(25.64) > 사람 크라우드워커(22.95) > 전부 제거(21.21)

구성 요소를 하나 뺄 때마다 점수가 계단처럼 떨어진다.
그리고 에이전트 역할을 연기한 사람보다 전체 아키텍처가 더 believable하다는 평가를 받았다.
-> 사람보다 잘했다기보다는, 그 에이전트의 삶 전체를 기억하고 일관되게 답하는 게 사람 연기자한테도 어렵다는 걸로 보인다.

실패 사례도 나온다.

  1. 회상이 불완전한 기억 조각만 가져온다 (파티에서 할 일은 알고 파티가 있는지는 모름)
  2. 기억에 없는 세부사항을 지어내서 덧붙이는 embellishment(꾸며내기)가 있다

7. End-to-End Evaluation

전체 아키텍처로 25명을 게임 시간 이틀 동안 돌리고, 사회적 행동이 생기는지 본다.

  1. 정보 확산 : 시장 출마 소식 1명(4%) → 8명(32%), 발렌타인 파티 소식 1명(4%) → 13명(52%)
  2. 관계 형성 : 상호 인지 네트워크 밀도 0.167 → 0.74, “안다”는 응답 453개 중 환각 1.3%(6개)
  3. 협동 : 파티에 초대받은 12명 중 5명이 실제로 제시간에 카페에 나타남

정보 확산에서 출마 소식은 Sam, 파티 소식은 Isabella가 처음 가진 정보이고, 퍼지는 동안 사용자 개입은 없었다.

Isabella의 파티 초대가 퍼진 경로를 그리면 아래와 같다.

파티 초대 확산 경로 (논문 Figure 9)

Isabella 말고 12명이 시뮬레이션이 끝날 때까지 파티 소식을 들었다. Sam에서 Jennifer로, Ayesha에서 Maria로 넘어가는 것처럼 초대가 다른 에이전트를 거쳐 전해지기도 한다.

사용자가 심어준 건 두 가지뿐이다.

  • Isabella의 “파티를 열고 싶다”는 의도
  • Maria의 캐릭터 설명에 있는 “Klaus를 짝사랑한다” 한 줄

나머지는 에이전트들이 만들었다.
Isabella가 소문을 내고, 단골 Maria에게 장식을 부탁하고, Maria가 짝사랑 Klaus를 파티에 초대하고, Klaus가 승낙해서 파티에 나타난다.

의도를 실행 안 하거나, 전달을 잊거나, 참석을 잊을 수 있는 곳이 많았는데도 파티는 실제로 열렸다.

실제로 열린 발렌타인 파티 (논문 Figure 4)

그림은 파티가 열린 카페에 에이전트들이 모여 있는 장면이다.

안 온 7명을 인터뷰해보니 3명은 일정이 겹쳤다고 했고, 나머지 4명은 관심은 있었는데 당일 올 계획을 안 세웠다.
-> 이것까지 사람다운 결과로 봐야 하는지는 잘 모르겠다. 계획 단계에서 초대를 빠뜨린 걸로도 읽힌다.

7.2에서는 이상 행동도 짚는다. 그중 하나가 instruction tuning 영향으로 말투가 지나치게 격식 있고, 서로에게 지나치게 협조적이라는 점이다.

8. Discussion

논문은 Discussion에서 응용, 이후 과제와 한계, 윤리 문제를 같이 다룬다.

8.1 Applications of Generative Agents

포럼, 메타버스 같은 공간을 사람처럼 사는 에이전트로 채워 사회 시스템이나 이론을 시험해볼 수 있다고 한다.
사용자의 생활 패턴을 배운 에이전트를 사용자 대리로 두고 사람 중심 디자인에 쓰는 예도 든다.

8.2 Future Work and Limitations

  1. 회상 실패와 embellishment가 있다. 기억이 쌓일수록 회상이 어려워진다
  2. 게임 시간 이틀, 25명 규모다. 더 길고 큰 시뮬레이션에서 안정적인지는 확인이 안 됐다
  3. 비용이 크다. 25명을 이틀 돌리는 데 토큰 비용이 수천 달러 들었고, 실행에 며칠이 걸렸다
  4. 평가 기간이 짧고, 비교 기준이 사람 크라우드워커 조건 하나다. 크라우드워커가 believability의 최대치를 대표하지도 않는다
  5. 견고성은 아직 모른다. prompt hacking, memory hacking(없던 일을 있었다고 믿게 만드는 대화), 환각에 취약할 수 있다

8.3 Ethics and Societal Impact

사람이 에이전트에 감정적으로 기대는 문제, 잘못된 추론이 주는 피해, 딥페이크·허위정보 같은 오용, 설계 과정에서 실제 사람을 대신해버리는 문제를 위험으로 든다.

에이전트임을 밝히기, 입력과 출력을 감사 로그로 남기기, 실제 사람 의견의 대체가 아니라 초기 프로토타입용으로만 쓰기 같은 원칙을 제안한다.

9. Conclusion

기억을 전부 쌓고, 필요한 것만 꺼내고, 주기적으로 추상화하고, 계획을 세워 행동하게 하면, LLM 에이전트 25명이 사람 개입 없이 소문을 퍼뜨리고 관계를 만들고 파티를 연다.
하나하나는 단순한데 합쳐놓으니 이런 행동이 나온다.

평가 기준도 과제 성능 대신 believability를 쓰고, 구성 요소를 하나씩 빼는 ablation으로 각각이 얼마나 기여하는지 보여준다.
-> 에이전트에 기억을 붙일 때 뭐가 필요한지는 지금도 이 논문의 4단계에서 크게 벗어나지 않는 것 같다.

10. 지금 관점: 요즘 메모리 설계에도 쓰이는 방식

회상 점수를 recency, importance, relevance의 가중합으로 매기는 방식은 이후 나온 에이전트 장기 기억 설계에서 자주 보인다.
시간 감쇠, 중요도 채점, 임베딩 유사도를 섞는 조합이 많은 memory 프레임워크의 출발점이 된 것 같다.
다만 이 논문은 가중치를 전부 1로 두고 따로 튜닝하지 않았고, limitation에서도 이 함수들을 다듬을 여지를 남겨뒀다.

reflection도 비슷하다.
원시 기록을 주기적으로 상위 결론으로 묶어 다시 기억에 넣는다. 요즘 에이전트가 쌓인 대화 기록에서 요약이나 규칙을 뽑아 따로 저장해두는 것과 같은 발상이다.
-> Reflexion의 반성은 실패 신호를 키우는 학습 장치였고, 이 논문의 반성은 경험을 추상화하는 기억 장치다. 이름이 같아서 헷갈리는데 하는 일이 다르다.

멀티에이전트 시뮬레이션 쪽에서도 이 논문을 많이 인용한다.
사회과학 시뮬레이션, 게임 NPC, 에이전트 여러 개를 협업시키는 프레임워크들이 이 논문을 초기 사례로 든다.

다음은 Voyager다. 마인크래프트에서 스스로 과제를 정하고, 성공한 행동을 코드로 저장해 다시 쓰는 에이전트다.

Leave a comment