|
| 1 | +--- |
| 2 | +tags: [AI, 实验, 愿景] |
| 3 | +--- |
| 4 | + |
| 5 | +# LLM 驱动的人工生命 |
| 6 | + |
| 7 | +**日期**:2026年3月31日 |
| 8 | +**来源**:Ember 改造讨论 → 三管子架构 → ALife 项目调研 → 代码进化 vs 数值进化的本质区别 |
| 9 | +**状态**:构想阶段,未实现 |
| 10 | + |
| 11 | +## 一、核心想法 |
| 12 | + |
| 13 | +将 Ember(实时 AI 心跳可视化装置)改造为一个 **LLM 驱动的人工生命生态系统**。不是传统 ALife 的数值进化,而是用 LLM 进化可读的行为代码。每个生物的"基因"是一段人能读懂的代码。 |
| 14 | + |
| 15 | +**目标体验**:让观众亲眼看到进化算法的魅力——一群生物在屏幕上竞争、繁殖、死亡,点击任何一个就能透视它的"DNA"(一段可读的代码)。 |
| 16 | + |
| 17 | +## 二、为什么是新东西 |
| 18 | + |
| 19 | +| | 传统 ALife(Bibites/biosim4) | 纯 LLM 项目(AI-Scientist) | **本项目** | |
| 20 | +|---|---|---|---| |
| 21 | +| 基因表示 | 浮点数组 | 论文/代码 | **可读的行为代码** | |
| 22 | +| 变异方式 | 随机数值扰动 | LLM 改写 | **LLM 改写** | |
| 23 | +| 可视化 | 有 | 无 | **有** | |
| 24 | +| 可透视基因 | 无(数字看不懂) | 可读但无视觉 | **点击看代码** | |
| 25 | +| 进化速度 | 慢(盲搜) | 快 | **快** | |
| 26 | +| 涌现复杂结构 | 有限(API太高级) | 不适用 | **未验证** | |
| 27 | + |
| 28 | +**交叉点**:LLM 的代码理解能力 + ALife 的可视化生态 + 低原语设计。据调研,这个组合没有现有项目。 |
| 29 | + |
| 30 | +## 三、现有 ALife 项目调研 |
| 31 | + |
| 32 | +| 项目 | 形态进化 | 浏览器 | 最终成果 | |
| 33 | +|------|---------|--------|---------| |
| 34 | +| The Life Engine | 细胞级 | 是 | 简单聚团、运动,早期 | |
| 35 | +| Lenia | 涌现形态 | 是 | 数百种数学生命,视觉极美 | |
| 36 | +| Karl Sims (1994) | 方块身体 | 否 | 走/游/打架,经典但原始 | |
| 37 | +| biosim4 | 行为only | 否 | 聚到角落,YouTube 火爆 | |
| 38 | +| The Bibites | 行为only | 否 | 觅食/捕猎分化,社区活跃 | |
| 39 | +| Framsticks | 棒状身体 | 否 | 各种步态,学术标杆 | |
| 40 | +| ASAL (Sakana AI) | VLM搜索 | 否 | 发现新 Lenia/Boids 形态 | |
| 41 | + |
| 42 | +**共同局限**:没有任何一个进化出"眼睛"级别的复杂结构。原因之一是 API 太高级(sense/move/reproduce 是原语),取消了进化的空间。 |
| 43 | + |
| 44 | +## 四、关键设计原则 |
| 45 | + |
| 46 | +### 1. 限制即引擎 |
| 47 | + |
| 48 | +不给高级 API。只给最低级的网格读写权限,逼进化自己发明感知、运动、繁殖。 |
| 49 | + |
| 50 | +``` |
| 51 | +每个细胞拥有的全部能力: |
| 52 | +- 输入:周围 N 格的原始数值 |
| 53 | +- 输出:写入自己和相邻格的数值 |
| 54 | +- 约束:写入消耗能量,能量归零即死 |
| 55 | +``` |
| 56 | + |
| 57 | +没有 sense(),没有 move(),没有 reproduce()。这些都从读写操作中涌现。 |
| 58 | + |
| 59 | +### 2. 代码即基因 |
| 60 | + |
| 61 | +每个细胞运行一段极简 JS 函数: |
| 62 | + |
| 63 | +```js |
| 64 | +// 进化前(第 1 代) |
| 65 | +function cell(nearby, energy, mem) { |
| 66 | + return { write: [{dx:1, dy:0, val: energy}], mem } |
| 67 | +} |
| 68 | + |
| 69 | +// 进化后(第 N 代)——LLM 变异产物 |
| 70 | +function cell(nearby, energy, mem) { |
| 71 | + let foodDir = nearby.find(n => n.val > 0.8) |
| 72 | + if (foodDir && energy > 0.5) { |
| 73 | + // 朝食物方向写入自身代码副本 = "移动" |
| 74 | + return { write: [{...foodDir, val: energy-0.1, code: SELF}], mem } |
| 75 | + } |
| 76 | + if (energy > 2.0) { |
| 77 | + // 向空位写入自身代码 = "繁殖" |
| 78 | + let empty = nearby.find(n => n.val === 0) |
| 79 | + if (empty) return { write: [{...empty, code: SELF}], mem: {...mem, children: (mem.children||0)+1} } |
| 80 | + } |
| 81 | + return { write: [], mem } |
| 82 | +} |
| 83 | +``` |
| 84 | + |
| 85 | +### 3. 外观也是基因 |
| 86 | + |
| 87 | +可选:每个生物的基因包含行为代码(JS)+ 渲染代码(GLSL)。外观有选择压力时(其他生物能"看到"颜色),视觉进化自然发生——保护色、警告色、性选择。 |
| 88 | + |
| 89 | +### 4. 生态而非单体 |
| 90 | + |
| 91 | +不是进化一个最优解,而是多个策略共存竞争。会产生军备竞赛: |
| 92 | +- 出现"抢食者" → 被迫进化"躲避者" |
| 93 | +- 出现"躲避者" → 被迫进化"追踪者" |
| 94 | +- 永远不收敛,因为对手也在变 |
| 95 | + |
| 96 | +## 五、Ember 现有架构的复用 |
| 97 | + |
| 98 | +| Ember 组件 | 原用途 | 改造后 | |
| 99 | +|-----------|--------|--------| |
| 100 | +| 心跳循环(tick) | LLM 感知循环 | 进化世代循环 | |
| 101 | +| soul 压缩 | 记忆叙事 | 知识提炼(图书馆) | |
| 102 | +| 溶解检测 | 心智衰退监测 | 种群多样性/收敛监控 | |
| 103 | +| 内在驱动(5向量) | 情感状态 | 搜索策略参数 | |
| 104 | +| 转世机制 | 死亡重生 | 岛模型重启 | |
| 105 | +| 墓地/archive | 亡灵展示 | 进化历史展示 | |
| 106 | +| WebGL 火焰 | 视觉艺术 | 生态可视化 | |
| 107 | +| WebSocket 广播 | 访客交互 | 观众实时观察 | |
| 108 | +| BucketQueue | 消息批处理 | 变异请求队列 | |
| 109 | + |
| 110 | +## 六、LLM 变异 vs 传统变异 |
| 111 | + |
| 112 | +为什么 LLM 变异能打破传统 ALife 的天花板: |
| 113 | + |
| 114 | +``` |
| 115 | +传统 GA 变异:[0.32, -0.71, 0.05] → [0.35, -0.71, 0.02] |
| 116 | + = 盲目扰动,不理解含义 |
| 117 | +
|
| 118 | +LLM 变异: |
| 119 | + 输入:"这个生物总是饿死,它的代码里没有寻找食物的逻辑" |
| 120 | + 输出:添加 foodDir 感知 + 朝食物方向移动的代码 |
| 121 | + = 有意识的、基于理解的改进 |
| 122 | +``` |
| 123 | + |
| 124 | +代价:每次变异需要一次 API 调用。但进化效率提升可能是几个数量级——100 代达到传统 10 万代的效果。 |
| 125 | + |
| 126 | +## 七、LLM 的语言选择 |
| 127 | + |
| 128 | +| 语言 | LLM 训练数据 | 底层程度 | 适合度 | |
| 129 | +|------|------------|---------|-------| |
| 130 | +| Python/JS(完整) | 极多 | 太高 | ❌ | |
| 131 | +| GLSL | 多 | 逐cell并行 | ✅ 渲染层 | |
| 132 | +| **极简 JS 函数** | 极多 | 可控 | ✅ 行为层 | |
| 133 | +| 自定义 DSL | 零 | 随意 | ❌ LLM 不认识 | |
| 134 | + |
| 135 | +原则:**选 LLM 最熟悉的、最底层的语言**。LLM 的搜索空间 = 训练数据。选不熟悉的语言等于让 LLM 盲搜。 |
| 136 | + |
| 137 | +## 八、开放问题 |
| 138 | + |
| 139 | +1. **LLM 变异的成本控制** — 100 个生物 × 每代变异 = 大量 API 调用,如何控制? |
| 140 | + - 可能方案:只对 top-K 个体做 LLM 变异,其余用传统交叉/突变 |
| 141 | +2. **安全沙箱** — 用户浏览器里执行进化出的任意 JS 代码,如何隔离? |
| 142 | +3. **代码膨胀** — LLM 倾向写更长的代码,几百代后基因会膨胀到不可读 |
| 143 | +4. **涌现天花板** — LLM 进化能否真的超越传统 ALife?需要实验验证 |
| 144 | +5. **观众交互设计** — 如何让非技术观众也能理解"这段代码是眼睛" |
| 145 | +6. **fitness 定义** — 纯生存?还是加入观众评分(交互式进化)? |
| 146 | + |
| 147 | +## 九、最小验证实验 |
| 148 | + |
| 149 | +如果要做,最小可行版本: |
| 150 | + |
| 151 | +``` |
| 152 | +- 64×64 网格 |
| 153 | +- 每个格子:空 或 一段 10 行以内的 JS 函数 |
| 154 | +- 物理:能量守恒 + 相邻读写 |
| 155 | +- 变异:每代选 top-10 个体,LLM 变异 |
| 156 | +- 渲染:Canvas 2D(不需要 WebGL) |
| 157 | +- 指标:存活代数、种群多样性、代码复杂度 |
| 158 | +``` |
| 159 | + |
| 160 | +预计能在 1-2 天内验证"LLM 能否在低原语环境下进化出有意义的行为"。 |
| 161 | + |
| 162 | +## 关联概念 |
| 163 | + |
| 164 | +- [[限制即引擎]] — 本项目的核心设计原则 |
| 165 | +- [[三管子架构]] — 反馈环+记忆+自指涉的框架 |
| 166 | +- [[代码自然生长]] — 代码进化的宏观愿景,本项目是具体实例 |
| 167 | +- [[万物皆反馈环]] — 生态中的多重反馈环 |
| 168 | +- [[知识即结构]] — 每个生物的代码结构就是进化积累的知识 |
| 169 | +- [[元进化]] — 变异率本身可进化 = 自指涉管子 |
| 170 | +- [[适应度幻觉]] — 环境设计错误时进化方向错误 |
0 commit comments