French Ship Madame De Pompadour
Python

French Ship Madame De Pompadour

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

GitHub|

스타 트렉에서 영감을 받은 AI와 무작위 행동을 활용한 우주선 시뮬레이터.


FS 마담 드 퐁파두르는 SF 세계관을 배경으로 역동적이고 예측 불가능한 이야기를 만들어내는 텍스트 기반 서사 시뮬레이터입니다. “다음”을 클릭하면 시뮬레이션이 한 턴씩 진행되며, 미리 정의된 행동과 생성형 AI의 조합에 따라 등장인물들이 서로 상호작용하는 모습을 지켜볼 수 있습니다.

image

이 프로젝트의 목표는 단순한 규칙과 AI의 창의력을 바탕으로 복잡한 사회적 역학 관계와 예상치 못한 사건들이 자연스럽게 발생하는 “디지털 테라리움”을 만드는 것입니다.


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

페필로 선장은 승무원 해롤드에게 몸을 돌리며 퉁명스럽게 외쳤다. “폰에게 내려진 징계 조치에 대해 보고해.”

페필로 선장은 통신실로 고개를 돌리며 명령했다. “즉시 뒤부아 중위를 연결해.”

테드릭은 승무원 웨이론에게 몸을 기울이며 속삭였다. “폰이 무슨 짓을 했는지 봤어? 페필로 선장이 오늘 기분이 별로인 것 같네.” 그러며 그는 단정해 보이도록 제복의 주름을 은근슬쩍 다듬었다.

콘스탄틴은 승무원 해롤드를 재빨리 쳐다본 뒤, 근처 난간 일부를 은근슬쩍 닦으며 승무원 모하메드에게 조용히 중얼거렸다. “이번에는 폰이 무슨 짓을 해서 선장님의 눈 밖에 났을까?”

승무원 폰은 초조한 듯 제복을 다듬더니, 승무원 에제키엘과 눈이 마주치자 에제키엘이 대답해 주기를 바라며 속삭이듯 말했다. “오늘은 정말 긴 하루가 되겠군.”

승무원 모하메드는 콘스탄틴이 은근슬쩍 난간을 닦는 것을 눈치채고 난간을 흘끗 보며 말했다. “제대로 문질러 닦아야 할 것 같네, 그치? 콘스탄틴, 이 부분은 우리 둘이서 같이 하는 게 어때?”

승무원 해롤드는 팽팽한 분위기와 선장의 명령을 눈치채고, 무심코 자신의 제복을 다듬으며 승무원 세바스찬에게 중얼거렸다. “폰이 곤경에 처한 것 같네, 그치? 업무가 더 불쾌해지기 전에 분위기 좀 풀려고 커피나 한 잔 하러 갈까?”

긴장된 분위기를 감지한 승무원 웨슬리는 승무원 플린을 향해 돌아서며 물었다. “폰에게 무슨 일이 있었는지 들었어? 선장님 기분이 안 좋아 보이는데, 우리도 담당 구역을 흠잡을 데 없이 깨끗하게 해 둬야겠어.”

페필로 선장은 승무원 해롤드에게 전문적인 의견을 묻는다.

페필로 선장은 승무원 폰을 향해 돌아서며 다그친다. “폰, 현재 담당 구역과 시스템 상태를 즉시 보고해라.”

웨슬리 승무원은 선장이 폰에게 내린 엄한 명령을 눈치채고 재빨리 플린 승무원에게 고개를 돌려 조용히 말한다. “플린, 보급품 보관함을 확인해 보자. 선장님이 비상 식량 재고를 파악하고 싶어 하실 것 같아.” 바쁜 척하며 원치 않는 관심을 피하려는 의도였다.

모하메드 승무원은 페필로 선장 주변의 긴장된 분위기를 감지하고, 조용히 에제키엘 승무원에게 다가가 속삭였다. “혹시 선장님이 급하게 처리해야 할 일이 생길까 봐, 청소 용품을 미리 준비해 두는 게 좋을까?”
imageimage

FS 마담 드 퐁파두르 시뮬레이션의 이 데모 스냅샷에서는 복잡하고 역동적인 사회적 생태계가 움직이는 모습을 관찰할 수 있습니다. 이 시스템은 미리 정해진 시나리오를 통해가 아니라, 독립적인 에이전트들이 상호작용하도록 허용함으로써 하부 갑판에서 풍부하고 설득력 있는 삶의 모자이크를 만들어내며, 새로운 서사를 생성하는 능력을 보여줍니다.

