French Ship Madame De Pompadour
Python

French Ship Madame De Pompadour

Star Trekに基づくSFナラティブを生成する社会シミュレーション&ストーリージェネレーター。OOP Python/Flask、一部のデータ構造、Gemini API、React/Vite/Tailwindフロントエンド。

GitHub|

『スター・トレック』に着想を得た、AIとランダムアクションを用いた宇宙船シミュレーター。


FS Madame de Pompadourは、SFの世界を舞台に、ダイナミックで予測不可能なストーリーを生み出すテキストベースの物語シミュレーターです。「次へ」をクリックするたびにシミュレーションが1ターンずつ進行し、あらかじめ定義された行動と生成AIの組み合わせに基づいて、登場人物たちが互いに交流する様子を見ることができます。

image

その目的は、単純なルールとAIの創造力から、複雑な社会的ダイナミクスや予期せぬ出来事が生まれる「デジタルテラリウム」を作り出すことです。


FSマダム・ド・ポンパドゥールへようこそ。

ペピロ船長は乗組員のハロルドの方を向き、怒鳴りつけた。「フォンに対する懲戒処分について報告せよ。」

ペピロ船長は通信ステーションの方を向き、命じた。「直ちにデュボア中尉につないでくれ。」

テドリックは乗組員ウェイロンに身を乗り出し、「ヴォンのやったこと、見たか? ペピロ船長は今日は機嫌が悪そうだ」とささやきながら、身だしなみを整えるようにさりげなく制服を直した。

コンスタンティンはハワード乗組員をちらりと見ると、近くの欄干の一部をさりげなく磨きながら、モハメッド乗組員に小声で呟いた。「今回は、ヴォンが何をやって船長の機嫌を損ねたんだろうな」

乗組員フォンは神経質に制服の襞を直すと、乗組員エゼキエルの視線と合い、エゼキエルが反応してくれることを期待して、小声で「今日は長い一日になりそうだ」と呟いた。

乗組員モハメッドは、コンスタンティンがこっそりと手すり磨きをしているのに気づき、手すりに目をやりながら言った。 「しっかりこすらないとダメそうだな? この部分は一緒にやらないか、コンスタンティン?」

乗組員のハロルドは、張り詰めた空気と船長の命令に気づくと、さりげなく自分の制服を整えながら、乗組員のセバスチャンに呟いた。「ヴォン、やばいことになりそうだな? 任務がもっと厄介になる前に、気分転換にコーヒーでも飲みに行こうか?」

その緊張感に気づいた乗組員のウェストリーは、乗組員のフリンの方を向いて尋ねた。「ヴォンの件、聞いたか? 船長、機嫌が悪そうだ。俺たちの担当箇所も完璧に掃除しておいたほうがいいんじゃないか。」

ペピロ船長は、乗組員ハロルドに専門的な意見を求めました。

ペピロ船長は乗組員ヴォンの方を向き、こう命じました。「ヴォン、現在の担当ステーションとシステムの状況を直ちに報告せよ。」

ウェストリー乗組員は、フォンに対する船長の厳しい命令に気づくと、素早くフリン乗組員の方を向き、小声でこう言った。「フリン、物資ロッカーを確認しよう。船長が非常食の在庫確認を望んでいるかもしれない」と。忙しそうに見せて、余計な注目を避けるためだった。

乗組員のモハメッドは、ペピロ船長を取り巻く緊張した空気を察し、静かに乗組員エゼキエルに近づき、こう囁いた。「万が一、船長が急ぎの用事を頼んできた時のために、掃除用具を用意しておいたほうがいいと思う?」
imageimage

FS「マダム・ド・ポンパドゥール」シミュレーションのこのデモ用スナップショットでは、複雑かつダイナミックな社会的エコシステムが動き出す様子を観察できます。このシステムは、あらかじめ脚本化されたイベントを通じてではなく、独立したエージェント同士が相互作用することを可能にすることで、下層デッキにおける豊かで説得力のある生活の織り成す世界を生み出し、新たな物語を創出する能力を示しています。

シミュレーションは、明確な触媒によって幕を開けます。それは、高位の権威者であるペピロ船長が、直接的な命令を通じて即座に重大な緊張感をもたらすというものです。この「命令の連鎖」が、社会生態系全体の中心的な引力点となります。 彼の要求が、単に個々のキャラクターのスクリプトをトリガーするだけでなく、統一された高圧的なイベントを引き起こす点に注目してください。これは、階層構造に重点を置いたシステムの新たな特徴を示しており、単一のエージェントの行動が、共有環境内の他のすべてのキャラクターの焦点、雰囲気、そして戦略的目標を決定づけることができるのです。

