Generative Agents Paper review
Generative Agents: Interactive Simulacra of Human Behavior
https://arxiv.org/abs/2304.03442
Generative Agents는 Stanford + Google에서 나온 논문이다. (UIST 2023)
지금까지 본 ReAct, Reflexion, Toolformer가 에이전트 하나가 과제를 푸는 논문이었다면, 이 논문은 방향이 다르다. 에이전트 25명을 가상 마을에 풀어놓고 살게 한다. 흔히 스몰빌(Smallville) 논문으로 불린다.
Introduction
목표는 과제 해결이 아니라 believability(신뢰할 수 있음)다. 일어나서 아침을 만들고, 출근하고, 서로를 알아보고 대화를 시작하고, 지난 일을 기억하며 내일을 계획하는 행동이다.
여기서 believability는 실제 사람의 행동을 얼마나 정확히 재현하는가가 아니다. 자신의 경험에 근거해 일관되게 행동하고 답하는가다. 그래서 평가도 행동이 맞았는지가 아니라, 에이전트가 자기 기억과 어긋나지 않는 믿을 만한 응답을 유지하는지를 잰다. 이 논문의 핵심은 Memory Architecture 이다.

25명의 에이전트는 심즈 게임 스타일의 샌드박스 마을에서 각자의 직업과 관계 설정(자연어 한 문단)만 가진 채 시작한다. 이후의 모든 행동은 아키텍처가 만들어낸다. 모델은 gpt-3.5-turbo를 썼다. 문제는 LLM을 그대로 쓰면 이게 안 된다는 것이다. 에이전트의 경험 전체는 컨텍스트 윈도우에 들어가지 않고, 요약해서 넣으면 구체성이 사라진다. 과거 경험에 근거해 반응하고, 장기적으로 일관된 행동을 유지하는 것이 이 논문이 푸는 문제다.
Generative Agent Architecture

구조는 4단계다. 보고 들은 것을 전부 기억(memory stream)에 쌓고, 행동할 때 필요한 것만 회상(retrieval)하고, 주기적으로 반성(reflection)해서 추상화하고, 계획(planning)을 세워 움직인다. 전부 자연어로 기록되고 자연어로 처리되며, 반성과 계획도 기억의 일종이라 다시 회상 대상이 된다.
1. 기억 (Memory Stream)
에이전트가 인식한 모든 것을 쌓는 기록이다. 기억 하나는 자연어 설명 + 생성 타임스탬프 + 최근 접근 타임스탬프로 구성된다. 기본 단위는 관찰(observation)로, 자신의 행동(“Isabella Rodriguez is setting out the pastries”), 타인의 행동, 사물의 상태(“냉장고가 비어 있다”)가 전부 들어간다.
포인트는 요약하지 않고 전부 쌓는다는 것이다. 경험을 요약해서 컨텍스트에 넣으면 Isabella에게 “요즘 무엇에 열정적인가”를 물었을 때 행사·청소 같은 두루뭉술한 답이 나온다. 원본 기억을 쌓아두고 관련된 것만 회상하면 “발렌타인 파티를 계획하며 사람들을 환대하는 것”이라는 구체적인 답이 나온다. 정보 손실은 저장이 아니라 회상 단계에서 통제한다.
2. 회상 (Retrieval)
행동을 결정할 때 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: 현재 상황 임베딩과 기억 임베딩의 코사인 유사도
세 점수를 min-max 정규화한 뒤 가중치 전부 1로 합산하고, 컨텍스트에 들어가는 만큼 상위 기억을 프롬프트에 포함한다.

