4개 랩의 소형 모델을 배치한 Thousand Token Wood v2

하나의 고성능 모델에 각기 다른 페르소나 프롬프트를 입력하면 충분히 다양한 에이전트를 만들 수 있다는 믿음이 있었다. Thousand Token Wood v2는 이 믿음을 모델의 다양성이라는 결과로 반박했다. 개발팀은 모델 하나에 역할만 나눠 부여했을 때 에이전트들이 결국 비슷하게 행동하는 한계를 확인했다. 이를 해결하기 위해 OpenAI의 gpt-oss-20b, OpenBMB의 MiniCPM3-4B, NVIDIA(엔비디아, AI 칩 및 플랫폼 기업)의 Nemotron-Mini-4B, 그리고 자체 파인튜닝한 Qwen 0.5B까지 총 4개 랩의 소형 모델을 하나의 플랫폼에 통합했다. 서로 다른 학습 데이터와 포스트 트레이닝 과정을 거친 모델들을 배치해 에이전트 간의 실질적 차이(genuine difference)를 구현한 것이다.

모델의 출처가 달라지자 에이전트의 사고 체계 자체가 갈렸다. 정해진 스크립트를 따르는 것이 아니라 모델 간의 실시간 논쟁 형태로 시장이 작동한다. 학습 데이터의 차이 덕분에 부엉이 캐릭터가 자산을 사재기하는 방식과 여우 캐릭터가 투기하는 방식이 서로 다르게 나타난다. 이는 단순히 말투가 바뀌는 수준이 아니라, 상황을 판단하고 전략을 세우는 논리 구조 자체가 모델별로 다르게 작동하고 있음을 보여준다.

사용자는 이 생태계에서 그림자 금융가인 Patron of the Wood 역할을 맡는다. 이자 기반의 대출을 실행하고 정보를 제공하거나 공매도를 치며, 뇌물을 주고 동맹을 중개하는 금융 행위를 수행한다. 이 과정에서 사용자의 거래 행위를 추적해 제재하는 치안 판사(magistrate) 캐릭터가 배치되어 게임 내 갈등 구조를 형성한다. 사용자가 부적절한 정보를 이용해 이득을 취하면 치안 판사가 이를 추적하는 식의 상호작용이 실시간으로 일어난다.

서로 다른 4종의 모델을 한 곳에 모으면서 가장 먼저 부딪힌 문제는 모델링이 아니라 서빙 레이어의 마찰이었다. 각 모델이 사용하는 토크나이저와 포맷팅 습관이 제각각이라 출력값에서 JSON 말형성 오류가 빈번하게 발생했다. 개발팀은 모든 모델의 출력이 통과하는 JSON parse-and-repair 레이어를 구축해 이 마찰을 해결했다. 결국 소형 모델의 성능 부족을 해결하는 방법은 모델의 크기를 키우는 스케일업이 아니라, 구조(Structure)와 데이터 흐름 제어라는 실무적 접근으로 추론의 간극을 메우는 것이라는 판단 기준을 제시한다.

서빙 레이어의 마찰을 해결하는 JSON parse-and-repair

모델 하나에 역할만 다르게 부여하면 에이전트들이 결국 비슷하게 행동한다는 상식을 뒤집었다. v2는 OpenAI, OpenBMB, NVIDIA, Qwen 등 서로 다른 4개 랩의 소형 모델을 하나의 플랫폼에 통합해 각 에이전트의 개별 사고 체계를 구현했다. 각 랩이 사용한 학습 데이터와 포스트 트레이닝 방식의 차이가 모델 간의 실질적 차이를 만드는 핵심 동력이 됐다. 모델의 크기를 키우지 않고도 서로 다른 랩의 모델을 섞는 것만으로 에이전트 간의 개성 있는 상호작용을 이끌어낸 결과다.

