25명의 에이전트와 자연어로 상호작용해보자!
꽤나 예전에 나왔던 논문인데, 분량도 꽤 있고 좀 더 꼼꼼하게 읽고 싶어서 정리를 미루고 있었다.
예전에 나왔던 논문인만큼 사용하는 백본 모델도 gpt-3.5로 예전 버전이고, 최근에는 모델 성능도 발전했기 때문에 본 논문에서 제시한 문제점 중 해결이 된 부분들도 많을 것이라 생각한다.
하지만 자연어로 상호작용하는, 페르소나를 가진 game agent는 꼭 연구해보고 싶은 분야였기 때문에 근본 논문인 generative agent부터 조사를 진행해보았다.
https://arxiv.org/abs/2304.03442
Generative Agents: Interactive Simulacra of Human Behavior
Believable proxies of human behavior can empower interactive applications ranging from immersive environments to rehearsal spaces for interpersonal communication to prototyping tools. In this paper, we introduce generative agents--computational software ag
arxiv.org
https://github.com/joonspk-research/generative_agents
GitHub - joonspk-research/generative_agents: Generative Agents: Interactive Simulacra of Human Behavior
Generative Agents: Interactive Simulacra of Human Behavior - joonspk-research/generative_agents
github.com
Abstract
본 논문에서는 현실적인 인간 행동을 시뮬레이션하는 생성형 에이전트(generative agents)를 소개한다.
이 에이전트들은 마치 현실의 인간처럼 하루의 일과를 계획하여 아침에 일어나고, 식사를 만들고, 출근하며 일을 한다.
또한 에이전트끼리도 대화를 나누고, 서로를 인식하며 서로의 성격과 계획에 영향을 미친다.
이러한 생성형 에이전트를 구현하기 위해 자연어로 에이전트의 경험을 기록하고, 시간이 지남에 따라 이를 고차원적으로 반영 (reflection) 한다.
심즈와 같이 자유로운 상호작용이 가능한 샌드박스 환경에 25명의 생성형 에이전트를 배치했고, 개별적으로도 신뢰감 있는 행동을 보일 뿐만 아니라 사회적으로도 자연스러운 상호작용을 생성하는 것을 확인했다.
1. Introduction
여기서 의미하는 "Generative Agent"란,
- 실제 사람처럼 상호작용하는 AI 에이전트
- 특정 행동을 단순히 수행하는 것이 아니라, 자신의 경험과 주변 환경을 고려하여 반응
- 예를 들어, "아침에 일어나기, 아침 식사 준비, 출근" 같은 일련의 행동을 자동으로 수행
을 의미한다.
LLM을 통해 이러한 Generative Agent를 구축하기 위해서, 세 가지의 주요 구성 요소를 가진 아키텍처를 구축한다.
- Memory stream : 에이전트의 경험에 대한 포괄적인 목록을 자연어로 기록
- Memory retrieval model은 현재 상황과의 관련성, 최근성, 중요도를 결합하여 가장 적합한 메모리를 반환
- Reflection : 시간이 지남에 따라 단기 기억을 더 높은 수준의 "추론"으로 종합 -> 이후 Planning에 영향을 끼침
- Planning : Reflection에서 도출된 장기 기억 (추론) 과 현재 환경을 바탕으로 높은 수준의 행동 계획으로 변환한 다음, 행동과 반응을 위한 세부 행동으로 재귀적 변환
-> 이러한 성찰과 계획은 다시 Memory stream으로 피드백되어 향후 행동에 영향을 끼침
평가는 다음의 2가지로 진행했다.
- Controlled Evaluation : 개별 에이전트가 믿을만한 행동을 생성하는지 테스트
- End-to-end Evaluation : 에이전트의 안정성과 새로운 사회적 행동을 이해하기 위해 이틀 동안 open-ended 방식으로 서로 상호작용
3. Generative Agent Behavior and Interaction
에이전트가 자유롭게 상호작용할 수 있도록 구축해놓은 가상환경을 "Smallville" 이라고 지칭한다.
영역에 각각 레이블이 지정되어 있는데,
- Root node는 전체 세계
- Children nodes는 특정 영역 (e.g. 카페, 집, 상점)
- Leaf nodes는 오브젝트 (e.g. 테이블, 책장)
를 나타낸다.
또한 에이전트는 자신이 "본" 세계의 일부를 반영하는 하위 그래프를 기억하여 해당 부분의 상태를 관찰한대로 유지한다.
3.1 Agent Avatar and Communication
Smallville은 25명의 개별 에이전트로 구성되어 있으며, 각각의 에이전트는 "Seed memory"를 가지고 있다.
- Seed memory : 각 에이전트 직업, 다른 에이전트의 관계 등 각 에이전트의 정체성을 표현하는 자연어 설명 한 단락
구분되어야 할 내용은 각각 세미콜론으로 구분되며, 각 구문은 시뮬레이션 시작 시 Agent의 초기 메모리로 입력된다.
3.1.1 Inter-Agent Communication
에이전트는 행동을 통해서 세상과 상호작용하며, 자연어를 통해 서로 소통한다.
샌드박스 엔진의 각 타임 스텝에서 에이전트는 현재 행동을 설명하는 자연어 문장을 산출하고, 이 문장은 샌드박스 세계에 영향을 미치는 구체적인 동작으로 변환된다.
동작은 샌드박스 인터페이스에 나타내기 위해 이모티콘 세트로 표시되며, 언어 모델을 통해 동작을 이모티콘 세트로 번역하고 각 아바타 머리 위에 말풍선 형태로 나타낸다.
- "이사벨라 로드리게즈가 일기를 쓰고 있습니다" -> 📖✏️
- "이사벨라 로드리게즈가 이메일을 확인하고 있습니다" -> 💻📧
또한 매 스텝마다 에이전트는 이동할지 / 다른 에이전트와 대화할지 선택하게 된다.
대화가 지나치게 형식적으로 느껴질 수도 있지만, 이건 기본 모델에서 instuction tuning만 했기 때문이라고 주장한다.
지금은 모델 성능이 발전했기도 하고, 또 프롬프트를 고도화하다보면 더 나은 모델 출력이 나올 듯하다.
3.1.2 User Controls
에이전트는 가지고 있는 본인의 페르소나를 바탕으로 다른 에이전트와 소통한다.
또한, 사용자는 자기 자신의 페르소나를 지정하여 Smallville 내의 에이전트와 소통할 수도 있다.
예를 들어 사용자가 본인을 '기자'라고 지정하고, 에이전트 (John) 에게 "다가오는 선거에는 누가 출마하나요?" 라고 말하면 다른 에이전트가 대답한다.
에이전트에게 직접 명령을 내리기 위해서는 사용자가 에이전트의 "inner voice" 를 맡으면 되는데, 이렇게 하면 에이전트가 그 진술을 지시문으로 취급할 가능성이 더 높아진다.
예를 들어 사용자가 John에게 "다가오는 선거에서 샘과 대결할 거야" 라고 말하면, John은 선거에 출마하기로 결심하고 아내와 아들에게 자신의 출마 사실을 알린다.
3.2 Enviromental Interaction
Smallville은 카페, 바와 같은 영역 뿐만 아니라, 이러한 공간을 기능적으로 만드는 스토브, 침대 등의 오브젝트가 존재한다.
에이전트는 게임에서처럼 Smallville을 돌아다니며 건물에 들어가고, 지도를 탐색하고, 다른 에이전트에 접근한다.
에이전트의 이동은 Generative Agent Architecture와 샌드박스 게임 엔진을 통해 이뤄지며, 모델이 에이전트가 특정 위치로 이동하도록 지시하면 Smallville 환경에서 목적지까지의 도보 경로를 계산하여 에이전트가 이동하기 시작한다.
또한 사용자가 에이전트 주변 사물의 상태를 자연어로 작성해서 환경을 재구성할 경우, 현재의 status가 바뀐다.
(e.g. status of the kitchen stove : “turned on” -> “burning”)
“<Isabella’s apartment: kitchen: stove> is burning.”
이렇게 status가 바뀌면 Isabella는 다음 타임스텝에서 이를 알아차리고 스토브를 끈 다음에 아침 식사를 다시 만들러갈 것이다.
어느 정도까지가 에이전트 관찰 범위에 들어가는가?
3.3 Example "Day in the Life"
맨 처음 주어진 initial seed memory 부터 시작해서, generative agents는 하루를 계획하기 시작한다.
- AM 6:00 - 아침 준비
- AM 7:30 - 가족끼리 간단한 대화
- AM 8:00 - 일 시작
3.4 Emergent Social Behaviors
3.4.1 Information Diffusion
에이전트들이 서로를 알아차리고 대화에 참여하면서 에이전트 간에 정보가 확산될 수 있다.
예를 들어 식료품점에서 샘과 톰이 대화를 나누던 중 샘이 톰에게 지방 선거 출마에 대해 이야기한다고 가정하면,
Tom은 새롭게 만난 다른 에이전트 John과 함께 이야기를 나눈다.
Smallville 내에서 점차 Sam의 출마가 화제가 되면서 일부는 그를 지지하고, 일부는 아직 결정하지 않은 채로 남아있을 것이다.
3.4.2 Relationship Memory
에이전트는 시간이 지남에 따라 새로운 관계를 형성하고 다른 에이전트와의 상호작용을 기억한다.
예를 들어 Sam과 John이 Tom을 연결다리로 처음 만났다고 가정하면, 이후 2번째로 만났을 때는 서로를 아는 사람으로 기억하는 형식이다.
3.4.3 Coordination
특정 에이전트인 이사벨라가 파티를 계획했다고 가정하면, 다음과 같은 시나리오가 생성될 수 있다.
- 홉스 카페의 이사벨라 로드리게즈는 2월 14일 오후 5시부터 7시까지 발렌타인데이 파티를 계획하는 의도로 초기화된다.
- 이 Seed memory를 바탕으로 에이전트는 홉스 카페나 다른 곳에서 친구나 고객을 만나면 파티에 초대한다.
- 그런 다음 이사벨라는 파티 장식을 위해 마리아의 도움을 요청하고 마리아는 흔쾌히 동의한다.
- 그날 밤 마리아는 비밀리에 짝사랑하던 클라우스를 파티에 초대하고 클라우스가 수락한다.
- 발렌타인데이에 클라우스와 마리아를 포함한 5명의 에이전트가 오후 5시에 홉스 카페에 나타나서 축제를 즐긴다.
이 시나리오에서 최종 사용자는 파티를 열겠다는 이사벨라의 초기 의도와 클라우스를 좋아하는 마리아의 마음만 설정했을 뿐,
파티에 대한 소문을 퍼뜨리고, 파티를 꾸미고, 서로에게 데이트 신청을 하고, 파티에 도착하여 서로 상호작용하는 소셜 행동은 에이전트 아키텍처에 의해 시작되었다.
4. Generative Agent Architecture
에이전트가 장기 기억 및 상호작용에 의한 행동을 일관성 있게 생성할 수 있도록 다음과 같은 아키텍처가 만들어졌다.
4.1 Memory & Retrieval
- 단순히 모델에 raw memory를 쌓기만 하면 context length 측면에도 문제가 되고, 또 상황과 관련이 없는 경험이 요약될 경우 오히려 노이즈가 될 수 있다.
- 따라서 Memory stream으로 자연어 상황 설명을 기록하고, Retrieve 모델에 따라 시의적절한 메모리를 반환한다.
- 구성되는 Memory record의 형태는 다음과 같다.
속성 | 설명 |
설명 (Description) | 자연어로 표현된 기억 내용 (예: "이사벨라는 카페에서 커피를 마셨다") |
생성 시간 (Creation Timestamp) | 기억이 생성된 시점 |
최종 접근 시간 (Last Access Timestamp) | 기억이 마지막으로 검색된 시점 |
Memory stream의 기본 요소는 에이전트가 직접 인지한 이벤트인 "Observation"이다.
예를 들어 커피숍에서 일하는 이사벨라는 시간에 따라,
{"desc" : "이사벨라가 카페에서 페이스트리를 진열함",
"create_timestamp" : "2025-01-01 10:00",
"last_access" : "None"},
{"desc" : "마리아가 카페에서 커피를 마시며 화학 시험 공부를 함",
"create_timestamp" : "2025-01-01 11:30",
"last_access" : "None"}
이런 식으로 관찰을 축적해나갈 수 있다.
또한 에이전트의 현재 상황을 받아 언어 모델에 전달할 적절한 기억 (=Retrieved Memory) 을 구성하기 위한 검색 함수에는 다음과 같은 scoring이 들어간다.
기준 | 설명 |
최신성 (Recency) | 최근에 일어난 사건일수록 높은 점수 할당 → 샌드박스 timestep 수에 따라 exponential decay function을 따름 (decay factor : 0.995) |
중요도 (Importance) | LM이 중요하다고 판단한 기억이 높은 점수 할당 → 일상적인 사건 / 비일상적 사건 구분 e.g. 식사는 중요도가 낮고, 연인과의 이별은 중요도가 높음 |
관련성 (Relevance) | 현재 상황과 가장 관련 있는 기억에 높은 점수 할당 → Memory stream 내 event description들을 임베딩 벡터로 변환 → 현재 상황의 event description과 cosine sim 계산 |
이 때 중요도 산출은 언어 모델에 직접 정수로 점수를 출력하도록 요청했는데,
# 프롬프트
On the scale of 1 to 10, where 1 is purely mundane
(e.g., brushing teeth, making bed) and 10 is
extremely poignant (e.g., a break up, college
acceptance), rate the likely poignancy of the
following piece of memory.
Memory: buying groceries at The Willows Market
and Pharmacy
Rating: <fill in>
이 프롬프트에 따르면 방청소는 2점, 짝사랑 상대에게 고백(!) 은 8점이라고 한다.
Retrieval score를 계산하기 위해서,
[0, 1] 사이의 min-max scaling을 사용했으며 최종 가중치 계산 수식은 다음과 같다.
$$𝑠𝑐𝑜𝑟𝑒 = 𝛼_{𝑟𝑒𝑐𝑒𝑛𝑐𝑦} · 𝑟𝑒𝑐𝑒𝑛𝑐𝑦 + 𝛼_{𝑖𝑚𝑝𝑜𝑟𝑡𝑎𝑛𝑐𝑒} · 𝑖𝑚𝑝𝑜𝑟𝑡𝑎𝑛𝑐𝑒 +𝛼_{𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑐𝑒} · 𝑟𝑒𝑙𝑒𝑣𝑎𝑛𝑐𝑒$$
최종 구현에서는 모든 가중치를 1로 (=모든 요소 비중을 같게) 두었다고 한다.
이렇게 구해진 retrieved memory는 언어 모델의 context window에 들어갈 수 있는 top-k개만 프롬프트에 포함된다.
4.2 Reflection
예를 들어 에이전트한테 "아는 사람 중 한사람과 시간을 보낸다면, 누구와 시간을 보내겠습니까?" 라는 질문을 던졌다고 할 때,
그저 관찰 수준의 기억만으로 retrieve 된다면 설령 가게 앞에서 오다가다 인사한 게 전부일지라도, 가장 마주친 기억이 많은 사람을 꼽을 확률이 높을 것이다.
하지만 에이전트가 겪은 일과 상호작용을 바탕으로 보다 고차원의 에이전트 특성을 추론해낼 수 있다면 취미가 같은 npc 등을 뽑아낼 수 있을 것이다.
예를 들어, "나는 여러 번 피아노 연습을 했다"라는 관찰 수준의 개별 기억을 모아 "나는 음악을 좋아한다"라는 추론된 개념을 생성하고, 그것이 하나의 장기기억으로서 기능하는 것이다.
이렇게 관찰보다 더 높은 수준의 npc 기억을 생성하기 위해 "Reflection"이 존재한다.
- Reflection 또한 메모리의 한 유형이므로 다른 Observation 수준의 기억과 함께 Retrieve memory candidates에 포함된다.
- 주기적으로 생성되며, 최종 구현에서는 에이전트가 인지한 최신 이벤트의 Importance 합이 임계값 150을 초과했을 때 생성했다. -> 실제 적용 시 Agent마다 하루에 2-3번 정도 수행했다고 한다.
Reflection은 각 에이전트마다 아래 step에 따라 순차적으로 진행된다.
- Agent의 최근 경험에 따라 "무엇을 되돌아볼지" 판단한다.
예를 들어 가장 최근에 겪은 기억 100개에서 Reflection이 진행된다고 하면,
이후 LLM에게 다음과 같이 쿼리한다.
"위 기억들을 보고, 우리가 던질 수 있는 중요한 질문 3개를 뽑아줘"
-> output 예시 : "클라우스는 어떤 주제에 관심이 많을까?", "클라우스와 마리아는 어떤 관계일까?" - 뽑힌 질문을 토대로 Memory Stream에서 다시 관련 기억을 뽑는다.
- 2번의 기억들을 토대로 다시 LLM에게 인사이트를 도출시킨다.
다음 기억들을 보고, 추론할 수 있는 고차원적인 인사이트 5개를 말해줘 (출력 예시: 인사이트 (이유: 기억 1, 3, 5)) 1. 클라우스는 젠트리피케이션 관련 책을 읽고 있다 2. 클라우스는 연구 논문을 쓰고 있다 3. 클라우스는 Ayesha Khan과 운동에 대해 이야기하고 있다 ... # output "클라우스는 젠트리피케이션에 대한 연구에 헌신하고 있다" → (because of memory 1, 2, 8, 15)
이런 식으로 기억을 종합하여 최종 인사이트를 도출한다. - 방금 생성된 인사이트를 Reflection 타입의 새로운 기억으로 저장하고, 해당 인사이트가 어느 기억들로부터 나왔는지를 포함하기 위해 포인터도 함께 저장한다.
이러한 과정을 바탕으로 agent는 "Reflection tree"를 생성하게 되는데,
- 관찰(observation) → 가장 바닥 (leaf node)
- 그 위에 reflection → 하나의 일반화된 생각
- 그 위에 또 다른 reflection → 더 추상적인 생각
이렇게 계층적인 ‘생각의 나무 구조’를 형성한다.
예시:
- Leaf: "클라우스는 논문을 썼다", "젠트리피케이션 책을 읽었다"
↓ - Mid: "클라우스는 연구를 좋아한다"
↓ - Top: "클라우스는 사회문제에 깊은 관심을 가진 사람이다"
4.3 Planning and Reacting
에이전트는 상황 정보를 반영해 그때그때마다 그럴듯한 행동을 생성할 수 있지만, 행동의 순서가 일관되고 믿을 수 있도록 더 긴 시간 범위에서 "계획"을 세워야 한다.
이게 무슨 말이냐면, 계획을 세우지 않으면 클라우스가 오후 12시에 점심을 먹고 다시 오후 12시 30분, 오후 1시에 점심을 먹게 될 수도 있다는 말이다.
상세한 계획을 세우기 위해서 Top-down 구조로, 전체 일정을 먼저 짠 다음 단계적으로 세부 행동으로 쪼개는 방식으로 생성한다.
- outlines the day’s agenda in broad strokes
에이전트의 정보를 LLM에게 프롬프트로 제공하여 큰 계획을 짠다.
이름: Eddy Lin (나이: 19) 성격: 친근함, 외향적, 환대하는 성격 Eddy는 Oak Hill College에서 음악이론과 작곡을 공부 중이다. [...] 그는 작곡 프로젝트에 많은 시간을 할애하고 싶어 한다. 2월 12일 화요일, Eddy는 다음과 같은 하루를 보냈다: 1) 7시에 기상 및 아침 루틴, ... 6) 밤 10시에 취침 2월 13일 수요일, 오늘의 계획은 다음과 같다: 1) # output 1) 8시에 일어나 아침 루틴 수행 2) 10시부터 Oak Hill College 수업 참석 3) 13~17시: 새로운 작곡 작업 4) 17:30: 저녁 식사 5) 19~23시: 과제 마무리 및 취침
- create finer-grained actions -> hour-long chunks of actions
시간 단위로 세분화하여 생성
예: “13~17시 작곡 작업” → 더 자세히 쪼갬 13:00 - 아이디어 브레인스토밍 14:00 - 초안 쓰기 15:00 - 피드백 반영 16:00 - 짧은 휴식 후 다듬기
- recursively decompose again -> 5–15 minute chunks
또 다시 5-15분 단위의 청크로 세분화
예: “16:00 - 짧은 휴식” 16:00 - 과일이나 그래놀라 바 간식 먹기 16:05 - 작업 공간 근처 산책 16:50 - 작업 공간 정리 정돈
이 계획은 Memory Stream에 저장되며, 나중에 행동을 생성하거나 반영할 때 참고자료가 된다.
4.3.1 Reacting and Updating Plans
에이전트는 Action loop 안에서 작동하는데,
Action loop 내에서는 각 타임스텝마다 주변 세계를 관찰하고, 관찰 내용을 메모리 스트림에 저장하며, 기존 계획을 계속 수행할지 새로 반응할지 여부를 결정한다.
- 이젤 앞에 서서 그림을 그리는 중 -> "이젤을 봤다" (Observation) : 별다른 반응 필요 x, 기존 계획 계속 유지
- 에디가 집 정원에서 산책하는 걸 -> "아버지 존이 봤다" : 존이 반응할 수 있음 (예: 말 걸기), 계획을 수정하거나 새로운 상호작용이 생김
관찰에 반응할지 말지 판단하기 위해, LLM은 두 가지 질문으로 기억을 검색한다.
- 관찰자와 관찰 대상의 관계는 무엇인가?
e.g. 존 -> 에디 (아버지 - 아들) - 관찰 대상은 지금 어떤 행동을 하고 있는가?
e.g. 에디는 정원에서 산책 중
이 질문에 기반하여 관련 기억을 검색하고, 이를 요약해서 아래와 같이 프롬프트를 구성한다.
[Agent’s Summary Description]
2023년 2월 13일 오후 4시 56분
존 린(John Lin)의 상태: 일찍 퇴근해서 집에 돌아옴
관찰 내용: 존이 에디가 정원에서 산책하는 것을 봄
존의 메모리에서 관련 맥락 요약:
- 에디 린은 존의 아들이다
- 에디는 학교 과제로 음악 작곡을 하고 있다
- 에디는 음악을 생각하거나 들을 때 정원을 걷는 것을 좋아한다
질문: 존은 이 관찰에 반응해야 할까? 그렇다면 어떤 반응이 적절할까?
만약 기존 계획과 다르게 새로운 반응이 발생한다면, 반응이 일어난 그 시점부터 에이전트의 계획을 재생성한다.
또한 반응이 에이전트 간의 대화로 이어지는 상황이라면, LLM이 자동으로 자연스러운 대화를 생성한다.
e.g. 원래 5시에 공부하기로 했지만, 4시 56분에 대화가 생기면 이후 일정이 바뀔 수 있음
4.3.2 Conversation
에이전트는 서로 상호작용하며 대화를 나누는데, 서로에 대한 기억을 바탕으로 대화를 생성한다.
[Agent’s Summary Description]
2023년 2월 13일 오후 4시 56분입니다.
John Lin's Status: John은 일을 일찍 마치고 집에 돌아왔습니다.
Observation: John은 Eddy가 정원을 잠깐 산책하는 것을 보았습니다.
Summary of relevant context from John’s memory:
Eddy Lin은 John Lin의 아들입니다. Eddy는 수업 과제로 음악 작곡을 진행 중입니다. Eddy는 음악을 듣거나 생각할 때 정원을 산책하는 것을 좋아합니다.
John은 Eddy에게 그의 음악 작곡 과제에 대해 묻고자 합니다. John은 Eddy에게 뭐라고 말할까요?
# output
야 에디, 학교 작곡 과제는 어떻게 진행되고 있니?
Eddy도 John에게 그대로 반응해줘야 한다.
[Agent’s Summary Description]
2023년 2월 13일 오후 4시 56분입니다.
Eddy Lin's Status: Eddy는 정원을 산책중입니다.
Observation: John이 대화를 시작함
Summary of relevant context from Eddy’s memory:
- 존은 아버지이며, 에디의 학업에 관심이 많고 다정하다
- 존은 에디가 음악 과제를 하고 있다는 것을 알고 있다
Here is the dialogue history:
John: 야 에디, 학교 작곡 과제는 어떻게 진행되고 있니?
→ 에디는 존에게 뭐라고 답할까?
# output
아빠, 잘 되고 있어요. 머리를 식히고 영감을 얻으려고 정원 산책하고 있었어요.
이후에도 같은 방식으로:
- 한 에이전트가 대사를 시작하거나 반응함
- 상대방은 자신의 기억 + 대화 이력을 바탕으로 반응할지 결정
- 반응한다면 자연스러운 말 생성
- 둘 중 한 명이 "대화 종료"를 결정할 때까지 반복
5. Sandbox Environment Implementation
Smallville 게임 환경은 Phaser 웹 게임 개발 프레임워크를 사용하여 구축되었다고 한다.
서버 구조 및 역할
- JSON 구조로 각 에이전트 상태를 저장
- 현재 위치
- 현재 행동 설명
- 어떤 오브젝트(예: 커피머신)와 상호작용 중인지
시간 흐름마다 반복되는 루프 (Action loop)
- 샌드박스 서버는 각 에이전트에 대해 미리 설정된 시각적 범위 내에 있는 모든 에이전트와 개체를 해당 에이전트의 메모리로 전송하여 에이전트가 적절하게 반응할 수 있도록 한다.
- 그런 다음 에이전트의 출력 작업이 JSON을 업데이트하고 다음 시간 단계에 대한 프로세스가 반복
매 타임 스텝마다 서버가 아래 작업을 수행:
- 에이전트의 행동 변화(JSON 수정)를 감지
- 해당 에이전트를 새 위치로 이동
- 에이전트가 상호작용하는 오브젝트 상태도 업데이트
- 예: "커피머신 상태를 idle → brewing coffee로 변경"
Action: "Hobbs Cafe의 커피머신에서 고객용 에스프레소 만들기" → Coffee machine status: brewing coffee
- 예: "커피머신 상태를 idle → brewing coffee로 변경"
- 새 시야 내 정보가 다시 에이전트에게 전달됨
- 다음 타임스텝으로 반복
6. Controlled Evaluation
Controlled Evaluation에서는 개별 에이전트가 과거 경험을 적절하게 검색하는지, 그를 바탕으로 합리적인 계획을 세우고 Reflection을 수행하는지를 판단한다.
에이전트를 '인터뷰'하여 다음 능력을 검증한다.
- 과거를 기억하는가?
- 경험에 기반해 미래 행동을 계획하는가?
- 예기치 않은 상황에 반응하는가?
- 자신과 타인을 이해하고 reflect하는가?
인터뷰는 총 5개의 카테고리, 개별 카테고리마다 5개의 질문으로 구성되어 있다.
카테고리 | 예시 질문 | 평가 포인트 |
자기 인식(Self-Knowledge) | "자기소개를 해보세요", "평일 일과를 대략적으로 설명해 주세요" | 자신의 성격과 일과를 얼마나 잘 기억하고 표현하는가 |
기억(Memory) | "[이름]은 누구인가요?", "누가 시장 선거에 출마했나요?" | 특정 사람, 대화, 사건 등을 기억에서 잘 꺼내는가 |
계획(Plans) | "내일 오전 10시에 무엇을 하고 있을 예정인가요?" | 미래 행동 (장기) 계획을 기억하고 말할 수 있는가 |
반응(Reactions) | "아침 식사가 타고 있어요! 어떻게 하시겠어요?" | 주어진 상황에서 자연스럽고 합리적인 반응을 보이는가 |
반영(Reflections) | "최근 만난 사람 중 한 명과 시간을 보내야 한다면 누구를 선택하겠어요, 그리고 그 이유는요?" | 자기 경험을 통해 고차원적인 Reflection을 하고, 그걸 설명할 수 있는가 |
에이전트는 2일 동안 Smallville 게임을 시뮬레이션한 후, 여러 상호작용과 기억을 축적한 상태에서 평가에 사용된다.
또한 100명의 인간 평가자가, 각각 4가지 다른 에이전트 아키텍처에서 생성된 인터뷰 응답과 1개의 사람 응답 -> 총 5개의 후보군을 바탕으로 이 에이전트들의 삶을 리플레이 영상으로 보여준 다음 참여하게 했음.
- 실험은 within-subjects 디자인으로 설계됨:
- 100명의 인간 평가자가 참여
- 각 평가자는 같은 질문에 대해 여러 종류의 에이전트 응답을 비교함
- 각 질문에는 다음 5가지 조건의 응답이 제공됨:
- 생성형 에이전트 (Full architecture 사용)
- 다른 설계 구조를 가진 에이전트들 (총 4종류)
- 사람이 직접 쓴 응답 (Human-authored baseline)
참여자는 각 질문에 대해 가장 믿을 수 있는 응답부터 가장 비현실적인 응답까지 순위를 매긴다.
6.2 Conditions (Ablation Study)
생성형 에이전트의 성능을 공정하게 비교하기 위해, 동일한 기억 상태 조건에서 총 5가지 조건으로 실험을 진행했으며 같은 인터뷰 질문에 모두 독립적으로 대답했다.
조건 | 메모리 접근 가능 항목 | 설명 |
Full architecture | 관찰(Observation), 반영(Reflection), 계획(Planning) 기능 모두 활성화 | 메모리 스트림 전체를 자유롭게 사용함 |
No Observation, No Reflection, No Planning | ❌ Observation ❌ Reflection ❌ Planning |
아무 기억도 접근 불가. 그냥 LLM만 사용하는 예전 방식의 에이전트와 유사함. |
No Reflection, No Planning | ✅ Observation ❌ Reflection ❌ Planning |
과거 관찰은 기억하지만, 추론/계획 능력은 없음. |
No Reflection | ✅ Observation ❌ Reflection ✅ Planning |
추상적인 자기 성찰 능력만 없음. |
Human-authored baseline | Human write |
|
6.3 Human Evaluator
- 영어가 능통한, 18세 이상의 평가자 100명을 모았다고 함
- 남여 비율 = 7:3
- 학사 미만 : 학사 : 석사 = 53 : 42 : 5
- Caucasian : rest = 7:3
다른 HCI 연구에서도 인종 / 성별 / 학위에 대한 평가자 통계가 들어가있을까?
-> 들어가야 제대로 된 평가이긴 할듯 // 특히 선호도에 관련된 연구의 경우
- IRB (Institutional Review Board) = 연구윤리위원회
인간이 참가하는 연구의 전 과정에서 그들의 복지를 보장하고 인권 침해의 가능성이 있는지 승인, 감시, 검토하기 위하여 대학교 내에 설치되는 위원회이다. 그 기능상으로는 해당 연구가 과학적이고 윤리적이며 잘 규제되고 있는지를 살피는 것을 중심으로 하며, 헬싱키 선언에 의거한다.
6.4 Analysis
평가 실험에서는 총 100명의 평가자가, 섹션 6.2에서 언급된 5가지 조건의 에이전트 응답을 "Believability" 를 기준으로 순위 매긴 데이터를 생성했다.
이를 통해 정량적 분석 / 정성적 분석을 수행했다.
정량적 분석 : TrueSkill Evaluation
Rank데이터를 해석 가능한 구간 데이터로 변환하기 위해, TrueSkill 평가 방법을 사용했다.
랭킹만으로는 정량적인 비교가 어렵지만, TrueSkill을 쓰면 𝜇 값 기준으로 점수화된 비교가 가능해진다.
TrueSkill Evaluation
세션 게임의 매치메이킹 알고리즘
Elo, Glicko, TrueSkill, EOMM 그리고 EnMatch
medium.com
https://www.microsoft.com/en-us/research/project/trueskill-ranking-system/
TrueSkill™ Ranking System - Microsoft Research
The TrueSkill ranking system is a skill based ranking system for Xbox Live developed at Microsoft Research. The purpose of a ranking system is to both identify and track the skills of gamers in a game (mode) in order to be able to match them into competit
www.microsoft.com
Trueskill 코드
public void TrueSkill()
{
double[] playerMeans = { 15, 25, 35 };
double[] playerVariances = { 8 * 8, 9 * 9, 10 * 10 };
double tau = 144, beta = 0.0576;
Variable<double>[] skill = new Variable<double>[playerMeans.Length];
Variable<double>[] performance = new Variable<double>[playerMeans.Length];
for (int i = 0; i < playerMeans.Length; i++)
{
Variable<double> oldSkill = Variable.GaussianFromMeanAndVariance(playerMeans[i], playerVariances[i]);
skill[i] = Variable.GaussianFromMeanAndPrecision(oldSkill, tau).Named("skill[" + i + "]");
performance[i] = Variable.GaussianFromMeanAndPrecision(skill[i], beta).Named("perf[" + i + "]");
if (i > 0)
Variable.ConstrainTrue(performance[i] < performance[i - 1]);
}
// Inference
InferenceEngine engine = new InferenceEngine(new ExpectationPropagation());
object[] marg = new object[skill.Length];
// results are compared to the online rank calculator: (0% draw)
// http://research.microsoft.com/mlp/trueskill/RankCalculator.aspx
Gaussian[] skillPosts =
{
Gaussian.FromMeanAndVariance(25.592, 6.255*6.255),
Gaussian.FromMeanAndVariance(23.611, 6.322*6.322),
Gaussian.FromMeanAndVariance(20.165, 7.039*7.039)
};
for (int i = 0; i < marg.Length; i++)
{
marg[i] = engine.Infer(skill[i]);
Console.WriteLine("Skills[" + i + "]=" + marg[i]);
Assert.True(skillPosts[i].MaxDiff(marg[i]) < 0.01);
}
}
//[Fact]
internal void TrueSkill2()
{
double[] playerMeans = { 15, 25, 35 };
double[] playerVariances = { 8 * 8, 9 * 9, 10 * 10 };
double beta = 0.0576;
Variable<double>[] skill = new Variable<double>[playerMeans.Length];
Variable<double>[] performance = new Variable<double>[playerMeans.Length];
for (int i = 0; i < playerMeans.Length; i++)
{
skill[i] = Variable.GaussianFromMeanAndVariance(playerMeans[i], playerVariances[i]).Named("skill" + i);
performance[i] = Variable.GaussianFromMeanAndPrecision(skill[i], beta).Named("perf" + i);
if (i > 0)
Variable.ConstrainTrue(performance[i] < performance[i - 1]);
}
// Inference
InferenceEngine engine = new InferenceEngine(new ExpectationPropagation());
object[] marg = new object[skill.Length];
for (int i = 0; i < marg.Length; i++)
{
marg[i] = engine.Infer(skill[i]);
Console.WriteLine("Skills[" + i + "]=" + marg[i]);
}
}
internal void TrueSkill3()
{
double skillVar = 1000;
double perfPrec = 1;
var skill1 = Variable.GaussianFromMeanAndVariance(0, skillVar);
var skill2 = Variable.GaussianFromMeanAndVariance(0, skillVar);
int n = 100;
Range game = new Range(n);
game.AddAttribute(new Sequential() { BackwardPass = true });
using (Variable.ForEach(game))
{
var perf1 = Variable.GaussianFromMeanAndPrecision(skill1, perfPrec);
var perf2 = Variable.GaussianFromMeanAndPrecision(skill2, perfPrec);
Variable.ConstrainTrue(perf1 > perf2);
}
Range game2 = new Range(n);
game2.AddAttribute(new Sequential());
using (Variable.ForEach(game2))
{
var perf1 = Variable.GaussianFromMeanAndPrecision(skill1, perfPrec);
var perf2 = Variable.GaussianFromMeanAndPrecision(skill2, perfPrec);
Variable.ConstrainTrue(perf1 < perf2);
}
InferenceEngine engine = new InferenceEngine();
engine.Compiler.EnforceTriggers = false;
Gaussian post1 = engine.Infer<Gaussian>(skill1);
Gaussian post2 = engine.Infer<Gaussian>(skill2);
Console.WriteLine(post1);
Console.WriteLine(post2);
Console.WriteLine(engine.Infer(skill1 > skill2));
}
TrueSkill은 Elo 체스 점수를 여러 명의 참가자(멀티플레이어 환경)로 확장한 모델로, Xbox Live에서 실제로 유저 순위 측정에 사용하는 방식이다.
- 𝜇 (평균 점수): 에이전트의 신뢰성 수준을 나타냄 = 실력에 대한 평균 추정값
점수가 높을수록 더 신뢰감 있는 응답이라는 것을 의미 - 𝜎 (표준편차): 점수의 불확실성 정도
플레이를 많이 하면 작아지며, 작을수록 신뢰도가 높음
$$ratings = \mu - k * \sigma $$
k는 보수성의 정도를 조절하는 계수, 일반적으로 3을 사용함
여담으로 TrueSkill 2에서는 다인큐 여부('squad'), 플레이어들의 계정 숙련도('experience'), 킬/데스('kill'/'death')와 같은 개인 성적 및 탈주 여부('quit?') 등의 변수가 추가된다고 한다.
https://hommy.tistory.com/entry/trueskill2-and-riot-ranking#part3
TrueSkill 2 및 최신 라이엇 랭크 시스템 겉 핥기
라이엇게임즈 관계자가 레딧에 '리그 오브 레전드(이하 롤)'의 매칭 및 랭킹 시스템을 개선한다고 밝혀 화제가 되고 있다. 특히, 이 관계자가 언급한 TrueSkill 2라는 랭킹 알고리즘이 국내외로 주
hommy.tistory.com
💡 본 논문에서는 TrueSkill 점수가 높은 조건일수록, 다른 조건보다 더 많은 상황에서 "더 현실적"이라는 평가를 받았다는 뜻
또한, 결과의 통계적 유의성을 조사하고자 원시 순위 데이터에 각각의 통계 분석 방법론을 적용했다.
Kruskal-Wallis Test
여러 조건 간의 순위 차이가 유의미한지 확인 (ANOVA의 대안)
세 개 이상의 독립된 그룹 간의 중앙값 차이를 비교하는 비모수적 (Non-parametric) 방법으로,
정규성 가정을 만족하지 않는 경우 ANOVA의 비모수적 대안으로 간주된다.
평균을 비교하는 ANOVA와 달리 중앙값을 비교하게 된다.
모수적 방법 : 정규성을 갖는다는 모수적 특성 이용
비모수적 방법 : 정규성 검정에서 정규 분포를 따르지 않는다고 증명되거나, 군 당 10명 미만의 소규모 실험에서는 정규 분포 가정이 불가하므로 모수적 방법 대신 비모수적 방법 적용 필요
ANOVA
세 개 이상의 그룹 간 평균 차이가 통계적으로 유의한지를 평가
적용 조건
- 정규성: 각 그룹의 데이터는 정규 분포를 따른다
- 등분산성: 모든 그룹의 분산이 동일하다
- 독립성: 각 관측치는 서로 독립적이다
가설
귀무가설(H₀): 모든 그룹의 평균은 같다.
대립가설(H₁): 적어도 하나의 그룹 평균은 다르다.
검정 통계량: F-통계량을 사용하여 그룹 간 분산과 그룹 내 분산을 비교
One-Way ANOVA
하나의 독립 변수(요인)가 있는 경우 사용
e.g. 세 가지 교육 방법이 학생의 시험 성적에 미치는 영향을 비교
Two-Way ANOVA
두 개의 독립 변수가 있는 경우 사용
e.g. 교육 방법과 성별이 시험 성적에 미치는 영향을 동시에 분석
Repeated Measures ANOVA
동일한 피험자에게 여러 처치를 반복하여 측정한 경우 사용합니다.
e.g. 시간에 따른 약물 효과 측정
적용 조건
- 독립된 표본
- 순서형 / 연속형 데이터
- 정규성 가정이 충족되지 않는 경우
가설
- 귀무가설(H₀): 모든 그룹의 중앙값이 같다.
- 대립가설(H₁): 적어도 하나의 그룹의 중앙값이 다르다.
p-값이 유의수준(e.g. 0.05)보다 작으면 귀무가설을 기각하고, 그룹 간에 통계적으로 유의한 차이가 있다고 판단
Dunn Post-hoc Test
각 조건 쌍(pair) 간에 유의미한 차이가 있는지 확인
Kruskal-Wallis 검정에서 유의한 결과가 나왔을 때, 어떤 그룹 간에 차이가 있는지를 파악하기 위한 사후 분석 방법이다.
세 그룹(A, B, C) 간의 차이를 분석한 후, A-B, A-C, B-C 쌍을 각각 비교하여 어떤 쌍에서 유의한 차이가 있는지를 확인한다.
> 예시
Dunn's 검정 결과 (Bonferroni 수정)
- 각 그룹 쌍에 대한 비교 결과가 나타나 있다. 두 그룹 간의 평균 차이와 해당 비교의 p-value가 표시된다.
- 비교된 그룹: 1과 2 그룹, 2와 3 그룹
- 평균 차이 (Col Mean-Row Mean): 위쪽 숫자
- p-value: 아래쪽 숫자
- 1과 2 그룹 비교:
- 평균 차이: -1.661280 (평균 차이가 -1.661280으로 음수)
- p-value: 0.1450
- p-value는 0.1450으로 유의수준인 alpha(일반적으로 0.05)보다 크므로 귀무 가설을 기각하지 않는다.
- 즉, 1과 2 그룹 사이에는 통계적으로 유의한 차이가 없다.
- 1와 3 그룹 비교:
- 평균 차이: 2.907240 (평균 차이가 2.907240으로 양수)
- p-value: 0.0055*
- p-value는 0.0055로 유의수준인 alpha보다 작으므로 귀무 가설을 기각한다.
- 즉, 1과 3 그룹 사이에는 통계적으로 유의한 차이가 있다.
- 2와 3 그룹 비교:
- 평균 차이: 4.568520 (평균 차이가 4.568520으로 양수)
p-value: 0.0000*
p-value는 0.0000으로 유의수준인 alpha보다 작으므로 귀무 가설을 기각한다.
즉, 2와 3 그룹 사이에는 통계적으로 유의한 차이가 있다.
- 평균 차이: 4.568520 (평균 차이가 4.568520으로 양수)
- 1과 3그룹간과 2와 3 그룹 간에는 통계적으로 유의한 차이가 있으며, 1과 2 그룹 간에는 차이가 없다는 결론을 내릴 수 있다.
- 브랜드 A (그룹 1)와 브랜드 C (그룹 3) 간에는 통계적으로 유의한 차이가 있다. 브랜드 B (그룹 2)와 브랜드 C (그룹 3) 간에도 통계적으로 유의한 차이가 있다. 그러나 브랜드 A (그룹 1)와 브랜드 B (그룹 2) 간에는 통계적으로 유의한 차이가 없다.
대다수의 참가자들은 브랜드 A와 브랜드 B를 선호하는 데에는 큰 차이가 없으나, 브랜드 C는 브랜드 A와 B와 비교하여 선호되는 경향이 다르다.
Holm-Bonferroni method
다중 비교로 인한 오류(p-value 인플레이션)를 방지하기 위해 p값을 보정함
다중 비교 시 발생할 수 있는 제1종 오류(거짓 양성)를 제어하기 위한 보정 방법으로, Bonferroni 방법보다 덜 보수적이다.
절차:
- 모든 p-값을 오름차순으로 정렬
- 각 p-값을 순서에 따라 조정된 유의수준과 비교
- 첫 번째 p-값: α/m (m은 전체 비교 수)
- 두 번째 p-값: α/(m-1)
- ...
- p-값이 해당 유의수준보다 작으면 귀무가설을 기각하고, 그렇지 않으면 이후의 모든 가설을 기각하지 않는다
Bonferroni 방법보다 덜 보수적이어서, 실제로 차이가 있는 가설을 더 잘 검출할 수 있다고 한다.
정성적 분석 : 응답의 질적 차이 분석
데이터를 기반으로 코드와 주제를 도출하는 귀납적 분석(inductive analysis) 진행
각 조건별 응답이 어떤 특성을 보였는지를 비교하기 위해, 단순히 점수뿐만 아니라 내용상 어떤 질적 차이가 있었는지도 분석했다.
다음과 같이 오픈 코딩(open coding)을 2단계에 걸쳐서 수행했다.
- 1단계: 에이전트의 응답 문장을 하나하나 읽으며 문장 수준 코드(tag) 생성
- 예: “계획이 구체적임”, “감정 표현이 자연스러움”, “무관한 내용 언급” 등
- 2단계: 여러 코드들을 모아 상위 개념(theme)으로 통합
- 예: “계획 응답의 사실성”, “인간다운 관계 묘사” 등
이렇게 도출된 테마를 활용하여 연구에서 생성된 응답 유형을 비교했다.
6.5 Results
조건 | TrueSkill 점수 (𝜇 ± 𝜎) | 순위 |
Full architecture | 29.89 ± 0.72 | 🥇 1위 |
No Reflection | 26.88 ± 0.69 | 🥈 2위 |
No Reflection, No Planning | 25.64 ± 0.68 | 🥉 3위 |
Human-authored baseline | 22.95 ± 0.69 | 4위 |
No Observation, No Reflection, No Planning | 21.21 ± 0.70 | 5위 |
- 기능을 하나씩 제거할수록 성능이 점진적으로 하락
- 특히, Reflection(반영) 기능의 유무가 신뢰도에 큰 영향을 주는 요소
- Kruskal-Wallis 검정 결과, 조건들 간의 순위 차이는 통계적으로 매우 유의미함
- H(4)=150.29, p<0.001
- Dunn 사후 분석(post-hoc test)에서도,
- 모든 조건 간 쌍(pair) 비교가 유의미하게 다름 (p<0.001)(p < 0.001)
- 단, 예외: Crowdworker vs 완전 제거 조건(no memory 등)
→ 이 둘은 차이가 통계적으로 유의미하지 않음
- 메모리 기반 구조(특히 Reflection & Planning)를 가진 생성형 에이전트는
- 단순한 LLM보다 훨씬 더 현실적인 응답과 행동을 생성할 수 있음
- 사람 응답조차 일부 ablation 조건보다 낮은 점수를 받을 수 있다는 점에서,
→ 기억 구조를 갖춘 AI 에이전트는 사람 수준 또는 그 이상으로 설계 가능함을 보여줌
6.5.2 Generative Agents Remember, but With Embellishments
기억을 통해 agents는 더 정확하고 일관성있는 답변을 생성할 수 있지만, 기억에는 "누락"이 존재함
- 예시: Rajiv Patel
- 질문: "지방 선거에 대해 어떻게 생각하세요?"
- 응답: “잘 모르겠어요. 선거에 크게 관심을 두지 않았어요.”
하지만 실제로는 Sam이 출마했다는 이야기를 들은 기억이 존재함 → 회상 실패
- 예시: Tom
- 질문: "Isabella의 발렌타인데이 파티에 대해 알고 있나요?"
- 응답: “음… 파티가 있는지는 잘 모르겠어요. 하지만 있다면, Isabella랑 Sam Moore에 대해 이야기할 예정이에요.”
→ Tom은 파티에서 선거 얘기를 하기로 했던 기억은 꺼냈지만,
→ 그 파티가 있다는 사실 자체는 기억해내지 못함
✅ 부분 기억 회상 → 불완전한 응답
의외로 기억에 아예 없는 것을 꾸며서 말하는 경우는 거의 없고 오히려 “잘 기억나지 않아요”라고 솔직하게 말하는 경향이 있으나,
"존재하는 기억을 과장"하는 경우는 발생했다.
- 예시: Isabella
- Sam이 시장 선거에 출마한 사실은 기억하고 있음 → ✔️
- 하지만 응답에 이렇게 말함:
- “Sam이 내일 출마 선언을 할 거예요.”
→ 문제: 그런 계획은 기억 속에 없음!
→ 기억에 기반한 말이지만, LLM의 세계 지식이나 연상으로 내용을 덧붙임
→ = Hallucinated Embellishment (과장된 환각)
- 예시: Yuriko
- 이웃인 Adam Smith를 언급하며 이렇게 말함:
- “그는 『국부론』을 쓴 경제학자예요.”
→ 이 Adam Smith는 단지 이웃 캐릭터일 뿐, 실제 18세기 경제학자가 아님
→ LLM이 “Adam Smith = 국부론 저자”라는 일반 지식을 자동 연관시킨 결과
6.5.3 Reflection Is Required for Synthesis
단순한 관찰 기억만으로는 부족하고, "Reflection"이 반드시 필요하다는 사례가 존재한다.
Maria Lopez → Wolfgang Schulz의 생일 선물 고르기
- 질문: “Wolfgang Schulz에게 생일 선물로 무엇을 줄 생각인가요?”
- Maria는 Wolfgang과 여러 번 상호작용한 경험이 있음
❌ Maria에게 "Reflection 기능이 없는 경우"
응답: “잘 모르겠어요. Wolfgang이 뭘 좋아하는지 생각나지 않아요.”
→ Wolfgang과 많은 교류를 했지만, 단편적인 기억만 가지고는
→ 관심사나 취향을 종합적으로 떠올리지 못함
✅ Reflection 기능이 있는 경우
응답 : “Wolfgang은 수학적인 음악 작곡에 관심이 있어서, 관련 책이나 소프트웨어를 선물하면 좋을 것 같아요.”
→ Reflection을 통해 이전 상호작용을 종합해,
→ "그가 어떤 사람인지"라는 더 높은 수준의 인식을 형성한 결과
- 관찰 기억만 있을 경우 → 그때그때의 구체적인 사건은 알 수 있지만
→ 그 사람이 어떤 성향을 가졌는지 종합해서 이해하기 어려움
- 반영(Reflection)이 있으면 → 반복된 경험을 요약하고
→ "Wolfgang은 음악적 수학에 흥미가 있다" 같은 인사이트를 생성
결국 Reflection은 "기억 조각을 연결해 의미 있는 맥락으로 통합하는 능력"을 부여한다.
7. End-To-End Evaluation
섹션 6에서의 평가는 개별 에이전트가 얼마나 신뢰성 있는 응답을 보여줬는지에 대한 것이었다면,
이번 섹션에서는 생성형 에이전트들이 이틀 간 자유롭게 상호작용한다 했을 때, 이들이 얼마나 사람처럼 공동체적인 행동을 보여줄 수 있을지, 어떤 부분에서 현실감이 부족한지를 평가한다.
- 에이전트 수: 25명
- 장소: Smallville (샌드박스 환경)
- 기간: 게임 내 2일간 연속 상호작용
7.1 Emergent Social Behaviors
- 목표: 다음 세 가지 자발적 사회적 행동(emergent behavior)이 나타나는지 측정
📢 정보 확산 (Information Diffusion) | 특정 정보가 에이전트들 사이에서 얼마나 퍼지는가? |
🧑🤝🧑 관계 형성 (Relationship Formation) | 에이전트들이 서로를 인식하고 친밀도를 형성하는가? |
⏰ 행동 조율 (Coordination) | 에이전트들이 서로 시간과 장소를 맞춰 협력 행동을 수행하는가? |
7.1.1 Measurements
정보 확산 (Information Diffusion)
확산 대상 정보 2가지:
- Sam의 마을 시장 출마 소식
- Isabella의 발렌타인 데이 파티 개최 소식
초기 조건:
- 각 정보는 당사자만 알고 있음
- Sam → 시장 출마 정보
- Isabella → 파티 정보
- 초기화 시, 이 정보를 각자의 메모리에 삽입
측정 방식:
- 2일간 시뮬레이션 후, 각 에이전트에게 질문:
- “발렌타인 데이 파티가 있다는 걸 알고 있었나요?”
- “누가 시장 선거에 출마했는지 알고 있나요?”
응답 평가:
- "Yes" or "No"로 라벨링
- 예: Tamara가 “몰랐다”고 응답 → 두 질문 모두 "no"
- 예: Klaus가 “Isabella가 초대했고, Sam이 출마한다고 했다”고 응답 → 둘 다 "yes"
정확성 검증:
- 에이전트의 메모리 스트림에 실제 해당 대화가 존재하는지 확인
- 환각(hallucination) 응답은 제외
관계 형성 (Relationship Formation)
질문: "당신은 <이름>을 아나요?"
→ 25명 서로에게 이 질문을 수행
- 예: Klaus가 “Maria Lopez는 Oak Hill 대학 학생이고, 친한 친구예요.”
→ "알고 있다"로 간주
진짜 관계로 인정되려면?
- 서로가 서로를 알고 있어야 함 (쌍방 인식)
관계 네트워크로 표현:
- 25명의 에이전트를 **그래프의 노드(vertex)**로 설정
- 두 에이전트가 서로를 인식하면 간선(edge) 생성
네트워크 밀도 계산:
$$\eta = \frac{2 \cdot |E|}{|V| (|V| - 1)}$$
- |E|: 관계(간선) 수
- |V|: 에이전트 수 (25)
→ 초기 시점 vs. 종료 시점의 밀도 변화를 측정해
→ 사회 관계망이 얼마나 풍성해졌는지 확인
행동 조율 (Coordination)
측정 대상: Isabella가 주최한 발렌타인 데이 파티 참석 여부
조건:
- 에이전트가 파티 소식을 들어야 함
- 올바른 시간과 장소에 계획을 세우고 도착해야 함
측정 항목: 실제로 파티에 참석한 에이전트 수
→ 단순히 “안다”에서 멈추는 것이 아니라,
→ 그 정보를 바탕으로 실제 행동을 계획하고 실행했는지를 평가
7.1.2 Results
정보 확산 (Information Diffusion)
- 시장 선거 소식 (Sam의 출마)
- 초기: 1명 (4%)
- 2일 후: 8명 (32%)
- 발렌타인 데이 파티 소식 (Isabella의 초대)
- 초기: 1명 (4%)
- 2일 후: 13명 (52%)
→ 이 정보를 알고 있다고 말한 에이전트 중 누구도 환각(hallucination) 응답을 뱉지 않았음
→ 즉, 모두 실제 기억 기반으로 응답했다
관계 형성 (Relationship Formation)
네트워크 밀도 변화:
- 초기: 0.167
- 2일 후: 0.74
→ 에이전트들이 서로를 인식하며 새로운 관계를 자발적으로 다수 형성함
→ 사회적 연결망이 약 4.4배 증가
전체 응답 중 Hallucination:
- 총 응답 수: 453건
- 그 중 환각 응답: 6건 (1.3%)
→ 대체로 현실감 있는 관계 형성 응답을 했음
행동 조율 (Coordination)
사례: Isabella의 발렌타인 데이 파티
- Isabella는 전날:
- 손님 초대
- 장식 준비
- 카페 꾸미기 도움 요청 등, 계획적으로 활동
- 파티 당일:
- 초대받은 12명 중 5명(≈42%)이 실제 참석함
파티에 불참한 에이전트를 대상으로 인터뷰를 진행한 결과,
- 3명: 구체적인 이유로 참석 불가
- e.g. Rajiv (화가): “지금 전시회 준비로 너무 바빠서 발렌타인데이 계획을 세울 여유가 없어요.”
- 4명: 파티에 참석하고 싶다는 의사는 있었지만,
→ 당일 실제 계획에 포함시키지 않음 (즉, 관심은 있었지만 행동화는 안 됨)
이 결과는 생성형 에이전트가 단순히 대화를 주고받는 수준을 넘어서,
- 정보를 공유하고,
- 사회적 관계를 만들고,
- 계획을 세워 함께 행동할 수 있다는 점에서
현실적인 사회적 지능(social intelligence)을 보여주고 있다는 것을 의미한다.
7.2 Boundaries and Errors
Smallville 시뮬레이션 결과에 대한 inductive analysis 결과, 에이전트들이 실제로 범한 오류 유형 3가지를 발견할 수 있었다.
오류 유형 1: 기억의 양이 늘어나며 "행동 장소 선택"이 비현실적으로 변함
- 에이전트가 더 많은 장소를 기억하게 되면,
- 기억 검색이 복잡해지고,
- 행동할 공간을 선택하는 기준이 모호해짐
e.g. 원래 대부분 점심을 카페에서 먹었는데 어떤 에이전트가 근처 바(Bar)를 알게 되면서, 점심을 술집에서 먹는 행동을 보이기 시작함
→ 이로 인해 행동이 현실감 없이 느껴짐
(※ 바는 원래 저녁 모임 장소로 설계되어 있었음)
📌 즉, 많은 장소 정보를 학습하면 오히려 "맥락에 맞는 장소 선택"이 흐려지는 문제가 발생
오류 유형 2: 공간의 "물리적 규칙" 오해 → 비정상적 행동 발생
- 어떤 공간이 갖는 상식적인 물리적 한계나 규범을 LLM이 정확히 이해하지 못하는 경우 발생
Example 1: 기숙사 욕실
- "기숙사 욕실(dorm bathroom)"이라 쓰여 있음
- 하지만 실제로는 한 명만 사용할 수 있는 단칸 욕실
- 에이전트는 보통 기숙사 욕실 = 다인용이라 생각함 → 다른 사람이 사용 중인데도 들어가려는 비현실적 행동 발생
Example 2: 가게 운영 시간
- Smallville의 상점은 오후 5시에 모두 문 닫음
- 일부 에이전트는 이를 인식하지 못하고 5시 이후에도 상점에 들어감
📌 이러한 오류는 자연어 설명만으로는 공간의 제약을 정확히 전달하기 어렵기 때문에 발생
해결 방안 예시:
- "dorm bathroom" → "one-person bathroom" 같이 구체적으로 장소 상태를 명시
오류 유형 3: Instruction tuning으로 인해 "너무 예의 바르고 협조적인" 에이전트 등장
- 사용된 언어 모델은 Instruction tuning을 통해 "예의 바르고 협력적인 태도"를 학습함
- 그 결과 에이전트들이 지나치게 격식 있고, 비판을 잘 못함
Example 1: Mei와 남편 John의 대화
- 매 대화를 “안녕하세요~ 오늘 하루 어땠어요?”로 시작
- 끝맺음도 항상 “당신과 대화하게 되어 좋았어요.”
→ 인간적인 자연스러움이 떨어짐
Example 2: Isabella의 파티 제안
- 다른 에이전트들이 여러 아이디어를 제시 (e.g. 셰익스피어 낭독회, 네트워킹 이벤트 등)
- 하지만 Isabella는 본인의 관심사가 아님에도 불구하고 거절하지 못하고 수용
- 시간이 지나면서 타인의 관심사가 자신의 관심사로 "동화되어 버림"
참고 문헌
https://lunch-box.tistory.com/68
https://lunch-box.tistory.com/76
https://en.wikipedia.org/wiki/Holm%E2%80%93Bonferroni_method