社会シミュレーター「CleanCore」を開発中|Claude Codeで学習する原始人を作る方法

ゲーム開発

政策や制度を上から与えるのではなく、人間が自分で学び、協力し、失敗しながら社会を作っていく。

そんな社会シミュレーターを作れないかと思い、現在 「CleanCore」 という実験用シミュレーターを開発しています。

最終的にやりたいのは、税制や福祉、教育、政治制度などを載せる前に、

「そもそも人間だけを置いたら、どこまで自力で社会を作れるのか」

を確認することです。

そのため、現在はまだ国家も通貨もありません。

いるのは約150人の人間と、食料のある自然環境だけ。

ところが、これが思った以上に過酷でした。

忍者Admax

最初のCleanCoreは「賢い草食動物」だった

初期バージョンでは、人間は食料を探し、腹が減れば食べ、疲れれば休みます。

しかし実際に動かしてみると、社会らしいものがほとんど生まれませんでした。

理由は単純です。

一人で食料を拾っているだけでも、それなりに生活できてしまったからです。

協力する必要もない。

誰かから教えてもらう必要もない。

危険を冒す必要もない。

結果として出来上がったのは、人類というより

「そこそこ頭の良い草食動物」

でした。

これでは社会シミュレーターになりません。

そこで、世界そのものを少し厳しくしました。

食べ物には当たり外れがある

現在のCleanCoreには、安全な食料だけではなく、扱いの難しい食料もあります。

木の実のように比較的安全なものもあれば、魚や小動物もいる。

一方で、毒の可能性があるキノコや、そのままでは危険だけれど加工すると利用できる食料もあります。

人間は最初から答えを知っているわけではありません。

「これは食べられるのか?」

「この場所では何が取れるのか?」

「加工したら安全になるのか?」

を、自分の経験や他人から聞いた話をもとに学習します。

重要なのは、シミュレーター内部の「正解」と、人間が信じていることを分けている点です。

実際には毒でも、その人物が安全だと思っていれば食べる可能性があります。

逆に安全な食料でも、過去の経験から危険だと思い込めば避けます。

ベテランは知っている。新人は何も知らない

さらに現在は、初期成人に2種類の弱い事前知識を与えています。

ひとつは Survivor Prior。

成人まで生きてきた人間なら、

「体が弱れば仕事の効率も落ちる」

「食料が減ってきたら何か変えた方がいい」

程度の経験は持っているだろう、という考え方です。

もうひとつは Legacy Prior。

過去の人間が経験した、

「この食べ物は危なかった」

「この食料は比較的長持ちした」

といった情報を、弱く不完全な知識として次の人間へ渡します。

ただし、正解を直接教えているわけではありません。

間違った情報が残る可能性もありますし、自分で経験すれば古い知識を上書きできます。

この仕組みを入れたところ、毒による死亡はかなり減りました。

特に事故の多かった食料では、3回の実験合計で事故が95件から40件程度まで減っています。

ちゃんと「先人の失敗」が役に立っています。

それでも人は餓死した

ところが別の問題が起きました。

毒では死ななくなったのに、今度は餓死する人が増えました。

そこで、

「人間の判断が悪いのではなく、そもそも世界に食料が足りないのでは?」

という疑問が出てきました。

そこでWorld側の供給量を監査しました。

結果は少し意外でした。

年間平均では、1日あたり約302の食料が供給されます。

150人を養うには十分です。

しかし季節によって大きな差がありました。

夏や秋には大量の食料があります。

一方で冬後半になると、安全に利用できる食料は1日あたり約108〜130程度まで落ちます。

150人をそのまま維持するには足りません。

つまりこの世界は、

年間では豊かだけれど、冬を越すには備蓄が必要

だったのです。

しかも最初は春スタートだった

ここで、かなり大きな設計ミスに気付きました。

CleanCoreの人類は、これまで春からスタートしていました。

しかも前年の秋を経験していません。

当然、備蓄もありません。

人間関係もありません。

どこに何があるかも十分に知りません。

そんな150人を、いきなり食料の少ない季節に放り込んでいました。

かなり無茶です。

監査用に、食料の場所や安全性を全部知っている「Oracle」を作って試したところ、それでも最初の春だけで約44人が死亡しました。

つまり、ある程度は人間の判断以前の問題でした。

夏から始めたらどうなるのか

そこで次の実験では、開始季節を夏に変えます。

食料が豊富な夏に150人を放流し、

夏に食べる。

世界を覚える。

他人と関係を作る。

秋を経験する。

そして初めて冬を迎える。

という流れにします。

ここで見たいのは、単純に生存者が増えるかどうかではありません。