3. 반성 (Reflection)
관찰 기억만으로는 일반화가 안 된다. Klaus에게 “아는 사람 중 한 명과 시간을 보낸다면 누구와?”라고 물으면, 관찰만 가진 에이전트는 가장 자주 마주친 기숙사 이웃 Wolfgang을 고른다. 깊은 대화를 나눈 적은 없고 스쳐 지나간 횟수만 많은 상대다.
반성은 관찰들을 상위 수준 결론으로 종합하는 단계다. 최근 인식한 사건들의 importance 합이 임계값(150)을 넘으면 발동하고, 실제로는 하루 두세 번 일어난다. 과정은 3단계다.
- 최근 기억 100개를 주고 “이 기억들에 대해 물을 수 있는 가장 중요한 상위 질문 3개”를 모델이 생성한다 (“Klaus는 무엇에 열정적인가?”)
- 각 질문을 쿼리로 회상을 돌려 관련 기억들을 모은다. 이때 기존 반성도 회상 대상이다
- 모은 기억에서 인사이트를 추출하되, 근거가 된 기억 번호를 인용하게 한다 (“Klaus는 연구에 헌신적이다 (because of 1, 2, 8, 15)”)
생성된 반성은 memory stream에 다시 쌓인다. 반성이 반성을 근거로 삼을 수 있으므로 트리 구조가 만들어진다.

그림의 맨 아래 칸은 반성의 재료가 되는 기억들이다. “Klaus가 논문을 읽고 메모한다” 같은 관찰이 대부분이지만, 그림 왼쪽처럼 “수요일: 아침 루틴 후 연구 논문 작업” 같은 계획도 재료가 된다. 반성의 재료는 특정 종류가 아니라 memory stream에 쌓인 최근 기억 전부이기 때문이다. 반성이 한 번 돌면 이 기억들이 “Klaus는 연구 활동에 몰두하고 있다”라는 한 문장으로 묶이고, 이렇게 만들어진 반성도 다시 기억이 되므로 다음 반성에서는 관찰·계획·기존 반성이 함께 모여 맨 위의 “Klaus는 연구에 헌신적이다”라는 결론까지 올라간다. 위로 갈수록 낱개의 기억은 사라지고 성격에 가까운 요약만 남는 구조다. 반성이 생기면 Klaus의 선택도 바뀐다. 자주 마주친 Wolfgang이 아니라, 연구라는 공통 관심사를 반성으로 알게 된 Maria를 고른다.
4. 계획 (Planning)
계획 없이 매 순간 LLM에 행동을 물으면 12시에 점심을 먹고 12시 30분과 13시에 또 점심을 먹는 일이 생긴다. 순간순간은 그럴듯해도 시간 축에서 일관성이 없다.
계획은 top-down 재귀로 만든다.
- 하루가 시작될 때 에이전트 개요(이름, 성격, 최근 경험 요약)와 전날 요약을 주고 그날의 굵은 일정 5~8개를 생성한다
- 이를 시간 단위 행동으로 쪼갠다 (“13시~17시: 작곡 작업” → “13시: 아이디어 브레인스토밍 …”)
- 다시 5~15분 단위로 쪼갠다 (“16시: 간식”, “16시 5분: 작업실 주변 산책 …”)
계획도 memory stream에 저장되므로 회상 대상이다. “지금 뭐 할 거야?”라는 질문에 계획을 근거로 답할 수 있다.
계획은 고정이 아니다. 에이전트는 매 타임스텝 주변을 관찰하고, 그 관찰을 보고 계획을 계속할지 반응할지를 모델에게 묻는다. 이젤 앞에서 그림을 그리다 이젤을 관찰하는 것은 반응거리가 아니지만, 아빠 John이 아들 Eddy가 정원을 산책하는 것을 보면 말을 걸지 판단하게 된다. 반응하기로 하면 그 시점부터의 계획을 다시 생성하고, 반응이 에이전트 간 상호작용이면 대화를 생성한다. 대화 발화는 상대에 대한 기억 요약을 조건으로 만들어진다.
Evaluation: 개별 에이전트의 believability
에이전트 25명을 인터뷰한다. 자기 자신, 기억, 계획, 반응, 반성의 5개 영역 질문에 답하게 하고, 사람 평가자 100명이 조건별 응답의 believability 순위를 매긴다. 순위는 TrueSkill 점수로 환산한다.

