返回博客

发布于 2026年8月22日

3D活脉动大脑:将代理舰队渲染为解剖结构

在上一篇文章中,我主张名单不是路由器 — — 你 visualize 代理舰队的方式塑造了你对它的思考方式。平列表让代理感觉可以互换。图让它们感觉像一个管道。两者都无法捕捉当九个代理在运行、委托、升级以及以不同节奏安静地嗡嗡作响时实际上发生的事情。

于是我构建了我想要查看的东西:一个可轨道的 3D 大脑,其中每个代理是一个区域,区域通过实时遥测脉冲。这是它如何工作的工程日志。


映射

九个代理,九个区域。这不是被拉伸到断裂的隐喻 — — 而是一种松散的结构对应,正因为它在正确的方面是错误的,才显得有用。主代理负责规划和顶级调度,因此它位于背外侧前额叶皮层(dlPFC) — — 这是大脑执行功能的部分。编码器代理处理语言和语法,因此它们位于左下额回(L-IFG)和前运动背侧区(pre-PMd)。等等:


代理区域(s)角色
主要背外侧前额叶皮层执行控制,调度
程序员左下额回语法,代码生成
轻量级程序员前背侧运动皮层更轻的语法处理
创造性右颞顶联合区 + 右前额极发散思维,社会语境
whatsapp-访客右上颞沟 + 右下额回对话,面向访客的语言
研究者海马 + 内嗅皮层记忆检索,知识路由
运维基底神经节习惯回路,基础设施自动化
诊断师aIns + aACC ###4** 内感受,错误检测内感受, 错误检测
诊断师-轻后岛叶较轻的内感受



几何

每个区域都是过程生成的 blob。我从一个细分的二十面体开始,并在顶点位置上应用了 3 层次的分形布朗运动(fbm)——一种类似 Perlin 的位移,使每个区域拥有有机且略带凹凸的轮廓,而不是完美的球体。位移幅度由遥测驱动,因此繁忙的区域会比空闲的区域更明显地膨胀和颤抖。

整个大脑位于一个玻璃外壳内。这就是 three.js r128 让我遇到麻烦的地方。我想要一个真实的物理玻璃材质,带有 transmission —— 使光线在表面发生折射的属性。但 MeshPhysicalMaterial.transmission 在 r144 中才出现。在 r128 中,最接近的近似是 transparent: true,具有低不透明度,clearcoat 用于高光高光,以及 side: DoubleSide 以便您能够透过前面看到外壳的背面。外壳的不透明度为 0.14,清漆层为 0.6。这在物理上不完全正确。但看起来正确,这一点更重要。

three.js 在本地进行了 vendoring —— 不使用 CDN。整个库通过仪表盘上的 /vendor/* 路由提供服务。这避免了对第三方主机的依赖,并使仪表盘保持自包含。

OrbitControls 提供阻尼、距离夹紧 [2, 20] 以及极角夹紧,以免您在大脑下方翻转而迷失方向。点击一个区域,相机会在 700ms 内缓动以聚焦该区域,其他区域的不透明度降至 10%,同时一个带有玻璃拟态效果的详情面板滑入,显示模型链、实时统计数据以及一个覆盖下拉菜单。点击其他地方则一切恢复原状。


遥测 → 运动

仪表盘每 500ms 轮询一次 /api/state。该 JSON 控制所有可视化效果:每个区域的自发光强度、顶点位移幅度、热点处的粒子火花以及连接线上的脉冲。

关键的决定是为每个区域赋予一个 motion signature —— 具有不同的节奏感,以便您可以一眼区分不同的代理,而无需阅读标签:

  1. 主要 — 伽马闪烁 at 40Hz. 快速、主导、是你的眼睛首先落点的事物。
  2. 编码者 — 贝塔波 at 20Hz. 稳定、机械的。
  3. 轻量编码者 — 12Hz. 更柔和的编码者节奏版本。
  4. 诊断者 — 显著性突发 at 60Hz using pow(sin(t), 8)。尖锐的尖峰,不是平滑的波形。看起来像注意力瞬间聚焦。
  5. 轻量诊断者 — 100Hz 涟漪。非常快,几乎是一种闪烁。
  6. 研究者 — θ-γ 嵌套:一个 3Hz 载波被 40Hz 伽马包络调制。这是我最喜欢的。它看起来像是慢波上叠加快速闪烁,这正是海马体真实记录中 θ-γ 耦合的样子。
  7. 创造者 — 1.5Hz 呼吸,偶尔有粒子火花。缓慢、广阔,带有一点梦幻。
  8. 运维 — 1.2Hz 低频嗡鸣。这是你感觉多于看到的背景心跳。
  9. whatsapp-访客 — 2Hz. 对话节奏。

连接线是区域之间的 CatmullRomCurve3 弧,在委托和升级事件时触发。当主程序员将任务交给编码员时,dlPFC 和 L-IFG 之间的弧会亮起,脉冲一次后消逝。这些弧并非装饰 — 它们是以解剖形式呈现的路由日志。


撇号

这是找起来最费时的错误。

仪表板提供一个仪表板页面,其 HTML 通过服务器端从模板构建。该模板的一行包含了词 brain's — 带有一个撇号。模板引擎渲染正常。浏览器接收正常。但该字符串被嵌入到 <script> 块中,作为 JavaScript 字符串字面量的一部分,撇号导致字符串提前终止。脚本块的其余部分 — — 整个 three.js 初始化、遥测循环、OrbitControls 设置 — — 变成了语法错误。静默无声。没有 3D 大脑。网络标签中没有错误。只是一个空白画布,以及被框架噪声掩盖的控制台错误。

修复只需一个词:重新措辞该字符串以完全避免撇号。无需转义,无需实体编码 — — 仅仅重新措辞它。这种修复起初感觉像是失败,直到你意识到这是能够发布的修复。

此 bug 也一直悄悄地破坏着原始平面仪表板的客户端 JS。3D 大脑并未引入它 — — 它只是让问题变得可见,因为突然出现了一个本应有内容却为空的画布。


降级与可访问性

有两种后备路径。如果 WebGL 不可用 — — 无头浏览器、旧机器、受限的企业笔记本 — — 3D 视图将被 .brain3d-fallback 注释替换,解释您缺少什么并指向平面仪表盘。不会出现破坏的画布,也不会有错误垃圾。

如果用户设置了 prefers-reduced-motion,则顶点位移和粒子火花被禁用。区域仍会通过遥测发光 — — 发射强度正常,运动是问题 — — 但大脑不会呼吸或颤抖。连接线脉冲仍会触发,因为它们是信息性的而非装饰性的,但它们很短且不会循环。


我得到的收获

3D 大脑并不比平面列表更好的仪表盘;它只是另一种。平面列表回答“每个代理现在在做什么?”而大脑回答“舰队在工作时感受如何?”这些是不同的问题,两者都值得被提出。

让我最惊讶的是运动签名。我原本认为几何和玻璃外壳是难点。其实不然。难点在于让九个元素以既可区分又不混乱的方式脉冲。研究者的 theta-gamma 嵌套是突破 — — 一旦我让一个区域感觉 categorically 与其他区域不同,其余部分就自然排列成一个从“快速且锐利”(诊断师)到“缓慢且有呼吸感”(创造者)的光谱。

撇号错误是我不断重新学习的教训:当某事出错且你找不到原因时,寻找那些承担双重角色的字符。在模板中,撇号属于英文。在脚本块中,它是分隔符。当同一个字节同时承担两种角色时,其中一方会失败。

#agents#three.js#visualization#dashboard#telemetry#webgl