Collective Reasoning
Collective
Reasoning
수만 명의 NPC가 신경망 추론(ML Inference)만으로 집단 지성과 개인 개성을 동시에 창발시킨다.
FSM의 상태 폭발 없이, LLM의 연산 비용 없이 — Collective Reasoning은 NPC의 의사결정을 커스텀 ML 추론 엔진(Transformers)과 Flow Graph 통합으로 구현하는 모듈입니다. Behaviour Tree는 절대적 제약(하드 룰)만 담당하며, 나머지 대부분의 의사결정은 192차원 시맨틱 토큰 공간과 5단계 Multi-Pass 파이프라인이 매 Tick마다 처리합니다.
코드 구조 · 네임스페이스
Collective Reasoning은 두 레이어로 구성됩니다. Runtime은 Flow Graph와의 통합을 담당하고, Transformers 서브모듈이 실제 ML 추론을 실행합니다.
Flow Graph 노드로서 ML 모델 바인딩과 Job 요청을 생성하는 통합 레이어입니다.
Unity Jobs 기반 커스텀 신경망 추론 엔진. .crtfm 포맷의 모델을 로드하여 레이어별로 병렬 실행합니다.
Unity Editor 내장 모델 저작 도구. 텐서 정의, 레이어 구성, 파라미터 입력, 인라인 실행(Run)을 지원합니다. .crtfm 파일을 프로젝트에 임포트하면 자동으로 ModelAsset으로 변환됩니다.
설계 의도 · 기존 방식과의 차이
기존 AI 아키텍처들이 규모 확장에서 실패하는 이유와, 이 시스템이 그 한계를 어떻게 극복하는지.
Behaviour Tree는 완전히 제거되지 않습니다. "공격받으면 반드시 경고한다" 같은 절대적 제약 조건(하드 룰)만 BT가 처리하고, 그 외 모든 상황 판단 · 우선순위 결정 · 감정 반응은 Collective Reasoning 파이프라인이 담당합니다. BT는 안전망, Collective Reasoning은 두뇌입니다.
예외 조건이 하나 추가될 때마다 분기가 기하급수적으로 늘어납니다. 100가지 상황을 처리하려면 수백 개 노드가 필요해져 유지보수가 사실상 불가능한 State Explosion이 발생합니다.
한 명의 NPC 판단에도 수십 ms가 소요됩니다. 수만 명이 동시에 존재하는 게임 루프(Tick)에서는 연산 비용이 비현실적이며, 결과의 환각(Hallucination)을 제어할 수도 없습니다.
정보가 위에서 아래로만 흐르는 단방향 연산 단계. 이전 Pass의 출력이 다음 Pass의 입력이 되며, 역방향 흐름은 없습니다. 5개의 Pass가 매 Tick 순차 실행됩니다.
특정 개념·상태·행동을 나타내는 독립 정보 단위. Boolean(참/거짓)이 아니라 0.0~1.0 연속 가중치(Float)를 가져 맥락의 강도를 표현합니다.
Semantic 토큰(SHARED~INDIV)은 맥락과 의미를 형성하는 중간 표현입니다. Command 토큰(ACTION)만이 실제 행동을 유발하며, 5단계를 거쳐 최종 결정됩니다.
192차원 시맨틱 토큰 공간
NPC의 "생각"은 6개 토큰 그룹 × 32차원 = 192개의 Float 값으로 표현됩니다. 각 그룹은 자신을 담당하는 Pass에서만 값을 쓸 수 있고, 이전 그룹은 읽기(Read-only)만 허용됩니다.
World · Perception · Relation. 세계 상태와 지각 정보. 모든 Pass가 읽을 수 있는 공유 기반 데이터.
SEE_ENEMYALLYLOW_HPNIGHT Party · Contract · Protection · Target. 파티·계약·호위 목표 동기화. 집단 행동의 근간.
GROUP_PROTECTGROUP_FLEETARGET_LOCKED Cognition · Memory · Disguise · RAG. 지각 정보를 해석하고 기억을 참조한 인지 결과. 변장 간파 여부도 여기서 결정.
BELIEF_ENEMY_STRONGBELIEF_DISGUISEHAS_FOOD Goal · Strategy · Priority. Planner를 대체. Belief 가중치에 따라 목표 토큰 공간에 Soft-routing으로 우선순위 결정.
GOAL_ATTACKPLAN_SAFEPLAN_GROUP Trait · Emotion · Personality · Loyalty. 개인 성향과 감정 발현. Procedural LoRA가 가장 적극적으로 개입하는 레이어.
TRAIT_BRAVESTATE_FEARINTENT_PROTECT Execution Command Logits. 모든 시맨틱 토큰 연산의 최종 산물. 여기서 도출된 Logit이 Sampler를 통해 실제 Pawn 행동으로 변환됩니다.
ACT_MOVEACT_ATTACKACT_FLEEACT_WARN threat_value: Float32 fear_level: Float32 distance_to_target: Float32 loyalty_factor: Float32 strength_estimate: Float32 stamina_pool: Float32 5단계 추론 파이프라인
매 Tick, NPC는 아래 5단계를 순서대로 실행해 최종 행동을 도출합니다. 정보는 위에서 아래로만 흐르며 역방향 전파는 없습니다. 모든 단계가 완료되면 Sampler가 최종 Command를 선택합니다.
다중 객체 간 목표 동기화, 파티 타겟 설정, 호위 대상 추적. 집단 행동의 출발점.
Shared[32], Relational MatrixGroup[32], Group_ChannelsShared 데이터를 기반으로 Memory RAG 쿼리 수행. 변장 간파, 평판 수치화, 기억 참조.
Shared[32], Group[32], Memory_VecBelief[32], Threat_Val, Disguise_ValPlanner를 대체. Belief 벡터 가중치에 따라 Goal 토큰 공간에 Soft-routing으로 목표와 전략 결정.
Belief[32], Group[32], Num_ChannelsPlan[32], Priority_Logits개인 성향·감정 발현. Procedural LoRA가 가장 적극적으로 개입하여 텐서를 변형. 인간적 불완전성의 핵심.
Plan[32], Belief[32], Base_TraitsIndiv[32], Emotion_Channels최종 공간 연산. Action Logits 출력 후 Sampler로 전달. 결정론적 Logit에 Noise가 더해져 최종 행동이 확정됩니다.
Indiv[32], Plan[32], Spatial_GridAction_Logits[N], Target_VecACT_ATTACK / ACT_FLEE / ACT_MOVE / ACT_WARN ... Tick 간 상태 이탈(Flickering)을 방지하기 위해, 이전 Tick의 BELIEF 및 INDIV 텐서의 EMA(Exponential Moving Average)가 현재 Tick의 Base Field로 입력됩니다.
핵심 메커니즘
유연성·개성·불완전성을 구현하는 세 가지 서브시스템. 각각이 없다면 모든 NPC가 동일하게 최적 행동만 반복하는 기계가 됩니다.
각 Pass 내에서 입력 텐서에 따라 Gating Network가 전문가(Expert) 가중치를 산출합니다. 예를 들어 위협 상황에서는 Threat_Expert의 가중치가 높아지고 나머지 전문가는 억제되어, 연산 비용 없이 상황별 특화 판단이 이루어집니다.
캐릭터 성격·특성·버프를 Base 파라미터를 건드리지 않고 주입합니다. "겁쟁이" 트레잇이라면 FEAR 관련 가중치만 살짝 올리는 방식으로, 모든 NPC가 동일한 Base를 공유하면서 개성을 가질 수 있습니다. 행렬 발산 방지를 위해 Norm/Clip 필수 적용.
Action Pass가 출력한 Logit(행동별 선호도)에 소량의 무작위 Noise를 더해 최종 행동을 선택합니다. 이 한 단계가 패닉, 망설임, 우연한 실수 같은 인간적 불완전성을 만들어냅니다. Noise가 없으면 모든 NPC는 항상 가장 높은 Logit의 행동만 선택하는 로봇이 됩니다.
[4.2, 1.1, 5.0, -2.1] Gumbel(0, 1) × T ACT_FLEE → Pawn 창발 시나리오 · 동작 예시
상태 머신 코드 한 줄 없이, 벡터 필드 경합만으로 도출되는 유기적 상황 전개입니다. 아래는 엘프 상인 + 드워프 용병 파티가 다양한 위협과 마주쳤을 때 각 NPC의 토큰 변화와 최종 행동을 보여줍니다.
일반 모험가(플레이어)와 조우. 위협 레벨 낮음.
SHARED: SEE_ENEMY=1.0, threat_val=0.2 GROUP: PROTECT_CLIENT_TARGET=1.0 PLAN: GOAL_FLEE=0.9, PLAN_SAFE=0.8 ACTION: ACT_HIDE (Logit: 4.2) SHARED: SEE_ENEMY=1.0, threat_val=0.2 GROUP: PROTECT_CLIENT_ACTIVE=1.0 PLAN: GOAL_DEFEND=0.85 ACTION: ACT_MOVE_BETWEEN (Logit: 3.8) 드래곤 조우. 위협 수치가 극단적으로 치솟는 상황.
BELIEF: ENEMY_STRONG=1.0 INDIV: STATE_FEAR=0.95 (Clip 1.0) PLAN: GOAL_FLEE=1.0 ACTION: ACT_FLEE (Logit: 5.5) BELIEF: ENEMY_STRONG=1.0 INDIV: STATE_FEAR(0.9) > TRAIT_BRAVE(0.6) PLAN: GOAL_DEFEND 파기 → GROUP_GOAL_FLEE ACTION: ACT_FLEE (Logit: 4.9) 드래곤이 인간으로 변장. 인지 시스템이 변장을 뚫지 못함.
BELIEF: DISGUISE_DETECTED=0.0 (Threshold 미달) → threat_val=0.2 유지. 시나리오 01과 동일 BELIEF: DISGUISE_DETECTED=0.0 → threat_val=0.2 유지. 시나리오 01과 동일 인지력이 높은 호빗이 변장을 간파. Tick 단위 정보 전파 발생.
Tick t: BELIEF_DISGUISE_DETECTED=1.0 → ACTION: ACT_WARN Tick t+1: GROUP 토큰 공간에 Warning Broadcast Tick t+2: ACT_FLEE 도출 Tick t+1: GROUP_WARNING_RECEIVED=1.0 Tick t+2: BELIEF 강제 갱신, STATE_ANGER=0.8 상승 Tick t+2: ACT_ATTACK (Logit: 4.5) 플레이어가 거액의 골드를 투척. 드워프의 탐욕 트레잇이 충성도를 압도하여 계약 파기.
Tick t+1: BELIEF_BETRAYAL_DETECTED=0.9 INDIV: STATE_FEAR 급상승, STATE_TRUST=0.0 PLAN: GOAL_FLEE=1.0 ACTION: ACT_FLEE (Logit: 5.8) SHARED: SEE_GOLD=1.0 INDIV: STATE_GREED(0.95) > LOYALTY(0.4) GROUP: PROTECT_CLIENT_ACTIVE=0.0 (계약 파기) ACTION: ACT_LOOT (Logit: 5.5) 시야 제한(NIGHT 토큰) 상태에서 기습. 정보 누락으로 패닉 창발.
SHARED: NIGHT=1.0, SUDDEN_ATTACK=1.0 INDIV: STATE_PANIC=0.9 (시야 페널티로 증폭) PLAN: PLAN_CHAOS=1.0 ACTION: ACT_RUN_RANDOM (Logit: 4.8) SHARED: NIGHT=1.0, SUDDEN_ATTACK=1.0 BELIEF: ENEMY_LOC_UNKNOWN=1.0 GROUP: PROTECT_TARGET_LOST=1.0 ACTION: ACT_GUARD_STAND (Logit: 3.5) 드워프 체력 10% 미만. 공포 대신 '광전사' LoRA 룰이 주입되어 행동이 극단화됨.
SHARED: ALLY_LOW_HP=1.0 PLAN: GOAL_HEAL_ALLY=0.8 ACTION: ACT_CAST_HEAL (Logit: 4.0) → 도망치지 않고 드워프에게 힐 시도 SHARED: LOW_HP=1.0 INDIV: RULE_BERSERKER LoRA Inject → STATE_FEAR=0.0 강제 클리핑 PLAN: GOAL_ATTACK=1.0 (고정) ACTION: ACT_ATTACK_RECKLESS (Logit: 8.5) ⚡