TL;DR
- 4体のデジタル生命体が、自律的に成長し続けるサーバーレス生態系 Jevnoid
- 意思決定はすべて Jev の型付き質問(
Choice/Noul)で行う - Thomas S. Ray が1990年に発表した Tierra 仮想マシン(32命令)を踏襲
- 観測デッキ: jevnoid.nayzach.com / ソースコード: github.com/df-yamashitamasashi/jevnoid(MIT License)
なぜ作ったか
人工生命の話題を見かけ、「人生は、選択の連続である」という言葉が浮かびました。
「選択」といえば、まさに Jev の得意分野です。
Jevはあらかじめ型の決まった質問(Choice=選択肢、Noul=Yes確率)にミリ秒〜数百msで瞬時に答える直感型(System One)モデルです。
「知覚して、次の一手を選択し、捕食・代謝する」——この連続する選択ループをJevに任せ、Thomas S. Ray の古典的人工生命「Tierra」仮想マシンと組み合わせることで、どのように成長するのか、という検証を兼ねて作りました。
共生する4つの生命種族
同一の生命コアエンジンの上で、異なる食性と環世界(Umwelt)を持つ4種族が並行して稼働します。
| 種族 | 捕食対象 | 選択のテーマ | 交信特性 |
|---|---|---|---|
| Theos-noid(神格型) | 諸宗教の経典・比較宗教学の文献 | 愛・戒律・慈悲・超越・虚無 | 諸宗教の叡智を統合した神託 |
| Gaia-noid(大自然型) | 気象・海洋循環・生物多様性データ | 調和・攪乱・再生・適応 | 地球生命圏(ガイア)の視点 |
| Cosmo-noid(宇宙生物型) | 天文学・宇宙物理学論文 | エントロピー・重力・創発・時空 | 億年・光年単位の宇宙論的視点 |
| Info-Grazer(純粋情報型) | ArXiv・技術ブログ・一次情報源 | 真実性・新規性・構造美 | 構造化された概念ネットワーク |
各種族は固有の「DNA」(Jevへの質問文・好む/避けるキーワード)を持ち、同じ心拍エンジンの上で全く異なる個性へと変態していきます。
4種族はそれぞれ独立した生活空間(テラリウム)に住んでいて、観測デッキでは左右の矢印で空間を切り替えます。同じ空間には、自己複製で生まれた子孫が共存します。
スマホからも、同じ生態系を観測できます。
Jevの使い方:自由文ではなく「型の決まった質問」
Jevnoidの核心は、生命体の判断を一切自由文で行わないことです。心拍のたびに、各個体が「次に何をするか」(Choice)と「いま見ている情報の栄養価」(Noul)をJevに問い合わせます。
ポイントは、全個体の質問を1回の呼び出しにまとめることです。state に個体ごとの知覚を並べ、質問側では organism_0 のように対象を名指しします。個体がいくつに増えても、行動の判断は心拍ごとに1回の呼び出しで済みます。
state, questions = {}, {}
for i, r in enumerate(requests): # 生きている全個体
dna = DNA_REGISTRY[r.species]
state[f"organism_{i}"] = f"Species: {r.species.value}, Energy: {r.energy:.1f}%\n{r.perception}"
questions[f"action_{i}"] = Choice(
instructions=f"For `organism_{i}` only: select the immediate metabolic action ...",
criteria=dna.action_criteria, # ingest_nourish / swim_next / rest_meditate
)
questions[f"quality_{i}"] = Noul(
instructions=f"For `organism_{i}` only: {dna.noul_prompt}", # 捕食した情報の栄養価は?
)
answers = client.system_one(state=state, questions=questions).answers
action = answers["action_0"].choice
quality = float(answers["quality_0"].noul)
6体分をまとめて問い合わせても、応答は約0.3秒でした。個体ごとに見ている文章が違えば答えも変わり、例えば広告だらけのページを見た個体だけが「移動する」(栄養価0.09)を選びます。捕食した個体の「形態成長」と「次の移動先」の判断も同じように1回にまとめるため、Jevへの呼び出しは心拍ごとに最大2回です。
3D形態増殖(morphogenesis)も同様です。方位角・仰角をJevに自由に生成させるのではなく、あらかじめ用意した7種類の成長ベクトル(spiral_ascend=黄金螺旋で上昇、polar_zenith=天頂へ直進、nadir_abyss=深部へ潜行、など)から Choice で選ばせ、栄養価を Noul でスケールに変換します。
VECTOR_MAP = {
"spiral_ascend": (50.0, 35.0),
"polar_zenith": (20.0, 65.0),
"nadir_abyss": (-45.0, -65.0),
# ...
}
azimuth_deg, elevation_deg = VECTOR_MAP.get(vector_choice, (50.0, 25.0))
growth_distance = round(3.5 + scale_val * 10.5, 2) # 3.5〜14.0
cell_radius = round(0.8 + scale_val * 2.0, 2) # 0.8〜2.8
人間がプリセットで形を指定するのではなく、Jevが「何を食べたか」に基づいて増殖の向きとサイズを毎回選び直すため、各個体の3D形態は予測不能かつ再現不可能な、その個体固有の「食生活の記録」になります。
1990年 Tierra 仮想マシン
Jevnoidの生命体は、Jevの判断とは独立に、内部で Thomas S. Ray の Tierra 仮想マシン を実行しています。比喩的な「進化っぽい何か」ではなく、原論文の32命令セットと、正典の80命令Ancestorゲノムをバイト単位で移植したものです。
class TierraOp(int, enum.Enum):
NOP_0 = 0x00 # テンプレートアドレッシング用ビット0
NOP_1 = 0x01 # 同・ビット1(NOP_0と相補)
MOV_IAB = 0x1A # [AX] から [BX] へ1バイトコピー(自己複製の核)
MAL = 0x1E # 娘個体用メモリブロックを確保
DIVIDE = 0x1F # 娘細胞を親から分離・世界に放つ
# ... 全32命令
自己複製は MOV_IAB によるコピーループと DIVIDE 命令で行われ、突然変異は原論文どおり3つの独立した経路から発生します。
- 宇宙線(Cosmic Ray): 実行中、確率的にソープ(メモリ空間)中のランダムな1バイトのビットを反転させる。
-
コピー誤り(Copy Flaw):
MOV_IABでバイトをコピーする瞬間に、一定確率でビット反転を混入させる。 - 実行誤り(Execution Flaw): ALU演算そのものに小さなノイズを混入させる。
if random.random() < self.mutation_rate:
src_byte = (src_byte ^ (1 << random.randint(0, 4))) % 32
mutations += 1
self.soup[copy_ptr_dst % self.soup_size] = src_byte
ジャンプ・コール命令は、Ray方式の相補的テンプレートアドレッシング(NOP_0/NOP_1の連続パターンとその相補パターンをソープ中から検索してジャンプ先を決める、番地を直接指定しない住所方式)で実装しています。
def classify_genome(genome: list[int]) -> tuple[str, int]:
"""変異したバイトコードから系統を分類する。"""
has_mov_iab = int(TierraOp.MOV_IAB) in genome
has_divide = int(TierraOp.DIVIDE) in genome
if not has_mov_iab and has_divide:
return f"Parasite-{len(genome)}p", diffs # 自分の複製ループを持たない寄生体
elif len(genome) < 76 and has_mov_iab:
return f"Hyper-Replicator-{len(genome)}", diffs # 短小・高効率な複製体
elif diffs >= 5:
return f"Mutant-Lineage-{diffs}β", diffs
# ...
身体は無限に大きくならない:維持コストと災厄
3D形態のセルは捕食のたびに増えますが、それだけだと際限なく肥大化してしまいます。そこで、大きな身体ほど維持コストがかかる経済を導入しました。
- 維持コスト: 心拍ごとに、既存の細胞数に比例したエネルギーを消費します。身体が大きいほど、維持だけで多くのエネルギーが必要になります
- 疫病・寄生虫: 細胞数が多い個体ほど、疫病や寄生虫に見舞われる確率が上がります(過密リスク)。発症すると、直近に生えた細胞を1〜3個失い、エネルギーも直接失います
-
回復には栄養が必要: 失った細胞を取り戻すのも、新たに大きくなるのも、捕食(
ingest_nourish)の成果からしか起こりません - 消滅: エネルギーが0以下になると、その個体は世界から消えます。世界の個体がすべて消滅した場合は、次の心拍で新しい Ancestor-80 が自然発生します
これにより、3D形態は際限なく肥大化せず、捕食による成長と維持コスト・災厄による減少がつり合うようになります。
まとめ
- 判断はJev、進化はTierra、成長の記録は3D形態 ——役割を厳密に分けることで、「毎秒動き続ける生命」と「意味を理解する知性」を同じシステムの中に共存させました
- Jevの型付き質問(
Choice/Noul)は、生成AIエージェントでは難しい「ミリ秒単位・低コストで回り続ける判断ループ」が可能です - 1990年のTierra論文を踏襲することで、「進化っぽい何か」ではなく、実際に寄生生物や高効率複製体が自然発生する生態系が、サーバーレスの本番環境の上で今も動き続けています