시뮬레이션은 명확한 촉매제로 시작됩니다. 고위 권위자인 페필로 선장이 직접적인 명령을 통해 즉각적이고 중대한 긴장감을 조성하는 것입니다. 이러한 “명령의 연쇄 반응”은 전체 사회적 생태계의 중심 중력점이 됩니다. 그의 요구가 단순히 개별 캐릭터의 대본을 실행에 옮기는 데 그치지 않고, 통합된 고압적인 사건을 촉발한다는 점에 주목하십시오. 이는 단일 행위자의 행동이 공유된 환경 내의 다른 모든 캐릭터의 초점, 분위기, 전략적 목표를 좌우할 수 있는 계층적 구조에 시스템이 새롭게 초점을 맞추고 있음을 보여줍니다.

선장의 명령이 승무원들 사이로 파문을 일으키자, 정교하고 반응적인 사회적 전략들이 등장하는 것을 볼 수 있습니다. 승무원들은 단순히 무의미한 업무를 계속하는 데 그치지 않고, 즉시 새로운 현실을 받아들이기 시작합니다. 테드릭이나 콘스탄틴 같은 캐릭터들이 일시적인 대화 그룹을 형성해 수다를 떨며 상황을 분석하고, 새로운 권력 역학을 이해하려고 애쓰는 모습을 지켜보세요. 더욱 인상적인 점은, 웨슬리 선원이 능동적으로 생존 전략을 수립함으로써 더 높은 수준의 자발적 논리를 보여준다는 것입니다. 그는 선장의 분노를 피하기 위해 자신과 동료 한 명이 공식 업무에 바쁜 척할 것을 제안합니다. 이는 미리 정해진 대본에 따른 행동이 아니라, 인지된 위협에 대응하여 AI가 도출한 논리적인 사회적 결론으로, 위험 평가에 대한 탄탄한 능력을 보여줍니다.

이 짧은 순간은 전문적인 역할과 개인적인 불안감을 매끄럽게 조화시키는, 강력한 ‘자발적 스토리텔링’ 엔진을 드러냅니다. 승무원 해롤드가 선장의 요구에 따라 캐주얼하고 속삭이듯 나누던 대화에서 공식적이고 전문적인 의견을 제시하는 방식으로 전환해야 하는 모습을 통해, 시스템이 상충하는 사회적 맥락을 관리하는 능력을 확인할 수 있습니다. 전체 시뮬레이션은 폰과의 중심적 갈등을 중심으로 전개되며, 개별적이고 조용한 드라마들의 모음이 아닌 통일된 서사적 긴장감을 조성합니다. 이 엔진은 단순한 삶의 모자이크를 생성하는 단계를 넘어 성숙해졌으며, 이제 압박 상황 하에서 사회적 계산, 전략적 동맹, 그리고 자발적으로 형성되는 집단 사고의 복잡한 네트워크를 시뮬레이션할 수 있는 힘을 보여주고 있습니다.

FS Madame de Pompadour는 모듈성과 성능을 위해 백엔드 시뮬레이션 엔진과 프론트엔드 사용자 인터페이스를 분리하는 현대적인 분리형 웹 아키텍처 기반으로 구축되었습니다.

이미지 업로드 중.png…

백엔드: Python, Flask, Gemini

전체 시뮬레이션 코어와 로직은 파이썬 백엔드에 구현되어 있습니다.

  • 파이썬: 강력한 데이터 처리 능력과 견고한 AI/ML 생태계 덕분에 당연한 선택이었습니다. 객체 지향 접근 방식을 통해 확장하기 쉬운 모듈형 CrewmanActorManager 클래스를 구현할 수 있습니다.
  • Flask: 프론트엔드와 통신하는 API를 생성하는 데 사용되는 가볍고 유연한 웹 프레임워크입니다. 이 프레임워크의 유일한 역할은 다음 턴에 대한 요청을 수신하고, 시뮬레이션 로직을 실행하며, 결과를 반환하는 것입니다.
  • Google Gemini: “기계 속의 유령”이라 할 수 있습니다. 이 프로젝트는 Gemini API와 통합되어 지능형 행동 시스템을 구동합니다. 캐릭터가 “지능적으로” 행동하기로 결정하면, 백엔드는 함선의 상황, 캐릭터의 역할, 최근 행동 이력이 포함된 프롬프트를 Gemini 모델로 전송하고, 모델은 이에 따라 창의적이고 맥락을 고려한 행동을 반환합니다.

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

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

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

전체 아키텍처

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

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