架构设计

整体架构

┌─────────────────────────────────────────────────────────────────┐
│                        Ego Pod(自我意识胶囊)                    │
│                                                                 │
│  ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌────────┐ │
│  │  数据采集器 │───→│  语料构建器 │───→│  训练引擎  │───→│ 版本管理│ │
│  │ Collector  │    │ Compiler  │    │ Trainer   │    │ Vault  │ │
│  └───────────┘    └───────────┘    └───────────┘    └────────┘ │
│       ↑                                                  ↓      │
│  ┌─────────┐                                      ┌──────────┐ │
│  │数据源配置 │                                      │ Ego 产出  │ │
│  │ Sources  │                                      │ Editions │ │
│  └─────────┘                                      └──────────┘ │
│                                                                 │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │                    配置中心(Config)                      │   │
│  │  基座选型 · Edition 定义 · 训练参数 · 数据源映射 · 调度策略  │   │
│  └──────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

模块说明

1. 数据采集器(Collector)

从配置指定的数据源读取宿主数据。

支持的数据源类型:

  • 本地目录(文件系统路径)
  • URL(HTTP/HTTPS 端点)
  • 云存储(S3、OSS、Google Drive 等,通过插件扩展)
  • 自定义适配器(用户可编写采集插件)

采集的数据类别(对应 iFay 架构):

数据类别对应 iFay 模块现实示例
感知数据Sense你每天的运动轨迹、手机使用时长分布、常去的餐厅位置、睡眠时间规律
行为数据Action你在手机上的操作习惯(总是先看微信再看邮件)、常用的快捷指令、自动化脚本
认知数据Thought你的读书笔记、工作日志、学习心得、对某个技术方案的评价和思考过程
技能数据Skill你会的编程语言和熟练度、擅长的菜谱、掌握的乐器和曲目列表
凭证数据Credentials你的身份标识、授权范围(如:可以代你发邮件但不能代你转账)、权限边界

例如:一个自由翻译者的 Collector 配置可能是这样的——Sense 指向她的翻译记忆库(本地目录),Action 指向她在 CAT 工具中的操作日志(URL),Thought 指向她的术语笔记(云盘),Skill 指向她的语言对和专业领域列表(本地文件)。

Collector 不关心数据的内部格式(那是姐妹项目定义的),只关心"去哪里取"和"取到的是哪类数据"。

2. 语料构建器(Compiler)

将采集到的原始数据转化为可用于 LoRA 训练的语料。

核心职责:

  • 数据清洗与脱敏 — 特别是 Credentials 相关数据。例如:你的 API 密钥 sk-abc123... 会被替换为 [REDACTED],确保训练数据中不包含任何敏感信息
  • 格式标准化 — 统一为训练框架可接受的格式。例如:你的一段读书笔记 "这本书讲的是分布式系统的 CAP 定理..." 会被转化为 {"instruction": "解释 CAP 定理", "output": "CAP 定理是分布式系统的..."}
  • 语料分类 — 按 LoRA 层级分组。例如:"我喜欢喝美式咖啡" 归入偏好层,"2024年去了日本旅行" 归入记忆层,"Python 的 GIL 机制是..." 归入知识层
  • 质量过滤 — 去除噪声数据、重复数据。例如:重复的聊天记录只保留一份,过短的片段(如 "嗯"、"好的")被过滤掉
  • 数据增强 — 必要时通过模板或改写扩充语料。例如:原始数据 "推荐一首歌" 会被增强为 "请用不同的方式表达:推荐一首歌"、"换一种说法:推荐一首歌"

输出格式:

  • 标准的指令微调数据集(instruction/input/output 三元组)
  • 对话格式数据集(multi-turn conversation)
  • 按 LoRA 层级分组的子数据集

3. 训练引擎(Trainer)

基于选定基座和构建好的语料,训练 LoRA 适配器。

多后端自动适配:

Trainer 会自动检测你的硬件环境,选择最优的训练后端:

优先级后端适用环境速度
1UnslothNVIDIA GPU (CUDA)最快(2x 加速)
2HuggingFace PEFTNVIDIA GPU (CUDA)标准速度
3Apple MLXMac (Apple Silicon)原生加速
4HuggingFace PEFT仅 CPU较慢但通用
5Stub无 ML 依赖模拟模式(开发/测试用)

