基于第一性原理 + Anthropic 2026 J-space 论文实现的具身智慧系统。 核心架构: - ODE 动力系统 + 并行专家 + J-space 工作空间广播 - 12 个异构专家(视觉/屏幕/听觉/语言/鼠标/跨模态) - workspace 256 维 + LayerNorm + RK4 积分 自主心智(最重要的能力): - 好奇心驱动探索(内在奖励 + 世界模型) - 跨会话状态持久化(海洋不蒸发) - 自我模型(知道自己会什么不会什么) - 元学习(自适应学习率 + 策略选择) 具身 Agent(完整神经系统): - 感知层:摄像头 + 麦克风 + 屏幕 + 键盘 + 鼠标 - 大脑皮层(workspace)+ 小脑(运动控制)+ 中枢神经(门控) - 海马体(情景记忆)+ 基底神经节(动作选择) - 执行器:鼠标控制 + 键盘输出 + 音频播放 + 屏幕绘制 多模态支持: - 原生图像/音频/视频/文本/键盘/鼠标 6 种模态 - 跨平台(macOS/Windows/Linux) 外挂模块系统: - 可热插拔的外部能力(小模型/知识库/工具) - 核心心智不依赖外挂,断开后继续工作 守护进程: - 用户主动 start/stop(不自启) - 后台静默运行,持续感知学习 - 状态自动保存,跨会话继续 J-lens 可解释性: - 观测模型内部每个 ODE 子步的想法 - Directed Modulation 验证 workspace 因果作用 - Selectivity 验证(ablate workspace) 小模型蒸馏: - 接 GPT-2/Qwen 等迁移理解能力 - 蒸馏完成后小模型可断开 验证结果: - 连续序列:JSpace 胜 Flat 39.7% - 语言进化:loss 3.95→2.40 - workspace ||w||:v1 0.05 → v2 16.0 - 实时五通道感知 + 具身闭环运行
60 lines
2.7 KiB
Python
60 lines
2.7 KiB
Python
"""小模型感知编码器——把小模型表征投影到 input_dim"""
|
|
from __future__ import annotations
|
|
import torch, torch.nn as nn, torch.nn.functional as F
|
|
|
|
|
|
class SmallModelEncoder(nn.Module):
|
|
def __init__(self, input_dim=32, model_name="gpt2", use_real_model=True):
|
|
super().__init__()
|
|
self.input_dim = input_dim
|
|
self.model_name = model_name
|
|
self._real_model = None
|
|
self._tokenizer = None
|
|
self._hidden_size = 128
|
|
|
|
if use_real_model:
|
|
try:
|
|
from transformers import AutoModel, AutoTokenizer
|
|
self._tokenizer = AutoTokenizer.from_pretrained(model_name)
|
|
self._model = AutoModel.from_pretrained(model_name)
|
|
self._model.eval()
|
|
self._hidden_size = self._model.config.hidden_size
|
|
self._real_model = self._model
|
|
if self._tokenizer.pad_token is None:
|
|
self._tokenizer.pad_token = self._tokenizer.eos_token
|
|
print(f" [编码器] 已加载 {model_name} (hidden={self._hidden_size})")
|
|
except Exception as e:
|
|
print(f" [编码器] 降级: {e}")
|
|
|
|
if self._real_model is not None:
|
|
self.proj = nn.Linear(self._hidden_size, input_dim, bias=False)
|
|
else:
|
|
self.embed = nn.Embedding(1000, 64)
|
|
self.proj = nn.Sequential(
|
|
nn.Linear(64, 128), nn.ReLU(), nn.Linear(128, input_dim))
|
|
|
|
def forward(self, input_data):
|
|
if self._real_model is not None:
|
|
if isinstance(input_data, str):
|
|
input_data = [input_data]
|
|
if isinstance(input_data, list):
|
|
with torch.no_grad():
|
|
inputs = self._tokenizer(input_data, return_tensors="pt",
|
|
truncation=True, max_length=64, padding=True)
|
|
outputs = self._model(**inputs)
|
|
hidden = outputs.last_hidden_state.mean(dim=1)
|
|
return self.proj(hidden)
|
|
if isinstance(input_data, torch.Tensor) and input_data.dtype == torch.long:
|
|
with torch.no_grad():
|
|
outputs = self._model(input_ids=input_data)
|
|
hidden = outputs.last_hidden_state.mean(dim=1)
|
|
return self.proj(hidden)
|
|
if isinstance(input_data, torch.Tensor) and input_data.dtype == torch.long:
|
|
emb = self.embed(input_data)
|
|
if emb.dim() == 3: emb = emb.mean(dim=1)
|
|
elif emb.dim() == 2: emb = emb.mean(dim=0, keepdim=True)
|
|
return self.proj(emb)
|
|
if isinstance(input_data, torch.Tensor):
|
|
return self.proj(input_data)
|
|
return torch.zeros(1, self.input_dim)
|