架構設計

整體架構

┌─────────────────────────────────────────────────────────────────┐
│                        Ego Pod(自我意識膠囊)                    │
│                                                                 │
│  ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌────────┐ │
│  │  資料採集器 │───→│  語料建構器 │───→│  訓練引擎  │───→│ 版本管理│ │
│  │ Collector  │    │ Compiler  │    │ Trainer   │    │ Vault  │ │
│  └───────────┘    └───────────┘    └───────────┘    └────────┘ │
│       ↑                                                  ↓      │
│  ┌─────────┐                                      ┌──────────┐ │
│  │資料來源設定│                                      │ Ego 產出  │ │
│  │ Sources  │                                      │ Editions │ │
│  └─────────┘                                      └──────────┘ │
│                                                                 │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │                    設定中心(Config)                      │   │
│  │  基座選型 · Edition 定義 · 訓練參數 · 資料來源對應 · 排程策略 │   │
│  └──────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

模組說明

1. 資料採集器(Collector)

從設定指定的資料來源讀取宿主資料。

支援的資料來源類型:

  • 本機目錄(檔案系統路徑)
  • URL(HTTP/HTTPS 端點)
  • 雲端儲存(S3、OSS、Google Drive 等,透過外掛擴充)
  • 自訂適配器(使用者可撰寫採集外掛)

採集的資料類別(對應 iFay 架構):

資料類別對應 iFay 模組現實範例
感知資料Sense你每天的運動軌跡、手機使用時長分佈、常去的餐廳位置、睡眠時間規律
行為資料Action你在手機上的操作習慣(總是先看 LINE 再看信箱)、常用的快捷指令、自動化腳本
認知資料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(排程任務)