나무꾼이 혼자 장작을 공급하는 숲에서, 겨울이 오면 장작 가격이 뛰고 나무꾼만 부자가 됩니다. 이 경제를 움직이는 건 3B 파라미터짜리 소형 AI 모델 다섯 개입니다.

개발자 Lester Leong이 Hugging Face의 Build Small Hackathon에서 제작한 ‘Thousand Token Wood’는 다섯 마리의 숲 속 동물이 각자의 AI 에이전트로 물물교환을 하는 경제 시뮬레이션입니다. 버블과 폭락, 부의 격차가 스스로 나타납니다. v1과 v2에 걸친 이 엔지니어링 보고서는 그 과정에서 발견한 것들을 담고 있습니다.
출처:
- Thousand Token Wood: shipping a multi-agent economy on a 3B model – Hugging Face Blog
- Five labs, five minds: building a multi-model finance drama on small models – Hugging Face Blog
대형 모델은 처음부터 선택지가 아니었다
실시간 경제 시뮬레이션에서 GPT-4 같은 프런티어 모델은 맞지 않습니다. 매 턴마다 에이전트 5개가 동시에 판단을 내려야 하는데, 대형 모델은 너무 느리고 비쌉니다. 3B 모델은 하나의 GPU 배치 콜로 전체 에이전트의 응답을 한 번에 처리할 수 있습니다. 소형 모델이 제약이 아니라 이 시스템의 설계 전제인 이유입니다.
첫 번째 실패: 아무도 거래하지 않았다
처음 만든 버전은 조용했습니다. 모든 크리처가 스스로 충분한 식량을 생산할 수 있었기 때문에 굳이 거래할 이유가 없었습니다. 시장은 한 번 청산되고 멈췄습니다.
해결책은 결핍을 설계하는 것이었습니다.
- 한 번에 같은 음식은 한 단위만 먹을 수 있게 해, 다양한 음식을 사야 하는 구조를 만들었습니다.
- 음식이 부패하는 메커니즘을 추가해, 잉여 생산분을 팔지 않으면 손해가 나도록 했습니다.
- 겨울마다 모두가 장작을 태워야 하는데, 장작을 만드는 크리처는 단 하나입니다.
세 번째 장치가 핵심입니다. 독점 공급자 하나가 늘어나는 수요를 감당할 수 없으니 장작 가격이 오르고, 나머지 모두가 경쟁하며 나무꾼만 부자가 됩니다. 결핍을 설계하자, 드디어 거래가 시작됐습니다.
두 번째 실패: 도토리 다람쥐가 도토리를 샀다
거래가 시작되고 나서야 더 근본적인 문제가 드러났습니다. 도토리를 직접 키우는 다람쥐가 도토리를 사겠다는 주문을 냈습니다.
75번의 판단 중 JSON 형식 오류는 단 한 건도 없었습니다. 하지만 경제적 판단은 형편없었습니다. 소형 모델은 포맷을 완벽하게 생성하지만, 추론은 그렇지 않습니다.
고친 방법은 모델 교체가 아니었습니다. 각 에이전트에게 “네가 생산하는 것은 X이고, X는 절대 사지 않는다”는 규칙과 부족한 재화 목록, 예시 하나를 함께 제공하자 판단의 질이 즉시 올라갔습니다. 더 큰 모델이 아니라 더 날카로운 프롬프트가 필요했던 겁니다.
v2: 다른 Lab의 모델을 섞으면 어떻게 될까
v1이 완성되자 다음 질문이 생겼습니다. 에이전트마다 다른 Lab의 모델을 쓰면 어떻게 될까요?
v2에서는 OpenAI의 gpt-oss-20B, OpenBMB의 MiniCPM3-4B, NVIDIA의 Nemotron-Mini-4B, 그리고 직접 파인튜닝한 Qwen 0.5B가 하나의 의회를 구성합니다. 서로 다른 데이터와 후처리로 만들어진 모델들은 실제로 다르게 판단합니다. 올빼미가 쌓아두는 방식과 여우가 투기하는 방식이 달라지며, 창발적 행동이 더 풍부해집니다.
실제 엔지니어링 도전은 모델이 아니라 서빙 레이어였습니다. vLLM이 CUDA 툴킷을 필요로 하는데, 기본 이미지에는 없어서 네 모델이 동일한 에러로 실패했습니다. 베이스 이미지 하나를 CUDA 개발 이미지로 교체하자 전부 해결됐습니다. 그 외에는 모델마다 각각 한 줄짜리 설정 차이뿐이었습니다. 이것이 가능했던 기반은 v1부터 있던 내결함성 JSON 파서입니다. 모델이 달라지면 오류 패턴도 달라지지만, 복구할 수 없는 응답을 노옵(no-op)으로 처리하면 시뮬레이션이 절대 멈추지 않습니다. 새 모델 추가는 설정 파일 한 줄로 끝납니다.
v2에서는 플레이어도 직접 게임에 참여합니다. 크리처에게 내부자 정보를 속삭이고, 시장을 조종하고, 치안관의 추적을 피하는 역할입니다. 그런데 이 기능을 구현하면서 새로운 문제가 생겼습니다.
에이전트에게 비밀을 주면, 비밀은 사라진다
내부자 게임이 성립하려면 크리처가 정보의 진위를 몰라야 합니다. 그런데 소형 모델엔 구조적인 특성이 있습니다. 프롬프트에 들어간 내용은 무엇이든 반복될 수 있습니다.
해법은 프롬프트 지시가 아니라 데이터 흐름에서의 격리였습니다. 정보의 진위를 나타내는 플래그는 플레이어 장부에만 존재하고, 공개 이벤트 기록에는 절대 삽입되지 않습니다. 매 턴, 모든 크리처의 전체 프롬프트를 자동으로 스캔해 금지 토큰이 없음을 검증합니다. 저자는 이 테스트가 전체 코드베이스에서 가장 중요하다고 말합니다.
같은 원칙이 기억 설계에도 적용됩니다. 크리처들은 서로에 대한 감정을 기억하는데, 이 기록을 프롬프트에 그대로 쌓으면 턴이 지날수록 무한정 늘어납니다. 해법은 기록 대신 요약 한 줄(“당신은 Oona에게 우호적이고, Patron을 경계합니다”)만 프롬프트에 노출하는 것입니다. 지나치게 적대적인 크리처는 기계적으로 대출을 거부하게 해, 관찰하고 테스트할 수 있는 행동으로 만들었습니다.
도토리 다람쥐가 알려준 것
도토리를 키우는 다람쥐가 도토리를 사겠다고 한 그 순간이, 이 프로젝트 전체를 관통하는 핵심입니다. 소형 모델은 신뢰할 수 있는 포맷 생성기이지 신뢰할 수 있는 추론 엔진이 아닙니다. 그 간극을 메우는 것은 더 큰 모델이 아니라, 구조와 프롬프트, 그리고 시스템 설계입니다.
3B짜리 모델 다섯 개가 튤립 버블을 재현하고 뱅크런을 흉내 낸 건 모델이 경제를 이해해서가 아닙니다. 결핍이 설계되고, 프롬프트가 날카로워지고, 실패가 노옵으로 처리됐기 때문입니다. 에이전트 트레이스 전체는 오픈소스로 공개되어 있습니다.
참고자료: Thousand Token Wood 에이전트 트레이스 데이터셋 – Hugging Face

답글 남기기