人間が自分で冬への備えを始めるか

です。

夏と秋には大量の食料が余っています。

しかし現在の人間は、その多くを採らずに放置しています。

冬になってから食料がないと騒いでも遅い。

まさに「アリとキリギリス」です。

しかもCleanCoreには繁殖もあります。

夏に食料が豊富だからと子供を増やしすぎると、冬には扶養する人数が増えます。

逆に、食料を残す個体は冬を越しやすいかもしれません。

短期的には慎重な家族が有利でも、長期的には子供の多い家系が増える可能性もあります。

このあたりは、数字を調整して答えを作るのではなく、実際に30年ほど動かして確認したいところです。

最終目標は「放っておいても社会が続く」

CleanCoreの当面の目標は、1000年文明を作ることではありません。

まずは30年間。

人間が、

経験する。

失敗する。

学ぶ。

他人に教える。

子供を育てる。

世代交代する。

冬に備える。

必要なら助け合う。

そうした行動を繰り返しながら、社会が自力で存続できる状態を目指します。

最初の世代が持っていた知識が、次の世代へ残るのか。

重要な人物が死んだら、知識も失われるのか。

毎年同じ冬に同じ失敗をするのか。

それとも何年かすると「冬の前には食料を残す」という文化が生まれるのか。

ここまで来ると、人口の数字そのものよりも、

「なぜその社会が生き残ったのか」

を見る方が面白くなってきました。

まだCleanCoreは開発途中です。

現時点では、人類はそれほど賢くありません。

放っておくと毒を食べます。

冬への備蓄も苦手です。

子供も作ります。

そして食料がなくなります。

ただ、その失敗から学習できるところまでは少しずつ出来てきました。

次は150人を夏からスタートさせます。

最初の冬をどう迎えるのか。

ようやく「文明ができる前」のシミュレーションが始まりそうです。

プロンプト例

まずはこんなプロンプトから始める

以下は、CleanCoreそのものではありませんが、同じ考え方の社会シミュレーターをゼロから作るための簡易プロンプトです。

Node.jsで、学習型の簡易社会シミュレーターを作ってください。

目的は、150人の人間を自然環境へ配置し、
食料を集め、学習し、他人から情報を得ながら
長期間生存できるかを見ることです。

最初から社会制度や国家は作りません。

人間自身の行動から、
協力、知識共有、備蓄などが必要になる構造を作ってください。

【基本ルール】

1日を1tickとします。

初期人口は150人です。

各Personは最低限、

  • health
  • fatigue
  • hunger
  • intelligence
  • activity
  • power

を持ちます。

ただし能力値から直接「正解の行動」を決めないでください。

【WorldとPersonの知識を分離】

Worldは食料について真実を持ちます。

例えば、

  • 栄養量
  • 毒性
  • 季節ごとの出現量
  • 保存性

です。

PersonはWorld Truthを直接読むことは禁止します。

Person側にはBeliefを持たせてください。

例:

foodId
safeProbability
nutritionEstimate
availabilityEstimate
confidence

Personは、

  • 自分で食べた
  • 他人が食べるのを見た
  • 他人から聞いた

などのEvidenceからBeliefを更新します。

【Evidence】

Evidenceには最低限、

  • eventId
  • foodId
  • source type
  • observer
  • outcome
  • timestamp

を持たせます。

source typeは最低限、

DIRECT
OBSERVED
HEARSAY

を区別してください。

同じ出来事を何人から聞いても、
無限に証拠が増幅しないようにしてください。

【食料】

最低限、次のような食料を作ってください。

  • 木の実:比較的安全
  • 魚:普通
  • 小動物:取得が不確実
  • 大型動物:複数人なら効率が上がる
  • 毒キノコ:危険
  • 根菜:安全だが取得に時間がかかる
  • 豆:保存しやすい
  • 原始的なトウモロコシ:保存しやすい

季節によって供給量を変えてください。

夏と秋には余裕がありますが、
冬と早春には150人全員がその日暮らしだけでは
生きられない程度に供給を落としてください。

ただし年間総量では150人を十分養えるようにしてください。

つまり、

「夏秋の余剰を冬へ持ち越せば生きられる」

Worldにします。

【行動】

Personは状況に応じて、

  • 食料を集める
  • 食べる
  • 休む
  • 移動する
  • 未知の食料を試す
  • 他人へ助けを求める
  • 他人を助ける
  • 協力する

などを選択できるようにしてください。

最初から最適解を与えないでください。

Personは自分のBeliefを使って、
行動結果を予測して選択します。

【学習】

Personは予測と実際の結果を比較して学習します。

例えば、

「この場所なら2食分取れると思ったが0.5しか取れなかった」