서로 다른 모델을 한 곳에 모으자 모델링 단계가 아닌 서빙 레이어에서 예상치 못한 마찰이 발생했다. 모델마다 사용하는 토크나이저(Tokenizer)가 다르고 텍스트를 구성하는 포맷팅 습관이 달라 JSON 출력 형식이 깨지는 말형성(malformations) 현상이 빈번하게 나타났다. 개발팀은 모든 모델의 출력이 반드시 통과해야 하는 tolerant JSON parse-and-repair 레이어를 설계해 이 문제를 해결했다. 이 레이어는 출력된 JSON의 문법 오류를 실시간으로 분석해 수정하며, 구조적으로 복구할 수 없는 데이터는 과감하게 드롭(drop) 처리한다. 데이터 일부를 손실하더라도 시뮬레이션 전체가 멈추는 크래시를 방지해 시스템의 연속성을 확보하는 작동 방식이다. 각 모델의 서로 다른 출력 습관을 이 레이어에서 표준화함으로써 이기종 모델 간의 데이터 정합성을 맞췄다.

서빙 레이어의 마찰을 제거하자 새로운 모델을 도입하는 엔지니어링 비용이 획기적으로 줄었다. 이전에는 모델을 추가하거나 교체할 때마다 각 모델의 출력 특성에 맞춰 코드를 다시 짜는 리팩토링 작업이 필수적이었다. 하지만 parse-and-repair 레이어가 구축된 이후에는 설정(config) 파일의 항목만 변경하는 것으로 모델 추가가 가능해졌다. 이는 소형 모델의 성능 부족을 모델의 스케일업으로 해결하려는 관성에서 벗어나, 시스템 구조(Structure)와 데이터 흐름 제어로 추론 간극을 메우는 실무적 판단 기준을 보여준다. 서빙 레이어가 견고하게 구축된 상태에서는 이기종 모델의 조합이 더 이상 개발 리스크가 아닌 단순한 설정 변경의 영역으로 전환된다. 결과적으로 모델의 개별 성능보다 이를 통합하는 구조적 설계가 시스템의 확장성을 결정한다.

기존 방식과 달라진 지점

멀티 에이전트를 설계할 때, 모델 하나에 역할만 다르게 부여하면 정말 서로 다른 성격의 에이전트가 탄생할까. 기존의 v1 구조는 하나의 파인튜닝된 0.5B 모델이 다섯 마리의 숲속 생물 캐릭터를 모두 수행하는 샌드박스 형태였다. 사용자가 외부 충격을 주고 거품과 붕괴가 일어나는 과정을 지켜보는 관찰용 장난감에 가까웠다. 하지만 v2는 설계 방식부터 완전히 바꿨다. 하나의 모델에 여러 프롬프트를 주는 대신, OpenAI, OpenBMB, NVIDIA, 그리고 파인튜닝된 Qwen 0.5B까지 서로 다른 4개 랩의 소형 모델을 각각의 캐릭터에 배치했다.

단순한 다양성 확보가 목적이 아니다. 시장 시뮬레이션이 흥미로우려면 참가자 사이에 실질적인 차이(genuine difference)가 있어야 한다. 학습 데이터와 포스트 트레이닝 과정이 서로 다른 모델들을 섞자, 프롬프트만으로는 구현하기 힘들었던 개별 사고 체계가 나타났다. 부엉이 캐릭터가 자원을 사재기하는 방식과 여우 캐릭터가 투기하는 방식이 모델의 학습 배경에 따라 다르게 작동한다. 정해진 스크립트를 따라가는 것이 아니라, 서로 다른 모델들이 실시간으로 논쟁(live argument)하며 시장을 움직이는 구조다.

서로 다른 모델 4종을 하나의 플랫폼에 통합하면서 가장 먼저 부딪힌 문제는 모델링이 아닌 서빙 레이어의 마찰이었다. 모델마다 토크나이저(Tokenizer)가 다르고 포맷팅 습관이 달라 JSON 출력물에 말형성(malformations) 오류가 빈번하게 발생했다. 이를 해결하기 위해 모든 모델의 출력이 통과하는 tolerant JSON parse-and-repair 레이어를 구현했다. 복구 불가능한 데이터는 과감히 드롭(drop) 처리하여 시뮬레이션 전체가 크래시되는 상황을 막았다. 이 레이어를 한 번 구축하자 새로운 모델을 추가할 때 전체 코드를 리팩토링할 필요 없이 설정(config) 파일만 변경하면 되는 확장성을 확보했다.

