French Ship Madame De Pompadour
Python

French Ship Madame De Pompadour

스타트렉 기반의 SF 내러티브를 생성하는 사회 시뮬레이션 및 스토리 생성기. OOP Python/Flask와 일부 데이터 구조, Gemini API, React/Vite/Tailwind 프론트엔드 사용.

AI와 무작위 행동을 기반으로 한 스타트랙에서 영감을 받은 우주선 시뮬레이터


FS 마담 드 퐁파두르는 텍스트 기반의 내러티브 시뮬레이터로, SF 우주를 배경으로 역동적이고 예측 불가능한 이야기를 만들어냅니다. "다음"을 클릭하면 시뮬레이션이 한 턴씩 진행되며, 사전 정의된 행동과 생성형 AI의 조합을 바탕으로 등장인물들이 상호작용하는 모습을 지켜볼 수 있습니다.

image

목표는 단순한 규칙과 AI의 창의적 힘을 통해 복잡한 사회적 역학과 예상치 못한 사건이 발생하는 "디지털 테라리움"을 만드는 것입니다.


FS 마담 드 퐁파두르에 오신 것을 환영합니다.

페필로 선장은 해롤드 선원에게 몸을 돌려 "폰에 대한 징계 조치를 보고하라"고 호통쳤습니다.

페필로 선장은 통신 스테이션 쪽으로 몸을 돌려 "즉시 뒤부아 중위를 연결해 달라"고 요구했습니다.

테드릭은 웨일런 선원에게 몸을 기대어 "폰이 한 짓 봤어? 오늘 페필로 선장님 기분이 안 좋은가 봐"라고 속삭이며, 단정해 보이기 위해 살짝 제복을 정리했습니다.

콘스탄틴은 해롤드 선원을 재빨리 흘낏 본 후, 무함마드 선원에게 조용히 중얼거렸습니다. "폰이 이번엔 무슨 일로 선장님 눈 밖에 났을까"라며 근처 난간 부분을 조심스럽게 닦았습니다.

폰 선원은 긴장하며 제복을 펴고, 에제키엘 선원의 눈길을 잡으며 "오늘은 긴 하루가 되겠네"라고 혼잣말처럼 중얼거리며 에제키엘이 반응하기를 바랐습니다.

무함마드 선원은 콘스탄틴이 조심스럽게 닦는 모습을 보고 난간을 바라보며 "좀 닦아야 할 것 같지, 응? 콘스탄틴, 우리 이 구역 같이 할래?"라고 말했습니다.

해롤드 선원은 긴장된 분위기와 선장의 명령을 알아차리고, 자신의 제복을 자연스럽게 정리하며 세바스티앙 선원에게 "폰이 곤경에 처한 모양이군, 응? 임무가 더 불쾌해지기 전에 커피나 마시러 가는 게 어떨까?"라고 중얼거렸습니다.

긴장감을 감지한 웨슬리 선원은 플린 선원에게 돌아서서 "폰에게 무슨 일이 있었는지 들었어? 선장님 기분이 안 좋으신 것 같아, 우리 스테이션을 깨끗이 해야겠어."라고 물었습니다.

페필로 선장은 해롤드 선원에게 전문적인 의견을 요구합니다.

페필로 선장은 폰 선원에게 몸을 돌려 "폰, 지금 당장 네 현재 스테이션과 시스템 상태를 보고하라"고 명령합니다.

웨슬리 선원은 선장이 폰에게 엄중하게 명령하는 것을 알아차리고, 재빨리 플린 선원에게 돌아서서 조용히 말합니다. "플린, 보급 창고를 확인하자. 선장님이 비상 식량 재고 조사를 원하실 수도 있어."라며 바빠 보여 원치 않는 관심을 피하려 합니다.

무함마드 선원은 페필로 선장 주변의 긴장감을 보고 조용히 에제키엘 선원에게 다가가 속삭입니다. "선장님이 뭔가 빨리 처리하길 원하실 경우를 대비해 청소 용품을 준비해 두는 게 어떨까?"
imageimage

FS 마담 드 퐁파두르 시뮬레이션의 이 데모 스냅샷에서 우리는 복잡하고 역동적인 사회 생태계가 움직이는 것을 관찰할 수 있습니다. 이 시스템은 사전에 작성된 이벤트가 아닌 독립적인 에이전트들이 상호작용하도록 함으로써 창발적인 내러티브를 생성하는 능력을 보여주며, 하부 갑판에서의 풍부하고 설득력 있는 삶의 태피스트리를 만들어냅니다.

시뮬레이션은 명확한 촉매제로 시작됩니다. 고위 권위자인 페필로 선장이 직접 명령을 통해 즉각적이고 높은 긴장감을 불러일으킵니다. 이 "명령 폭포"는 전체 사회 생태계의 중심적인 중력 지점이 됩니다. 그의 요구가 단순히 개별 캐릭터 스크립트를 촉발하는 것이 아니라 통합된 고압력 이벤트를 시작한다는 점에 주목하십시오. 이는 단일 에이전트의 행동이 공유 환경 내 모든 다른 캐릭터의 초점, 분위기 및 전략적 목표를 결정할 수 있는 계층 구조에 대한 시스템의 새로운 초점을 보여줍니다.

