跳到主要内容
AI教程

构建并连接 WERM:用于本地 AI 引导的秀丽隐杆线虫神经网络

了解如何安装 WERM,模拟由 302 个神经元组成的秀丽隐杆线虫神经网络,施加触碰刺激,将其连接到 Ollama 或兼容 OpenAI 的本地服务器,并利用其神经状态影响语言模型的采样设置。

构建并连接 WERM:用于本地 AI 引导的秀丽隐杆线虫神经网络
WERM 项目可视化

WERM 的功能

WERM 是 Wiring-Encoded Recurrent Modulator(连线编码循环调制器)的缩写,是一个小型神经模拟系统,基于成年雌雄同体秀丽隐杆线虫(Caenorhabditis elegans)的真实神经连接图。其包含302个神经元的脉冲率网络可以在浏览器、Node.js 中运行,也可以与计算机本地运行的语言模型协同工作。

该模型使用神经连接组处理模拟的感官刺激。一个控制层读取由此产生的线虫状态,并将其转换为语言模型设置,例如温度、top-p、令牌限制和单行语气模式。与本地模型配合使用时,WERM 不会向远程服务发送数据。

哪些内容基于生物数据?

代码仓库包含 Cook 等人于2019年发布的成年雌雄同体线虫神经网络,该网络通过 OpenWorm Connectome Toolbox 提供。它包含302个神经元、3,709条有向化学连接和1,105对缝隙连接。连接权重表示在多少个电子显微镜切片中观察到两个细胞相连,而不是直接的突触数量。

项目还包含基因组衍生的图谱。参考基因组为 NCBI RefSeq GCF_000002985.6,也称为 WBcel235;基因注释来自 WormBase WS298。所含测量覆盖六条染色体上的100,272,607个碱基,GC 含量为35.4%,蛋白质编码基因为19,971个。

WERM 使用带有受液态时间常数网络启发的门控机制的脉冲率网络。已知能够生成并释放 GABA 的28个神经元被视为抑制性神经元,其余神经元被视为兴奋性神经元。

理解建模选择

神经连接组没有规定每个突触的信号符号。因此,WERM 使用基于 GABA 的规则作为简化假设。模型参数由 scripts/sweep.mjs 从1,470组设置中选出,所依据的规则在查看结果前就已固定。这意味着 WERM 是一个经过调优的模型,而不是针对神经记录拟合的模型。

控制映射同样是明确的设计选择。线虫状态通过可检查和修改的代码控制采样参数与语气。神经科学数据不会决定这些语言模型设置。

安装并运行首次模拟

克隆代码仓库并进入其目录:

git clone https://github.com/Henryfud/werm
cd werm

WERM 需要 Node.js 20或更高版本。模型没有运行时依赖,因此无需安装软件包即可运行单元测试:

npm test

使用尾部触碰刺激运行一个持续三秒的模拟:

node src/cli.mjs sim --stim touch-tail --seconds 3

该命令使用选定的感官输入运行网络。命令行界面还支持 connect 命令,用于集成本地语言模型;也支持 steer 命令,用于检查 WERM 将生成的设置。

将 WERM 连接到 Ollama

首先从 ollama.com/download 安装 Ollama 并启动它。如有需要,可以直接使用 ollama serve 启动服务。下载一个本地模型,然后将 WERM 连接到该模型:

ollama pull llama3.2
node src/cli.mjs connect --model llama3.2

将 llama3.2 替换为 Ollama 中已安装的任意模型名称。如果 Ollama 未运行或模型不可用,WERM 会报告问题并建议应运行的命令。当 Ollama 服务托管在 http://localhost:11434 以外的位置时,请使用 --host。

在对话过程中,WERM 首先将消息转换为感官刺激,让线虫运行一小段时间,然后使用生成的状态配置模型请求。当 WERM 和模型服务器都在本地运行时,消息会保留在你的计算机上。

使用其他兼容 OpenAI 的本地服务器

WERM 可以连接到任何提供 OpenAI 聊天补全 API 的本地引擎。启动服务器,然后提供其基础 URL 和模型名称:

node src/cli.mjs connect --base-url http://localhost:1234/v1 --model YOUR_MODEL

常见的服务器配置包括:

  • LM Studio:从其 Developer 标签页启动本地服务器,并使用 http://localhost:1234/v1。
  • llama.cpp:运行 llama-server -m your-model.gguf,并使用 http://localhost:8080/v1。
  • vLLM:运行 vllm serve your-model,并使用 http://localhost:8000/v1。
  • Ollama 的 OpenAI 风格端点:使用 http://localhost:11434/v1。

对于这些服务器,WERM 会发送 temperature、top_p 和 max_tokens。OpenAI 风格的 API 不包含 Ollama 客户端使用的重复惩罚参数,因此会省略该选项。如果你的服务器需要身份验证,请设置 WERM_API_KEY 环境变量。

在不联系模型的情况下检查控制设置

使用 steer 命令查看 WERM 如何解读一条消息:

node src/cli.mjs steer "why is my code broken?"

该命令会打印推断出的刺激、当前模式、特定模型的选项以及系统提示词。结果可能包含 nose-touch 和 noxious 等刺激、reversing 模式,以及适用于 Ollama 和兼容 OpenAI 客户端的采样值。

在开发集成时,这个离线命令非常有用,因为你可以在不启动模型服务器的情况下检查控制行为。

在 JavaScript 中使用 WERM

核心网络和引导辅助工具以 ES 模块形式提供。以下示例加载连接组,使网络稳定下来,应用从消息中得到的刺激,并读取生成的引导参数:

