dev.to

Llama Village: a virtual world powered by local AI with llamadart

Llama Village: llamadart로 구동하는 로컬 AI 가상 마을

Llama Village는 Flutter 3D 장면에서 여러 라마 캐릭터가 각자의 기억과 관계를 바탕으로 움직이고 대화하는 게임 실험입니다. 대화 생성에는 기기 내 언어 모델을 쓰고, 사실 검증과 게임 상태 변화는 코드로 처리합니다.

AI 요약

개발자는 Flutter용 3D 엔진 flutter_scene와 로컬 AI 라이브러리 llamadart를 함께 사용해 가상 마을 게임 Llama Village를 만들었습니다. 플레이어는 Flutter 마스코트 Dash를 조종해 라마들을 찾아가고, 다섯 캐릭터가 각자의 일상을 보내며 대화하는 모습을 지켜봅니다. 캐릭터마다 성격과 욕구, 관계, 목표, 알고 있는 정보가 다릅니다. 잃어버린 스카프와 빵 소문, 비밀스러운 짝사랑, 베리 축제가 이들의 대화와 행동에 영향을 줍니다.

캐릭터별 지식과 대화 검증

게임은 라마마다 무엇을 알고 있는지, 그 정보를 직접 봤는지 다른 캐릭터에게 들었는지 기록합니다. 예를 들어 June은 Mo에게 들어 Pip의 스카프가 연못에 빠졌다는 사실을 압니다. 캐릭터들은 같은 언어 모델을 사용하지만, 캐릭터별 맥락을 달리해 각자의 지식과 관계를 반영합니다.

언어 모델은 대화와 생각을 작성합니다. 임베딩은 대화 내용과 청자가 배울 수 있는 사실의 의미를 비교하고, 선택 기능인 Laya 의사결정 모델은 게임이 허용한 화제 중 일상 대화 주제를 고릅니다. 이동과 욕구, 지식 기록, 엔딩은 코드가 처리합니다. 대화가 끝나면 모델이 언급된 사실과 기분·우정의 변화를 제안하고, 게임이 사실 주장을 검사한 뒤 반영합니다. 비밀은 임베딩 유사도만으로 전달하지 않습니다. 실제 키워드 근거가 있어야 합니다.

정보 전달은 말하는 캐릭터가 먼저 해당 사실을 알고 있어야 시작됩니다. 모델이 대화를 작성하면 게임이 표현에 정보 전달 근거가 있는지 확인합니다. 검증을 통과한 사실만 듣는 캐릭터의 지식에 추가합니다. 따라서 모델이 그럴듯한 말을 만들더라도 검증되지 않은 비밀이 새로 알려지지는 않습니다.

Dash의 선택과 게임 진행

플레이어는 라마를 클릭해 Dash를 찾아가게 합니다. 이동 중에는 모델이 네 가지 대화 선택지를 작성하므로, 직접 메시지를 입력하지 않아도 게임을 진행합니다. 선택지는 게임이 정한 의도와 사실을 바탕으로 모델이 문장으로 표현합니다. Dash는 격려하거나 도움을 주고, 소식을 전하거나 소문을 퍼뜨릴 수 있습니다. 라마의 반응과 신뢰·기분 변화는 규칙에 따라 처리합니다. 잘못된 소문을 믿게 되는 변화도 이후 대화와 엔딩에 이어집니다.

한 주의 목적지는 베리 축제입니다. 라마들은 공연하고 우승자를 뽑습니다. Dash가 쌓은 관계와 소문, 신뢰를 바탕으로 규칙이 우승자와 엔딩을 결정합니다. 플레이가 끝나면 게임 속 기록과 장면 이미지를 활용해 한 주를 그림책으로 다시 씁니다. 일지에는 주요 사건과 대화, 소문, Dash의 방문을 기록합니다.

로컬 추론과 성능 과제

언어 모델과 3D 렌더러가 같은 기기에서 돌아가므로, 모델이 글을 생성하는 동안에도 장면이 계속 실행되어야 합니다. Dash가 이동하는 동안 선택지를 미리 작성하는 식으로 일부 작업을 앞당깁니다. 공개된 버전은 macOS 미리보기이며, 모델 파일을 기기에 둔 채 로컬 추론을 수행합니다.

llamadart는 여러 플랫폼에서 로컬 AI를 실행하는 기반을 제공하지만, 다른 기기에서 같은 경험을 구현하려면 메모리와 추론 속도, 렌더링 예산을 따져야 합니다. 개발자는 모바일 버전에서 LLM 없이 게임을 구성할지도 열린 설계 문제로 남겨뒀습니다. 모든 내용을 실시간 생성하는 데 드는 비용을 고려해 모바일에 필요한 생성량을 다시 살펴볼 계획입니다.