결국 소형 모델의 성능 부족을 모델의 크기를 키우는 스케일업으로 해결하려는 시도는 효율적이지 않다. 소형 모델은 신뢰할 수 있는 포맷 생성기이지만 추론 능력은 불안정한 특성을 가진다. 이 간극을 메우는 실무적 판단 기준은 모델의 체급이 아니라 구조(structure)와 데이터 흐름의 제어에 있다. 모델 간의 이질성을 인정하고 이를 수용하는 서빙 레이어를 설계하는 것이, 단일 거대 모델에 의존하는 것보다 더 뚜렷한 에이전트의 개성을 만들어낸다.

프롬프트 인플레이션과 정보 유출을 막는 데이터 흐름 제어

소형 모델에게 비밀 정보를 입력하면 모델은 이를 그대로 출력할 가능성이 매우 높다. 프롬프트에 포함된 모든 텍스트는 모델이 다시 뱉어낼 수 있는 잠재적 데이터가 되기 때문이다. 이번 설계에서는 정보 유출을 막기 위해 내부 정보인 히든 플래그(hidden flag)를 프롬프트 외부 영역에 배치했다. 이 플래그는 플레이어의 원장(ledger)에만 저장되며, 공개 이벤트 기록을 생성하는 시점에 시스템적으로 완전히 제거된다. 특히 매 턴마다 모든 에이전트의 전체 프롬프트를 전수 스캔하여 금지된 토큰(banned tokens)이 포함되었는지 확인하는 테스트를 수행한다. 개발자는 이 테스트를 전체 테스트 스위트에서 가장 중요한 항목으로 정의했다. 보안을 프롬프트 내의 지시문이 아니라 데이터 흐름의 물리적 격리와 검증으로 해결한 결과다.

대화 기록이 누적됨에 따라 프롬프트 길이가 무한히 늘어나는 프롬프트 인플레이션은 소형 모델이 맥락을 놓치게 만드는 주된 원인이다. 전체 히스토리를 프롬프트에 그대로 밀어 넣으면 모델은 정보의 홍수 속에서 정작 중요한 지시사항을 망각한다. 이를 해결하기 위해 전체 기록 대신 정수형 감정 수치에서 도출된 한 줄 요약 버킷(one-line bucketed summary)만을 제공하는 방식을 택했다. 예를 들어 에이전트 간의 관계를 숫자로 관리하고, 프롬프트에는 "당신은 오나에게 따뜻함을 느끼고 후원자에게는 경계심을 갖는다"와 같이 정제된 요약문만 전달한다. 가장 강한 몇 가지 감정으로 범위를 제한해 모델이 처리해야 할 토큰 수를 엄격히 통제했다. 기억의 지속성은 유지하면서도 모델의 연산 부담을 줄여 추론의 정확도를 높였다.

소형 모델의 확률적 생성에만 의존하면 적대 관계인 에이전트가 갑자기 대출을 승인하는 등 설정이 붕괴되는 현상이 빈번하다. 개발팀은 이러한 핵심 행동 제어를 확률적 생성이 아닌 결정론적(deterministic) 방식으로 처리해 변수를 제거했다. 강한 적대감을 가진 에이전트가 대출을 거부하거나 불리한 조건을 제시하는 동작은 모델의 선택에 맡기지 않고 시스템적으로 강제한다. 행동 편향은 요약문이 모델의 톤을 유도하는 창발적 요소와, 특정 조건에서 동작을 확정 짓는 기계적 요소의 결합으로 작동한다. 이는 모델의 파라미터 스케일을 키워 지능을 높이려는 시도보다, 데이터 구조와 흐름 제어라는 설계적 접근이 소형 모델의 신뢰도를 확보하는 데 더 효율적이라는 실무적 판단을 보여준다.