という経験から、
次回の予測を修正します。

Worldの真値を直接Personへ渡して学習させるのは禁止です。

【初期成人】

成人まで生きてきた人物が完全な無知というのも不自然なので、
弱い事前知識を与えてください。

ただし、

「体が弱ると仕事の効率も落ちる」

程度の自己保存知識に限定してください。

どのFoodが毒かなど、
World固有の正解は与えないでください。

【開始季節】

開始季節は夏にしてください。

夏
→ 秋
→ 冬
→ 春

を経験させます。

初期備蓄は与えません。

夏と秋の豊かな時期を経験したPersonが、
冬に向けて何らかの準備をするか確認します。

【保存則】

必ず監査してください。

  • 1日は24時間を超えない
  • 食料が無から増えない
  • 同じ食料を複数人が同時取得しない
  • 所有者を記録する
  • 死亡Personは行動しない
  • NaNや負値を残さない

【ログ】

毎年、

  • 人口
  • 死亡数
  • 餓死
  • 中毒死
  • 平均health
  • 食料取得量
  • 保存食料量
  • 未取得食料量

を出してください。

さらに最初の冬について、

夏秋に生成されたFood
→ 採集
→ 消費
→ 保存
→ decay
→ 冬に消費

がどの程度だったか分析してください。

【重要】

人口を一定値へ誘導するための補正は禁止します。

餓死が多くても、
最初からFoodを増やしたり、
Personを賢くしたりしないでください。

まず原因を分析してください。

Worldが悪いのか、
Personが学んでいないのか、
備蓄していないのか、
分配できていないのかを分けて報告してください。

【開発手順】

いきなり全機能を書かず、

  1. World
  2. Person
  3. Food
  4. Belief / Evidence
  5. Decision
  6. Simulation
  7. Audit
  8. Tests

の順に実装してください。

各段階でテストを作ってください。

最後に150人×2年間をseed固定で3回実行し、
結果と問題点を報告してください。

実装後に人口調整は行わず、
結果を見たところで停止してください。

上のプロンプトは自由に改変して試してください。要件を変更すれば成果物も忠実に変わります。

このプロンプトだけで完成するわけではない

ここは重要です。

このプロンプトをClaude Codeへ渡せば、それっぽいシミュレーターは作れます。

しかし、それでCleanCoreが完成するわけではありません。

実際の開発では、

「人間が食料の真値を知ってしまっている」

「弱っているのに、明日も元気な時と同じ量を採れると思っている」

「毒で死ななくなったら今度は餓死した」

「年間の食料は十分なのに冬だけ足りない」

など、実際に走らせないと分からない問題が大量に出ました。

ここがAI開発の面白いところでもあります。

AIに、

社会シミュレーターを作って

と頼むだけなら簡単です。

難しいのは、

出てきた結果を見て、「これは本当に人間の行動なのか」「どこかにインチキが入っていないか」を判断すること

です。

AIには「成功させろ」ではなく「監査しろ」と頼む

個人的に重要だったのは、この使い方です。

人口が減ったとき、

人口を安定させてください

とは頼みません。

代わりに、

なぜ死んでいるのか調査してください。
Worldの食料不足なのか、
Personの判断なのか、
Knowledge不足なのか、
分配の問題なのかを分離してください。
原因が分かるまで係数を変更しないでください。

と頼みます。

この差はかなり大きいです。

「成功させて」と言えば、AIは成功するように数字を調整できます。

しかし、それではシミュレーションではなく、

欲しい結果を出す装置

になってしまいます。

CleanCoreでは、なるべく失敗もそのまま残しています。

人類が餓死したなら、まず餓死させます。

そして死体の山を見ながら原因を調べます。

今回も調査した結果、

「春スタートなのに前年の備蓄がない」

という、かなり根本的な問題が見つかりました。

そのため次は夏から人類をスタートさせます。

CleanCoreは、学習するNPCや社会シミュレーションの基礎として使えそうではあります。
ゲームの仲間AI、経営シミュレーション、社会制度の実験など、応用先はいろいろ考えられます。

ただ、現時点ではまだ「人間っぽい何かを30年間生かせるか」を試している段階です。

そして正直なところ、これが完成したとして何に使えるのかは、まだよく分かっていません。

なお、何に使えるのかは謎です。

とりあえず次は、150人の原始人を夏から放流して、最初の冬を越せるか確認します。

なお、現在の原始人には「余った食料を冬まで残す知恵」も、「余っている人から足りない人へ配る制度」もありません。
年間では食料が足りているのに、普通に餓死します。
文明とは何だったのかを、原始人に教えられています。

コメント

タイトルとURLをコピーしました