선장의 명령이 승무원들 사이로 파문을 일으키면서, 우리는 정교하고 반응적인 사회적 전략의 출현을 목격합니다. 승무원들은 단순히 빈둥거리는 작업을 계속하지 않습니다. 그들은 즉시 새로운 현실을 처리하기 시작합니다. 테드릭과 콘스탄틴 같은 캐릭터들이 수다를 떨고 상황을 분석하기 위해 임시 대화 그룹을 형성하여 새로운 권력 역학을 이해하려고 시도하는 모습을 지켜보십시오. 더 인상적인 것은, 웨슬리 선원이 생존 전략을 적극적으로 공식화함으로써 더 높은 수준의 창발적 논리를 보여준다는 점입니다. 그는 자신과 동료 선원이 선장의 분노를 피하기 위해 공식적인 임무로 바빠 보여야 한다고 제안합니다. 이것은 사전에 작성된 행동이 아니라, 인지된 위협에 대한 응답으로 AI가 생성한 논리적인 사회적 결론이며, 강력한 위험 평가 능력을 보여줍니다.

이 짧은 창은 전문적인 역할과 개인적인 불안을 매끄럽게 혼합하는 창발적 스토리텔링을 위한 강력한 엔진을 드러냅니다. 해롤드 선원은 편안하고 조용한 대화에서 선장의 요구에 대한 공식적이고 전문적인 의견을 제시하는 쪽으로 전환해야 하며, 이는 시스템이 상충되는 사회적 맥락을 관리하는 능력을 보여줍니다. 전체 시뮬레이션은 폰과의 중심 갈등을 중심으로 돌아가며, 별개의 조용한 드라마 모음이 아닌 통일된 내러티브 압력솥을 만듭니다. 이 엔진은 단순한 삶의 태피스트리를 생성하는 수준을 넘어, 어려움 속에서 사회적 계산, 전략적 동맹 및 창발적 집단 사고의 복잡한 그물망을 시뮬레이션하는 능력을 보여주며 성숙해졌습니다.

FS 마담 드 퐁파두르는 모듈성과 성능을 위해 백엔드 시뮬레이션 엔진을 프론트엔드 사용자 인터페이스와 분리한 현대적이고 분리된 웹 아키텍처로 구축되었습니다.

Uploading image.png…

백엔드: Python, Flask, Gemini

전체 시뮬레이션 코어와 로직은 Python 백엔드에 있습니다.

  • Python: 강력한 데이터 처리와 견고한 AI/ML 생태계를 위한 자연스러운 선택입니다. 객체 지향 접근 방식은 확장이 쉬운 모듈식 CrewmanActorManager 클래스를 가능하게 합니다.
  • Flask: 프론트엔드가 통신하는 API를 생성하는 데 사용되는 가볍고 유연한 웹 프레임워크입니다. 유일한 책임은 다음 턴에 대한 요청을 수신하고, 시뮬레이션 로직을 트리거하고, 결과를 반환하는 것입니다.
  • Google Gemini: "기계 속의 유령"입니다. 이 프로젝트는 Gemini API와 통합하여 지능형 행동 시스템을 구동합니다. 캐릭터가 "지능적으로" 행동하기로 결정하면, 백엔드는 우선의 맥락, 캐릭터의 역할, 최근 행동 이력을 포함한 프롬프트를 Gemini 모델로 보내고, 모델은 창의적이고 맥락에 맞는 행동을 반환합니다.

프론트엔드: React, Vite, Tailwind CSS

사용자 인터페이스는 빠르고 현대적인 단일 페이지 애플리케이션(SPA)입니다.

  • React: 동적이고 컴포넌트 기반의 사용자 인터페이스를 구축하기 위한 강력한 JavaScript 라이브러리입니다. 전체 이벤트 로그는 백엔드에서 새 작업을 수신할 때 효율적으로 업데이트되는 React 컴포넌트입니다.
  • Vite: 매우 빠른 개발 서버와 최적화된 프로덕션 빌드를 제공하는 차세대 프론트엔드 빌드 도구입니다.
  • TypeScript: JavaScript 코드에 정적 타이핑을 추가하여 개발자 경험을 개선하고 버그를 줄이는 데 사용됩니다.
  • Tailwind CSS: 컴포넌트의 클래스 이름에서 볼 수 있듯이 HTML 내에서 직접 빠르고 일관된 스타일링을 가능하게 하는 유틸리티 우선 CSS 프레임워크입니다.

전체 아키텍처

단일 턴의 흐름은 간단하고 효과적입니다:

  1. 사용자가 React 기반 UI에서 "다음" 버튼을 클릭합니다.
  2. 프론트엔드는 Flask에서 실행되는 백엔드의 /action 엔드포인트로 fetch 요청을 보냅니다.
  3. Flask 서버는 Python ActorManager를 호출하고, 이는 시뮬레이션의 한 턴을 실행하며 잠재적으로 Gemini API를 호출합니다.
  4. 백엔드는 결과 작업 문자열을 JSON 객체로 반환합니다.
  5. React 프론트엔드는 JSON을 수신하고, 상태를 업데이트하며, 화면에 새 이벤트를 렌더링하고 자동으로 최신 항목으로 스크롤합니다.