メインコンテンツへ移動
AIチュートリアル

WERMを構築・接続する:ローカルAI制御のためのC. elegansニューラルネットワーク

WERMのインストール方法、302個のニューロンからなるC. elegansネットワークのシミュレーション、タッチ刺激の適用、OllamaまたはOpenAI互換のローカルサーバーへの接続方法を解説します。さらに、その神経状態を使って言語モデルのサンプリング設定に影響を与える方法も紹介します。

WERMを構築・接続する:ローカルAI制御のC. elegansニューラルネットワーク
WERMプロジェクトの可視化

WERMの役割

WERMはWiring-Encoded Recurrent Modulator(配線エンコード型再帰変調器)の略称で、成体の雌雄同体Caenorhabditis elegansの実際の神経配線図を基にした小規模なニューラルシミュレーションです。302個のニューロンによるレートネットワークは、ブラウザー、Node.js、またはコンピューター上でローカルに動作する言語モデルと連携して実行できます。

このモデルはコネクトームを使って、シミュレーションされた感覚刺激を処理します。ステアリング層はその結果得られた線虫の状態を読み取り、temperature、top-p、トークン制限、一行のトーンモードなどの言語モデル設定に変換します。ローカルモデルと使用する場合、WERMはデータをリモートサービスに送信しません。

生物学的データに基づいている部分

リポジトリには、OpenWorm Connectome Toolboxを通じて提供されるCookら(2019)の成体雌雄同体ネットワークが含まれています。そこには302個のニューロン、3,709個の有向化学結合、1,105組のギャップ結合があります。結合の重みは直接的なシナプス数ではなく、2つの細胞が結合していることが電子顕微鏡の切片で観察された回数を表します。

このプロジェクトには、ゲノム由来のマップも含まれています。参照ゲノムはNCBI RefSeq GCF_000002985.6(WBcel235とも呼ばれます)で、遺伝子アノテーションはWormBase WS298に基づいています。収録された測定値は、6本の染色体にわたる100,272,607塩基を対象としており、GC含量は35.4パーセント、タンパク質コード遺伝子は19,971個です。

WERMは、リキッド・タイム・コンスタント・ネットワークに着想を得たゲートを備えたレートネットワークを使用します。GABAを合成して放出することが知られている28個のニューロンは抑制性として扱い、残りのニューロンは興奮性として扱います。

モデリング上の選択を理解する

コネクトームには、すべてのシナプスの符号が指定されているわけではありません。そのためWERMでは、単純化のための仮定としてGABAに基づく規則を使用します。モデルパラメーターは、結果を確認する前に固定した規則に従い、1,470個の設定からscripts/sweep.mjsによって選択されました。したがってWERMは調整済みのモデルであり、神経記録に適合させたモデルではありません。

ステアリングのマッピングも明示的な設計上の選択です。線虫の状態は、確認や変更が可能なコードを通じて、サンプリングパラメーターとトーンを制御します。神経科学データがこれらの言語モデル設定を決定するわけではありません。

インストールして最初のシミュレーションを実行する

リポジトリをクローンし、そのディレクトリに移動します。

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

WERMにはNode.js 20以降が必要です。モデルにランタイム依存関係はないため、パッケージをインストールせずにユニットテストを実行できます。

npm test

尾部への接触刺激を使って、3秒間のシミュレーションを実行します。

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

このコマンドは、選択した感覚入力でネットワークを実行します。コマンドラインインターフェースは、ローカル言語モデルとの統合用のconnectコマンドと、WERMが生成する設定を確認するためのsteerコマンドにも対応しています。

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());
// options と systemPrompt(mode) をローカルエンジンに送信します。

最初の 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の対象外です。サイトはGCマップの描画にローカルのFASTAファイルを使用することもできます。データがアップロードされることはありません。

コネクトームファイル

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を使えば、大規模なシミュレーション基盤を必要とせずに、実際のC. elegansの配線図を実験的に扱えます。まずNode.js CLIから始め、接触刺激をテストし、生成されたステアリングパラメータを確認してから、ネットワークをOllamaまたは別のローカルOpenAI互換サーバーに接続します。その後、付属のスクリプトを使って実験を再現したり、生物学的データ製品を再構築したり、ステアリング層を独自のローカルAIワークフローに適応させたりできます。