전체 아키텍처(29.89) > reflection 제거(26.88) > reflection+plan 제거(25.64) > 사람 크라우드워커(22.95) > 전부 제거(21.21).
구성 요소를 하나 뺄 때마다 점수가 계단식으로 떨어진다. 그리고 에이전트 역할을 연기한 사람보다 전체 아키텍처가 더 believable하다는 평가를 받았다. 사람보다 잘했다는 뜻이 아니라, 그 에이전트의 삶 전체를 기억하고 일관되게 답하는 일은 사람 연기자에게도 어렵다는 뜻이다.
실패 사례도 보고한다. 회상이 불완전한 기억 조각만 가져와서, 파티에서 할 일은 기억하는데 파티가 있는지는 모르는 에이전트가 나온다. 기억에 없는 세부사항을 지어내 덧붙이는 embellishment(꾸며내기)도 있고, instruction tuning의 흔적으로 지나치게 협조적이고 격식 있는 말투가 나오기도 한다.
End-to-End: 마을에 소문이 퍼지는가
전체 아키텍처로 25명을 게임 시간 이틀 동안 돌리고, 창발적 사회 행동을 측정한다.
- 정보 확산: Sam의 시장 출마 소식을 아는 에이전트가 1명(4%) → 8명(32%), Isabella의 발렌타인 파티 소식은 1명(4%) → 13명(52%)으로 퍼졌다. 사용자 개입은 없었다
- 관계 형성: 에이전트 간 상호 인지 네트워크 밀도가 0.167 → 0.74로 올랐다. 서로를 안다고 주장한 응답 453개 중 환각은 1.3%(6개)였다
- 협동: Isabella는 파티 전날 손님을 초대하고 장식을 준비했다. 초대받은 12명 중 5명이 실제로 제시간에 카페에 나타났다

불참한 7명을 인터뷰하면 3명은 일정 충돌을 댔고, 나머지는 관심은 있었지만 계획을 세우지 않았다. 논문은 이것도 사람다운 결과로 본다.
Limitations
- 회상 실패와 embellishment가 있다. 기억이 쌓일수록 회상 난도가 올라간다
- 게임 시간 이틀, 25명 규모다. 더 길고 큰 시뮬레이션에서의 안정성은 검증되지 않았다
- 비용이 크다. 에이전트 하나하나가 행동할 때마다 LLM 호출이 쌓인다
- 평가가 believability 하나에 집중되어 있다. 유용성이나 정확성과는 다른 축이다
지금 관점: agent memory 설계의 원형
이 논문의 회상 점수(recency × importance × relevance)는 지금 에이전트 장기 기억 설계에서 그대로 쓰이는 공식이다. 시간 감쇠, 중요도 채점, 임베딩 유사도의 조합은 이후 수많은 memory 프레임워크가 따라간 기본형이다.
reflection도 마찬가지다. 원시 로그를 그대로 쌓지 않고 주기적으로 상위 수준 결론으로 요약해 다시 기억에 넣는 구조는, 지금 에이전트들이 세션 로그를 교훈 파일로 정리해두는 패턴과 같은 발상이다. Reflexion의 반성이 실패 신호를 증폭하는 학습 장치였다면, 이 논문의 반성은 경험을 추상화하는 기억 장치다. 이름이 같아서 헷갈리기 쉬운데 역할이 다르다.
멀티에이전트 시뮬레이션이라는 방향 자체도 이 논문이 열었다. 사회과학 시뮬레이션, 게임 NPC, 그리고 에이전트 여러 개를 협업시키는 멀티에이전트 프레임워크들이 이 논문을 출발점으로 인용한다.
Conclusion
기억을 전부 쌓고, 필요한 것만 회상하고, 주기적으로 추상화하고, 계획을 세워 행동하게 하면, LLM 에이전트 25명이 사람 개입 없이 소문을 퍼뜨리고 관계를 만들고 파티를 연다. 개별 요소는 단순한데 조합이 만드는 창발이 이 논문의 결과다.
과제 성능 벤치마크가 아니라 believability라는 평가 축을 세우고, 아키텍처의 각 구성 요소가 그 축에서 얼마나 기여하는지를 ablation으로 보인 것이 방법론적 기여다. 에이전트에 기억을 붙일 때 무엇이 필요한지에 대한 답은 지금도 이 논문의 4단계에서 크게 벗어나지 않는다.
Leave a comment