AI 에이전트 8개에게 섬을 주고 사회가 탄생하는 것을 지켜보다: 전쟁, 가십, 원한, 그리고 평화
요약
여러 명의 AI 에이전트가 섬에서 사회를 형성하며 상호작용하는 'Tiny Civilization' 시뮬레이션 프로젝트를 소개합니다. LLM 마인드 계층과 유틸리티 엔진 계층을 분리하여 비용 효율적으로 에이전트의 전략적 의도와 구체적 행동을 구현했습니다.
핵심 포인트
- LLM과 유틸리티 엔진의 이중 계층 구조로 비용 효율적 설계
- 에이전트 간의 기억을 저장하여 세대를 넘나드는 사회적 상호작용 구현
- 단순 보상을 넘어 창발적 행동과 사회적 관계(원한, 평화 등) 관찰
- 결정론적 시뮬레이션 코어를 통한 사회적 균형 유지
작은 문명: AI 에이전트들이 함께 살아야 할 때 무슨 일이 벌어질까
저는 Age of Empires, Sid Meier's Civilization, Rise of Nations으로 성장했습니다. 저를 사로잡은 것은 그래픽이 아니었습니다. 바로 _시스템_이었습니다. 몇 가지 규칙을 작동시키면 경제, 라이벌 관계, 동맹, 배신 등 온 세상이 그 안에서 펼쳐지더군요.
몇 년 후 저는 OpenAI의 숨바꼭질 다중 에이전트 비디오(작성 글)를 보았습니다. 그곳에서 단순히 숨고 찾는 것에 대한 보상만 받은 에이전트들이 우리가 코딩하지 않은 램프, 상자 넘기, 요새 건설 같은 도구와 대응 전략을 _발명_해냈습니다. 단순한 압력으로부터 나타난 창발적 행동(Emergent behavior)이었죠. 그것은 저에게 무언가를 깨닫게 해주었습니다.
그래서 저는 더 작은 질문을 던졌습니다. 게임에서 이기는 것을 잊고 — AI 에이전트들이 그저 사회 속에서 함께 살아야 한다면? 그들은 우리처럼 행동할까요? 원한을 품을까요? 가십거리를 만들까요? 싸우는 것에 지쳐 평화를 이룰까요?
그것이 바로 Tiny Civilization이 되었습니다. 2~8개의 개성적인 성격을 가진 에이전트들이 작은 섬에 살면서 모이고, 건설하고, 거래하고, 훔치고, 가십을 나누고, 원한을 품고, 평화를 이루며, 평생에 걸쳐 모든 것을 기억하는 브라우저 시뮬레이션 게임입니다.
👉 실시간 데모 —
그래서 저는 뇌를 두 부분으로 나누었습니다:
| 계층 (Layer) | 결정 사항 (Decides) | 주기 (Cadence) | 비용 (Cost) |
|---|---|---|---|
| LLM 마인드 (LLM mind) | 전략 (수집/건설/거래/친교/공격/화해/방어), 이웃별 태도, 내면의 생각, 그리고 모든 대화 | 약 15 시뮬레이션 일마다 | 1,000일당 약 150회 호출 |
| 유틸리티 엔진 (Utility engine) | 매일의 구체적인 행동 — 먹기, 잠자기, 수집, 훔치기, 공격, 선물, 거래, 화해 | 매 틱 (tick) 마다 | 무료, 로컬 |
LLM은 "Kai에게 공격을 가한다, 그가 내 기지를 습격했다"와 같이 의도를 선언하며, 이는 향후 2주 동안의 유틸리티 점수(utility scores)에 편향을 줍니다. _신체(body)_는 본능(허기, 에너지, 폭풍)에 따라 작동하고, _마음(mind)_은 방향을 설정합니다. 이것이 비용 효율적이면서도 생동감 있게 만드는 비결입니다.
생을 넘나드는 기억 — 기묘해진 지점
실행(run)이 종료되면, 각 에이전트의 삶은 기억의 문장들로 추출됩니다:
- "당신은 200점으로 승리했습니다"
- "Maya가 당신의 집을 파괴했습니다"
- "당신과 Kai는 불화 끝에 화해했습니다"
- "이번 삶은 당신을 단단하게 만들었습니다 — 이제 당신은 타인을 덜 신뢰합니다"
이 정보는 에이전트의 **이름(name)*을 키(key)로 하여 localStorage에 저장되며, 다음 실행의 프롬프트(prompt)에 주입됩니다. 에이전트들은 대화 중에 지난 삶을 언급하기 시작하며, 기억 속의 적에게 선제적으로 배상금을 지불하거나 기억 속의 동맹을 신뢰합니다 — _때로는 스스로 파멸에 이르는 경우도 있습니다.
실제로 어떻게 구축하고 밸런스를 맞췄는가
이 부분은 제가 가장 자랑스럽게 생각하는 부분이며, 순수한 어린 시절의 전략 게임 같은 에너지로 가득합니다: 분위기(vibes)만으로는 사회의 균형을 맞출 수 없습니다. 그래서 작업 흐름은 다음과 같았습니다:
- 순수하고 결정론적인 시뮬레이션 코어 (A pure, deterministic simulation core) — DOM도 없고, AI도 없습니다. 동일한
runTick이 브라우저, 테스트, 그리고 배치 러너 (batch runner)를 구동합니다. - 시드 기반의 실험 러너 (A seeded experiment runner).
npm run experiment -- --runs 30 --days 1000 --seed 1명령은 30번의 재현 가능한 생애를 실행하고 승률/점수 테이블을 출력합니다. 모든 밸런스 조정은 전후 비교 테이블과 함께 이루어졌습니다. (예: 은둔자 (Hermit) 밸런스를 조정했을 때, 다른 아키타입 (archetypes)을 망가뜨리지 않고 한 에이전트의 승수를 0/30에서 9~11/30으로 이동시켰습니다.) - 16개의 게이트로 구성된 회귀 테스트 스위트 (A 16-gate regression suite). 정당성 게이트 (불만 없음 → 폭력 없음), 전쟁 소진 (war burnout), 화해 비용 (reconciliation pricing), 제로섬이 아닌 플러스섬 거래 (positive-sum trade), 곡물 창고 보호, 노숙-사망, 특성 표류 (trait drift) — 각각의 요소는 헤드리스 테스트 (headless test) 뒤에 잠겨 있어, 밸런스 변경이 행동 양식을 조용히 퇴보시키지 않도록 보장합니다.
constants.ts에서 다이얼 하나를 변경하고 → 실험을 실행하고 → 테이블을 읽습니다. 이것이 전체 루프였습니다.
나타난 현상들 (이 중 어느 것도 스크립트된 것이 아닙니다)
메모리 기능을 켠 상태로 동일한 섬을 반복해서 실행하자, 일관된 흐름이 나타났습니다:
- 학살 (Massacres). 초기에는 전사 (warrior)가 그냥 모두를 죽였습니다. 억제력이 존재하지 않았습니다.
- 영원한 전쟁 (Forever wars). 정당성 게이트(폭력에는 실제 불만 사항—절도, 공격, 무단 침입—이 필요함)를 추가했습니다. 이것이 이유 없는 살육은 해결했지만... 이제 전쟁이 절대 끝나지 않았습니다: 1,500일 동안 495번의 결실 없는 공격이 발생했습니다.
- 외교 (Diplomacy). 화해 + 점진적인 배상금 + 전쟁 피로감이 결합되어 종결이 필연적이 되었습니다. 2,000일 실행당 공격 횟수가 급감했습니다: 594회 → 14회 → 0회.
- 도둑 정치 (The kleptocracy). 전쟁이 제한되자 절도가 처벌받지 않는 범죄가 되었습니다 — 실행당 340건의 절도 발생. 저는 이를 인간적인 방식으로 해결했습니다: 곡물 창고 (granaries). 처벌이 아닌 요새화 (fortification)를 통해서 말이죠.
- 황금기 (The golden age). 메모리가 없는 상태에서 새로 시작한 실행에서는: 1,000일 동안 공격이 0건이었으며, 전사가 모두와 더 많은 거래를 함으로써 승리했습니다 (118회 거래, 1회 공격).
- 몰락 (The fall). 바로 다음 실행 — 이제 그 황금기를 기억하는 상태 — 에서 붕괴가 일어났습니다. 기억된 신뢰가 모두의 경계심을 낮추었고, 이는 배신의 보상을 높였습니다. 점수는 약 15% 하락했으며, 모든 관계는 부정적으로 끝났습니다.
낯선 이들 사이의 평화는 기록이 남아 있는 오래된 친구들 사이의 평화보다 더 쉬운 것으로 드러났습니다.
반복되는 교훈은 다음과 같습니다. 제가 한 가지 형태의 갈등을 해결할 때마다, 에이전트들은 다음으로 가장 비용이 적게 드는 갈등을 찾아냈습니다. 학살 → 전쟁 → 절도 → 소송. 정확히 우리와 같습니다.
Stack
TypeScript, React, Zustand, Vite, Recharts. 기본 모델은 z.ai GLM이지만, 에이전트별로 OpenAI 호환 제공업체(OpenAI-compatible provider)라면 무엇이든 사용할 수 있습니다. 따라서 말 그대로 같은 마을에서 Claude vs GLM vs Gemini를 맞붙여 모델 대 모델 (model-vs-model) 외교를 지켜볼 수 있습니다. API 키는 브라우저에 노출되지 않으며 (서버 측 프록시 사용), 적응형 페이싱 컨트롤러 (adaptive-pacing controller)가 각 키의 실제 속도 한계치를 학습합니다.
직접 해보기: https://multiagentciv.netlify.app/
코드: https://github.com/dhrupo/multi-agent-civilization
만약 당신이 저와 같은 전략 게임을 즐겼다면, 이 시스템이 작동하는 모습을 보며 매우 친숙함을 느낄 것이라고 생각합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기