소형 모델 실무 적용: 스케일이 아닌 구조로 간극 메우기

어제까지의 실험적 아키텍처가 오늘 바로 프로덕션 환경의 설계 기준으로 바뀐다. 소형 모델을 실무에 투입했을 때 마주하는 가장 정직한 사실은 이들이 신뢰할 수 있는 포맷 생성기(reliable format generator)인 동시에 신뢰할 수 없는 추론기(unreliable reasoner)라는 점이다. 멀티 에이전트를 설계할 때 모델 하나에 역할만 나눠 부여하면, 에이전트들이 결국 비슷하게 행동하는 문제가 발생한다. 개발자가 느끼는 성능의 간극은 모델의 파라미터 숫자를 늘리는 스케일업으로 해결되지 않는다. 대신 구조(structure)를 설계하고, 정교한 프롬프팅과 소규모 파인튜닝을 조합해 추론의 빈틈을 메우는 방식이 실질적인 해결책이 된다.

에이전트에게 비밀 정보를 부여하는 설계 방식에서도 프롬프트 지시어에 의존하는 관습이 바뀐다. 프롬프트에 비밀 정보를 넣고 누설하지 말라고 지시하는 것은 보안이 아니라 희망 사항에 가깝다. 소형 모델 에이전트의 경우, 모델이 반복할 수 있는 모든 내용은 결국 프롬프트에 입력된 값이기 때문이다. 따라서 비밀 정보는 프롬프트 외부의 데이터 흐름(data flow) 상에 방화벽을 구축해 격리하고, 공개 이벤트 기록 생성 시 해당 플래그를 물리적으로 제거하는 구조를 택한다. 매 턴마다 모든 에이전트의 전체 프롬프트에서 금지된 토큰(banned tokens)이 있는지 스캔하는 테스트로 이를 증명하는 과정이 필수적이다. 에이전트에게 비밀 정보를 줄 때는 테스트로 증명되지 않는 한 반드시 유출된다고 가정하는 것이 설계의 기본이다.

메모리 효율을 관리하는 방식은 프롬프트 팽창(prompt inflation)이라는 함정을 피하는 것에서 시작한다. 대화 기록이 무제한으로 늘어나면 소형 모델은 정보의 바다에 빠져 추론 능력을 상실한다. 가장 저렴하게 에이전트에게 생동감을 주는 방법은 전체 이력을 넣는 것이 아니라, 정수 형태의 감정 수치에서 도출된 한 줄짜리 요약본(bucketed summary)만 프롬프트에 노출하는 것이다. 예를 들어 "당신은 Oona에게 호감을 느끼며, 후원자에게는 경계심을 갖는다"와 같이 제한된 요약본만 제공해 행동 편향을 유도한다. 이러한 방식은 모델의 성능에 기대는 것이 아니라 데이터 흐름의 제어를 통해 관찰 가능하고 테스트 가능한 행동을 만들어내는 실무적 판단이다. 강한 적대감을 가진 에이전트가 결정론적으로 요청을 거부하게 만드는 기계적 제어와 요약본을 통한 행동 유도를 병행함으로써 소형 모델의 한계를 구조적으로 극복한다.

단일 모델에 역할만 다르게 부여하면 에이전트들이 결국 비슷하게 행동하는 문제가 발생한다. OpenAI, OpenBMB, NVIDIA, Qwen 등 4개 랩의 서로 다른 소형 모델을 하나의 플랫폼에 통합해 각 에이전트의 개별 사고 체계를 구현한 이유다. 서로 다른 토크나이저와 포맷팅 습관으로 발생하는 오류는 JSON parse-and-repair 레이어를 통해 기술적으로 해결했다.

이는 소형 모델의 성능 부족을 모델 스케일업이 아닌, 구조와 데이터 흐름 제어로 해결하는 실무적 판단 기준을 제시한다. 이제 에이전트의 완성도는 개별 모델의 파라미터 크기가 아니라 이를 엮어내는 구조적 설계의 정밀함에서 결정된다.