import fs from "node:fs";
import { WormBrain } from "./src/network.mjs";
import { steer, stimuliFromText, applyStimuli, systemPrompt } from "./src/steer.mjs";

const worm = new WormBrain(
  JSON.parse(fs.readFileSync("data/connectome.json", "utf8"))
);

worm.run(1);
applyStimuli(worm, stimuliFromText("thanks, that helped"), true);
worm.run(1.5);

const { options, mode } = steer(worm.readout());
// Send options and systemPrompt(mode) to your local engine.

初始的 worm.run(1) 调用会让网络稳定下来。将文本转换为刺激后,applyStimuli 会改变感觉状态,再次运行则为网络提供响应所需的时间。随后,readout 会传递给 steer,后者返回采样选项和模式。使用 systemPrompt(mode) 获取相应的语气提示词。

重新运行实验

仓库包含用于参数扫描、零模型比较和储备池式记忆基准测试的脚本:

npm run sweep
npm run experiments

这些命令会将结果写入 docs/results/,使用所有可用的 CPU 核心,并需要几分钟时间。

文档中的研究结果表明,在每项测试中,尾部触碰都会强烈推动网络向前,而鼻部触碰会推动网络向后,其效果优于 100 次相同强度的随机刺激。头部触碰只会产生轻微的向后响应,而有害刺激并不比随机刺激更有效。打乱后的网络和随机网络通常无法重现真实网络头部与尾部响应之间的差异,不过在记忆基准测试中,真实连接方式的表现略逊于打乱后的版本。

引导对语言模型输出的影响尚未得到测量。评估脚本已经提供,但真实模型运行仍有待完成。

评估引导效果

若要在不连接 Ollama 的情况下预览计划中的评估,请运行:

node scripts/steer-eval.mjs --dry-run --limit 5

若要使用本地 Ollama 模型进行真实评估,请运行:

node scripts/steer-eval.mjs --model llama3.2

该脚本会在 200 个提示词上比较默认设置、WERM 生成的设置和随机设置。干运行选项适合在开始依赖模型的测试前检查计划中的参数。

重新构建基因组和连接组数据

基因组图

要下载参考基因组并重新生成 GC 图和基因密度图,请运行:

bash scripts/fetch_genome.sh
node scripts/genome_stats.mjs data/genome/c_elegans.fasta
node scripts/gc_windows.mjs data/genome/c_elegans.fasta
bash scripts/fetch_annotation.sh
node scripts/gene_windows.mjs data/genome/annotation.gff.gz

基因组下载文件约为 100 MB,注释下载文件约为 10 MB。下载的文件会被 Git 忽略。网站也可以读取本地 FASTA 文件来绘制 GC 图;数据不会被上传。

连接组文件

要重新构建 data/connectome.json,请创建 Python 虚拟环境,安装所需的软件包归档文件,解压该文件,然后运行构建脚本:

python3 -m venv .venv
.venv/bin/pip install openpyxl
.venv/bin/pip download cect==0.3.5 --no-deps -d dl
unzip -q dl/cect-*.whl -d dl/x
.venv/bin/python scripts/build_connectome.py dl/x/cect/data

构建并检查网站

site/ 中的长页面网站包含生成式像素蠕虫场、实时连接组地球仪、按比例绘制的基因组以及说明性注释。网站使用与命令行模型相同的代码。

使用以下命令构建页面:

npm run build:site

该命令会写入 site/index.html。设置 GITHUB_URL 或 SITE_URL 可自定义页面上的链接。Netlify 使用相同的构建流程。

使用以下命令运行仓库检查:

npm test
npm run check
npm ci && npx playwright install chromium && npm run test:site

测试套件包含 36 个单元测试。其他检查会验证项目规范,并运行无头浏览器冒烟测试。持续集成会在 Node.js 20 和 22 上运行这些检查。

了解项目结构

  • data/connectome.json 包含神经元和连接。
  • src/network.mjs 实现神经元模型。
  • src/reflex.mjs 包含反射检查和特异性比较。
  • src/graphs.mjs 创建打乱后的随机连接变体和随机连接变体。
  • src/steer.mjs 将蠕虫状态映射为模型设置和语气。
  • src/ollama.mjs 和 src/openai.mjs 实现本地模型客户端。
  • src/cli.mjs 提供 sim、connect 和 steer 命令。
  • scripts/ 包含数据、实验、验证和网站构建脚本。
  • docs/RESULTS.md 记录测量结果,docs/ARCHITECTURE.md 说明模型和读出机制。

重要限制

WERM 经过有意缩减,并不是完整的生物学模拟。它没有肌肉、身体物理、神经肽或学习机制,也未与真实蠕虫的记录进行比较。其行为不应被解读为对真实蠕虫行为的预测。

引导层同样不会赋予语言模型新的能力,而且其对模型响应的影响尚未得到测量。为了进行更忠实的生物物理模拟,README 推荐使用 OpenWorm 的 c302。WERM 的设计足够紧凑,便于在一个下午内完成检查和修改。

结论

WERM 提供了一种实用方式,让你无需大型模拟技术栈,就能试验真实的秀丽隐杆线虫神经连接图。先从 Node.js CLI 开始,测试触碰刺激,检查生成的引导参数,然后将网络连接到 Ollama 或其他兼容 OpenAI 接口的本地服务器。之后,随附的脚本可以帮助你复现实验、重新构建生物数据产品,并根据自己的本地 AI 工作流调整引导层。