船長の命令が乗組員の間で波及するにつれ、洗練された反応型の社会的戦略が浮き彫りになります。乗組員たちは単なる雑務を続けるのではなく、直ちに新たな現実を処理し始めます。テドリックやコンスタンティンといったキャラクターが、一時的な会話グループを形成して噂話を交わし、状況を分析し、新たな権力関係を理解しようと試みる様子に注目してください。 さらに印象的なのは、乗組員ウェストリーが、より高度な創発的論理を示し、積極的に生存戦略を練り上げている点だ。彼は、船長の怒りを避けるために、自分と別の乗組員が公式な任務に忙しく取り組んでいるように見せかけることを提案している。 これはあらかじめ脚本化された行動ではなく、認識された脅威に対してAIが導き出した論理的な社会的結論であり、リスク評価における堅牢な能力を実証している。

この短い一幕は、職業上の役割と個人的な不安をシームレスに融合させる、強力な「創発的ストーリーテリング」のエンジンを明らかにしている。乗組員ハロルドが、気取らない小声の会話から、船長の要求に対して形式的かつ専門的な意見を述べる姿勢へと切り替えざるを得なくなる様子は、相反する社会的文脈を管理するシステムの能力を如実に示している。 シミュレーション全体はフォンとの中心的な対立を軸に展開しており、個別の静かなドラマの寄せ集めではなく、統一された物語の「圧力鍋」のような緊張感を生み出しています。このエンジンは、単なる生活の断片を織りなす段階を超え、今や、社会的計算、戦略的同盟、そして強迫的な状況下での創発的な集団思考という複雑な網の目をシミュレートする力を示しています。

『FS マダム・ド・ポンパドゥール』は、モジュール性とパフォーマンスを追求するため、バックエンドのシミュレーションエンジンとフロントエンドのユーザーインターフェースを分離した、最新のデカップリングされたWebアーキテクチャに基づいて構築されています。

画像をアップロード中.png…

バックエンド:Python、Flask、Gemini

シミュレーションの中核とロジック全体は、Python製のバックエンドに実装されています。

  • Python: 強力なデータ処理能力と堅牢なAI/MLエコシステムを備えているため、自然な選択です。オブジェクト指向のアプローチにより、拡張しやすいモジュール化された Crewman および ActorManager クラスが実現されています。
  • Flask: フロントエンドと通信するためのAPIを構築するために使用される、軽量かつ柔軟なWebフレームワークです。その唯一の役割は、次のターンに関するリクエストを受け取り、シミュレーションロジックをトリガーし、結果を返すことです。
  • Google Gemini: 「機械の中の幽霊」とも呼ばれる存在です。このプロジェクトはGemini APIと統合され、インテリジェントなアクションシステムを駆動しています。 キャラクターが「知的に」行動することを決定すると、バックエンドは、船の状況、キャラクターの役割、および最近の行動履歴を含むプロンプトをGeminiモデルに送信し、Geminiモデルは文脈を認識した創造的なアクションを返します。

フロントエンド:React、Vite、およびTailwind CSS

ユーザーインターフェースは、高速でモダンなシングルページアプリケーション(SPA)です。

  • React: 動的でコンポーネントベースのユーザーインターフェースを構築するための強力なJavaScriptライブラリです。イベントログ全体がReactコンポーネントとなっており、バックエンドから新しいアクションが受信されるたびに効率的に更新されます。
  • Vite: 極めて高速な開発用サーバーと最適化された本番用ビルドを提供する、次世代のフロントエンドビルドツールです。
  • TypeScript: JavaScriptコードに静的型付けを追加するために使用され、開発者の体験を向上させ、バグを削減します。
  • Tailwind CSS: コンポーネントのクラス名に見られるように、HTML内で直接、迅速かつ一貫性のあるスタイリングを可能にする、ユーティリティファーストのCSSフレームワークです。

全体的なアーキテクチャ

1ターンごとの流れはシンプルかつ効果的です:

  1. ユーザーがReactベースのUIにある**「次へ」**ボタンをクリックします。
  2. フロントエンドは、Flask上で動作するバックエンドの /action エンドポイントに対して fetch リクエストを送信します。
  3. FlaskサーバーはPythonの ActorManager を呼び出し、これがシミュレーションの1ターンを実行します。この際、Gemini APIが呼び出される場合があります。
  4. バックエンドは、結果として得られたアクション文字列をJSONオブジェクトとして返します。
  5. ReactフロントエンドはJSONを受信し、状態を更新して画面上に新しいイベントをレンダリングすると同時に、自動的に最新のエントリまでスクロールします。