주요 콘텐츠로 건너뛰기
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 et al. 2019의 성체 자웅동체 신경망이 포함되어 있으며, OpenWorm Connectome Toolbox를 통해 제공됩니다. 여기에는 302개의 뉴런, 3,709개의 유향 화학적 연결, 1,105쌍의 간극연접이 포함됩니다. 연결 가중치는 직접적인 시냅스 수가 아니라 두 세포가 연결된 상태로 관찰된 전자현미경 단면의 수를 나타냅니다.

이 프로젝트에는 유전체에서 파생된 지도도 포함되어 있습니다. 참조 유전체는 NCBI RefSeq GCF_000002985.6이며 WBcel235라고도 합니다. 유전자 주석은 WormBase WS298에서 가져왔습니다. 포함된 측정값은 6개 염색체에 걸친 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

꼬리 접촉 자극을 사용해 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());
// 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

게놈 다운로드 용량은 약 100MB이고 주석 다운로드 용량은 약 10MB입니다. 다운로드한 파일은 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은 대규모 시뮬레이션 스택 없이 실제 C. elegans 신경 연결도를 실험할 수 있는 실용적인 방법을 제공합니다. Node.js CLI로 시작해 접촉 자극을 테스트하고, 생성된 조향 매개변수를 살펴본 다음, 네트워크를 Ollama 또는 다른 로컬 OpenAI 호환 서버에 연결하세요. 이후 포함된 스크립트를 사용하면 실험을 재현하고, 생물학적 데이터 제품을 다시 빌드하며, 조향 계층을 자신만의 로컬 AI 워크플로에 맞게 조정할 수 있습니다.