你不需要关心用的是哪个后端——Ego Pod 会自动选择。如果你有一张 RTX 4090,它会用 Unsloth 加速;如果你用的是 MacBook Pro M3,它会用 MLX;如果你只是想先试试流程,它会用 Stub 模式模拟训练。

训练流程:

  1. 加载基座模型(4-bit 量化)
  2. 按 LoRA 层级依次训练适配器
  3. 验证训练效果(自动评估对齐度)
  4. 为每个 edition 生成对应的基座+LoRA 组合

多 Edition 训练策略:

  • 每个 edition 使用不同规模的基座
  • 同一份语料,针对不同基座分别训练 LoRA
  • 可并行训练多个 edition

例如:你有一台带 GPU 的台式机,运行 ego train 后,Ego Pod 会同时为你的手表(lite)、手机(normal)和电脑(plus)训练三个版本的 LoRA。整个过程大约 10-30 分钟,取决于数据量。

4. 版本管理(Vault)

管理 Ego 模型的版本和产出。

职责:

  • 存储每次训练产出的 LoRA 适配器
  • 管理多个 edition 的模型文件
  • 支持版本回滚(保留历史版本)
  • 覆盖旧版本(默认行为)
  • 导出为可分发的 Ego 包

例如:你上周训练了一个 Ego(v0.1.0),这周又加了新数据重新训练(v0.2.0)。结果发现新版本的回答风格变了,不像你了。这时你可以一键回滚到 v0.1.0,就像手机系统降级一样。

Ego 包结构:

ego-output/
├── manifest.json              # Ego 元数据(版本、基座信息、edition 列表)
├── lite/
│   ├── config.json            # edition 配置(基座型号、量化方式、硬件要求)
│   └── adapters/
│       └── ego-lora.safetensors  # LoRA 适配器权重
├── normal/
│   ├── config.json
│   └── adapters/
│       └── ego-lora.safetensors
├── plus/
│   ├── config.json
│   └── adapters/
│       └── ego-lora.safetensors
├── super/
│   ├── config.json
│   └── adapters/
│       └── ego-lora.safetensors
└── [custom-name]/             # 用户自定义 edition
    ├── config.json
    └── adapters/
        └── ego-lora.safetensors

5. 配置中心(Config)

统一管理 Ego Pod 的所有配置。

配置项:

# ego-config.yaml 示例

# 数据源映射 — 告诉 Ego Pod 去哪里找你的数据
sources:
  sense:
    type: "local"
    path: "/data/ifay/sense/"          # 你的感知数据目录
  action:
    type: "url"
    endpoint: "https://api.example.com/action-logs"  # 行为日志 API
  thought:
    type: "local"
    path: "/data/ifay/thought/"        # 你的笔记和知识库
  skill:
    type: "s3"
    bucket: "ifay-skills"              # 云端技能数据
    prefix: "user-001/"
  credentials:
    type: "local"
    path: "/data/ifay/credentials/"    # 凭证数据(会自动脱敏)

# 训练参数 — 通常不需要修改,默认值适合大多数场景
training:
  method: "qlora"
  quantization: "4bit"
  lora_rank: 16
  lora_alpha: 32
  learning_rate: 2e-4
  epochs: 3
  batch_size: 4

# Edition 定义 — 你想产出哪些版本
editions:
  lite:
    base: "qwen3.5-0.8B"
    description: "智能手表、录音笔、无人机、IoT"
  normal:
    base: "qwen3.5-2B"
    description: "手机、平板电脑"
  plus:
    base: "qwen3.5-4B"
    description: "高性能 PC、本地服务器"
  super:
    base: "qwen3.5-27B"
    description: "云服务、GPU 集群"
  # 你可以在这里添加自定义 edition,例如:
  # clinic:
  #   base: "qwen3.5-4B"
  #   description: "门诊专用版"

# 调度策略 — 什么时候自动重新训练
schedule:
  auto_update: true
  interval: "weekly"          # 每周自动修炼一次
  trigger: "data_change"      # 或 manual(手动触发)/ cron(定时任务)