dev.to 반응

  • @josephharris — 플레이어의 상호작용을 마지막에 그림책으로 바꾸는 아이디어가 특히 창의적입니다. 로컬 AI를 이렇게 상호작용이 많은 게임에 활용한 점도 좋습니다.
  • @cubl9snp71hm — NPC 대화를 기기에서 추론하는 방향이 흥미롭습니다. 네트워크 지연과 API 비용을 없애면서 개인정보도 보호합니다. llamadart가 Dart/Flutter에서 llama.cpp를 연결하므로 Python 서버를 거치지 않고 게임 루프에 모델을 넣을 길이 열립니다. 긴 대화에서 컨텍스트 윈도우는 어떻게 관리하나요? 슬라이딩 윈도우를 쓰나요, 요약하나요? 모바일과 데스크톱에서 품질과 메모리 사용량을 맞추려면 어떤 양자화 수준을 쓰나요? Q4_K_M인가요, Q5_K_S인가요? NPC 여럿이 동시에 말할 때 토큰 생성 속도가 병목이 되지는 않나요? 배치 추론을 하나요, 순차적으로 대기열을 처리하나요?
  • @ssapable — June이 직접 본 것과 Mo에게 들은 것을 검사기가 구분하는 부분이 인상적입니다. 많은 ‘AI 마을 주민’ 데모가 건너뛰는 부분입니다. 게시물을 66초짜리 손그림 만화로 만들었습니다. 다섯 라마와 연못에 빠진 스카프, ‘라마가 알고, 대화하고, 게임이 확인한 뒤, 이웃이 배운다’는 흐름, Dash가 이동 중 고르는 네 가지 선택지, LLM 없는 모바일 버전에 관한 열린 질문을 담았습니다. 비밀이 키워드 검사를 통과하지 못했지만 임베딩 유사도가 높으면 듣는 캐릭터는 아무것도 얻지 못하나요? 아니면 ‘Mo에 관한 소문을 들었다’처럼 약한 정보로 저장하나요?
  • @ywnigcsmku2m — 데모가 기기에서 매끄럽게 실행되는 점이 좋습니다. llamadart가 FFI로 llama.cpp를 연결하면 오버헤드는 낮겠지만, NPC 대화에 컨텍스트 윈도우 4천 토큰이면 충분한가요? 슬라이딩 윈도우나 이전 대화 요약을 처리하나요? ‘에이전트마다 isolate 하나’라는 구조는 보기 좋지만 Dart isolate 생성 비용도 작지 않습니다. NPC 50명 이상으로 부하 테스트를 했을 때 GC 압력은 어떤가요? isolate 풀을 재사용하나요? 양자화는 q4_k_m인가요, q8_0인가요? RAM 6~8GB인 모바일에서는 q4_k_m이 안전하겠지만, 클라우드 모델보다 대화 품질이 떨어지나요?
  • @kyisaiah47 — 생성된 대화가 사실 검사는 통과했지만 기분 변화 처리는 실패하면 대화를 되돌리나요, 아니면 두 상태를 따로 저장하나요?
  • @koev3kcjausd — NPC 대화를 게임 루프 안에서 로컬 모델로 처리하면 지연과 API 비용을 피할 수 있어 흥미롭습니다. 긴 대화 기록은 어떻게 관리하나요? 슬라이딩 윈도우를 쓰나요, 요약 단계를 두나요? q4_k_m이나 q5_k_s 같은 양자화 수준이 대화 품질에 뚜렷한 영향을 주나요? 이상한 출력이나 환각, 유해한 출력을 막는 대체 처리나 가드레일도 있나요? 클라우드보다 온디바이스에서 통제하기 어려운 부분입니다. 어떤 기기에서 테스트했으며, NPC 여러 명을 동시에 실행할 때 RAM이나 VRAM은 얼마나 쓰나요?
  • @wafflehacker — 라마가 무언가를 ‘배우기’ 전에 게임이 모델의 사실 주장을 확인하고, 비밀에는 임베딩 유사도만이 아니라 실제 키워드 근거를 요구하는 점이 기억에 남습니다. 모델은 말투를 만들고 규칙은 상태를 관리하는 분리가 적절해 보입니다. 덕분에 라마가 환각만으로 비밀을 알게 되지 않습니다. June이 어떤 정보를 직접 봤는지 Mo에게 들었는지 기록하는 방식은 라마가 이웃을 신뢰하는 정도를 다르게 설정하는 출발점처럼 보입니다. 저는 먼저 지켜보겠습니다. 각자 맥락을 가진 에이전트가 마주치는 모습을 보는 일은 묘하게 흥미롭습니다. 그다음에는 Dash를 혼란을 일으키는 역할로 조종해 거짓 소문이 축제 전까지 얼마나 퍼지는지 보겠습니다. Dash가 개입하지 않아도 라마들이 스스로 거짓 소문을 바로잡은 적이 있나요?
  • @mp6nfjxhrlxc — Llama Village의 캐릭터마다 기기 내 모델이 고유한 ‘목소리’를 만든다는 점이 인상적입니다. 인터넷 연결이나 외부 데이터 전송 없이도 생생한 대화를 만들 수 있습니다. 여러 NPC의 토큰을 병렬 생성할 때 지연 시간을 낮추려고 어떻게 최적화했나요? 작은 모델이 예상보다 잘한 경우도 있나요? 예를 들면 미리 프로그래밍하지 않은 두 캐릭터 사이에 뜻밖의 갈등을 만드는 경우입니다. 저는 2D 게임에서 NPC 행동에 작은 모델을 쓰는 방법을 살펴보고 있는데, 좋은 참고가 됐습니다.

원문: dev.to / 번역·요약: Trawling