作者: kerwin77106

  • In-Place Test-Time Training 讓模型邊推理邊變強

    📌 本文重點

    • In-Place TTT 讓 LLM 在推理時就地微調
    • 只更新 MLP projection,成本可控又穩定
    • 對小模型與超長 context 任務效果特別明顯

    傳統 「先訓練後部署」 的模型,在上線後面對新 domain、新長文檔,只能靠 prompt/RAG「繞著問題走」,權重本身完全不會變。In-Place Test-Time Training(In-Place TTT)要解決的就是:

    在不重新訓練整個模型、不影響服務穩定性的前提下,讓 LLM 在推理過程中針對當前 context 做「就地微調」,即用即學。

    對開發者的直接好處:

    • 小模型 + 超長 context 的 任務表現大幅提升(paper 裡 0.4B 模型在 128k context 明顯變強)
    • 某些固定 domain(公司內知識庫、特定專案)可以在 session 內 自動做 domain adaptation,不用頻繁 retrain
    • 不需要新架構、不改 attention,只在 MLP projection 上動手腳,工程改動可控

    💡 關鍵: In-Place TTT 用少量 MLP 投影更新,就能在 128k 這種超長 context 下明顯強化 0.4B 等小模型的表現,達到「小模型大任務」的效果


    重點說明

    1. TTT 是什麼?為什麼舊做法不適合 LLM?

    Test-Time Training(TTT) 的想法很簡單:

    1. 推理時,先根據當前輸入做一點訓練(更新一小部分參數 = 快權重 fast weights)
    2. 再用更新後的模型做真正的預測

    在 CV/小模型上,常見做法是加一個小 head、對自監督目標(rotation、jigsaw 等)做幾步 gradient update。

    但直接搬到 LLM 會踩坑:

    • 架構不兼容:很多 TTT 方案假設有額外 head 或特定 feature,LLM 一般沒有設計這種 TTT head
    • 計算太貴:如果動 transformer block 的多數權重,長 context 下反向傳播非常重
    • 目標不對齊:TTT 的 loss 不是 next-token prediction,會和原本的語言建模目標衝突,容易越調越壞

    In-Place TTT 的貢獻,就是解決這三個問題:

    • 不改架構,只把 MLP 最終 projection matrix 視為快權重
    • 只在這些 projection 上做反向,成本可控
    • 設計與 自回歸 NTP(next-token prediction)對齊 的訓練目標

    2. 為什麼選 MLP 最終 projection 當快權重?

    以典型 transformer block 的 FFN 為例:

    x -> W1 -> act -> W2 -> 殘差加回
    

    In-Place TTT 把 W2(MLP 最終 projection) 變成可更新快權重,原因:

    1. 局部但影響力大:W2 直接把非線性特徵投回主 hidden space,調這一層可以改變 token 的語義表徵,但不動 attention 結構
    2. 參數量適中:比動整個 block 或 embedding 便宜得多,長 context 反向成本可接受
    3. 穩定性好:不動 attention,有助於保持原模型的「語言能力」,在此之上做局部適配

    實務上的感受是:這種類似 LoRA 但只開在 MLP output projection 的調整方式,對長上下文裡的 pattern 適配非常有效,且容易控制範圍。

    💡 關鍵: 只動 MLP 的最後投影 W2,等於用最小的權重區塊,撬動整個 hidden space 的語義調整,兼顧效果與穩定性


    3. 如何設計與 next-token prediction 對齊的 TTT 目標?

    In-Place TTT 不再另外設計自監督任務,而是直接基於 自回歸 NTP:

    • 你有一段長 context:[x1, x2, ..., xT]
    • 原本推理只 forward,loss 不回傳
    • 現在在部分 token 上:
    • 用原模型 logits 做 next-token cross-entropy
    • 但只對 MLP W2 回傳梯度並更新(其他權重 frozen)

    為了讓計算量可控,實作上會:

    • 把長 context 切成多個 blocks(例如每 512 或 1024 tokens)
    • 每個 block:
    • 先 forward 得到 loss
    • 只在該 block 上做一兩步梯度更新
    • 不回頭修正舊 block 的輸出(in-place)

    這樣:

    • 目標和原 pretrain 任務完全一致,不會「學歪」
    • 計算複雜度近似於「多做一輪 forward+backward」,可以和現有 KV cache/長 context 優化一起用

    4. 分塊更新如何兼容長上下文與多請求並行?

    對系統工程師來說,最大問題是:

    長 context + 反向傳播 + 多 request,會不會把 GPU 打爆?

    In-Place TTT 的分塊策略大致如下:

    • Block-wise TTT:
    • Example:128k context,每 1k tokens 一塊,共 128 個 block
    • 每個 block:forward、算 loss、只更新 W2 的少量參數
    • 不需要保留整段的中間梯度,只需要當前 block 的 activations
    • 和 KV cache 相容:
    • KV cache 還是照原本自回歸生成方式累積
    • TTT 僅對當前 block 的 MLP projection 做 backward,不需要對 KV 做反向
    • 多請求並行:
    • 每個 request 自己帶一組「快權重 state」(或 delta)
    • 服務層可以:
      • 把 base 模型權重設為 read-only
      • 為每個 session 存一個 快權重 buffer(例如低秩 delta 或 mask 更新)

    這點和 KV cache 管理框架(vLLM, InfiniGen, H2O 等) 類似:

    • KV cache 管 context-dependent activations
    • 快權重則是 context-dependent 權重偏移

    兩者一起用時要特別小心記憶體分配和 eviction 策略:TTT 的 state 不宜無限制累積。

    💡 關鍵: 把 TTT 的更新設計成 per-session 的小型權重偏移,就能在保持多並發與穩定性的前提下,讓每個請求都「自己學自己」


    實作範例:在推理服務中加一層簡單的 In-Place TTT

    以下用 PyTorch 風格虛擬碼示意,重點是流程與邊界,而非完整訓練程式。

    1. 模型改造:標記可更新的 MLP projection

    class TTTMLP(nn.Module):
        def __init__(self, inner_dim, hidden_dim, enable_ttt=False):
            super().__init__()
            self.w1 = nn.Linear(hidden_dim, inner_dim)
            self.act = nn.GELU()
            self.w2 = nn.Linear(inner_dim, hidden_dim)
    
            # 只在 TTT 模式下允許 w2 被更新
            self.enable_ttt = enable_ttt
            for p in self.w1.parameters():
                p.requires_grad = False
            for p in self.w2.parameters():
                p.requires_grad = enable_ttt
    
        def forward(self, x):
            return self.w2(self.act(self.w1(x)))
    

    在整個 transformer 裡,只需要把原本 MLP 換成 TTTMLP(或只在指定層啟用 enable_ttt)。

    2. 推理 + In-Place TTT loop(單 request)

    def run_with_ttt(model, tokenizer, input_ids,
                     max_new_tokens=128,
                     ttt_block_size=1024,
                     ttt_steps=1,
                     ttt_lr=1e-4):
        """
        model: 已載入的 LLM,除了 MLP.w2 之外都 frozen
        input_ids: 長 context token ids
        """
        device = next(model.parameters()).device
        input_ids = input_ids.to(device)
    
        # 建一個專用 optimizer,只管 MLP.w2
        ttt_params = [p for n, p in model.named_parameters()
                      if p.requires_grad and 'mlp.w2' in n]
        optimizer = torch.optim.AdamW(ttt_params, lr=ttt_lr)
    
        model.eval()
    
        # === 1) 先在 context 上做 block-wise TTT ===
        for start in range(0, input_ids.size(1) - 1, ttt_block_size):
            end = min(start + ttt_block_size, input_ids.size(1) - 1)
            block = input_ids[:, start:end+1]  # [B, L_block+1]
    
            with torch.enable_grad():
                logits = model(block[:, :-1])  # predict next token
                target = block[:, 1:]
                loss = torch.nn.functional.cross_entropy(
                    logits.reshape(-1, logits.size(-1)),
                    target.reshape(-1),
                )
    
                optimizer.zero_grad()
                loss.backward()
                # 只會更新 MLP.w2
                optimizer.step()
    
        # === 2) 使用更新後的模型繼續生成 ===
        generated = model.generate(
            input_ids=input_ids,
            max_new_tokens=max_new_tokens,
            do_sample=False,
            use_cache=True,
        )
        return generated
    

    重點:

    • 在 TTT 階段:
    • torch.enable_grad() 打開梯度
    • 只在 context token 上跑 1~數步更新
    • 在 生成階段:
    • 關掉梯度,只用更新後的快權重

    3. 服務層:何時開啟/關閉 TTT?

    可以在 serving config 裡加一個 flag:

    model:
      name: my-ttt-llm
      enable_ttt: true
      ttt_block_size: 1024
      ttt_steps: 1
      ttt_lr: 1e-4
      ttt_max_tokens: 32768   # 超過就不再做 TTT,避免過度漂移
    
    policy:
      enable_ttt_for:
        - domain: "enterprise_qa"
        - domain: "long_doc_summarization"
      disable_ttt_for:
        - domain: "safety_sensitive"
        - domain: "code_generation_prod"
    

    路由層可以依「任務類型」或「租戶設定」決定是否啟用 TTT。


    建議與注意事項

    1. 哪些任務適合/不適合開 TTT?

    適合:

    • Domain adaptation:企業內知識庫 QA、專案文件解讀、特定產品 FAQ
    • 超長 context 理解:法律條文、技術規格書、長期會議紀錄
    • 單 session 可犧牲一點穩定性、換取更高表現 的任務(例如 research 助理)

    不太適合:

    • 安全敏感場景(合規、法務、金融決策):
    • TTT 可能放大 prompt 中的偏見或惡意樣本
    • 多人共用同一快權重的情境:
    • 不建議跨 user 共用 TTT state,否則有「資訊污染」風險
    • 需要行為高度穩定可重現 的任務(例如 production codegen、評測 pipeline)

    建議做法:

    • 預設 關閉 TTT,只對少數實驗/內部使用場景逐步開啟
    • 透過 A/B 測 和離線 eval 確認收益和風險

    2. 如何限制更新範圍,避免「越調越壞」?

    可以採幾個防護措施:

    1. 學習率和步數上限:
    2. ttt_lr 通常比 finetune 更小(例如 1e-4 或更低)
    3. 每個 block 最多 1~2 步更新即可
    4. Layer 範圍限制:
    5. 只開啟 中後段幾層的 MLP.w2,減少對基本語言能力的影響
    6. 正則化 / 參考權重:
    7. 在 loss 中加入對 base 權重的 L2 正則
    8. 或採 低秩 delta/adapter(權重不直接改動,易於 reset)
    9. TTL / Reset 策略:
    10. TTT state 掛在 session 上,session 結束就丟棄
    11. 長 session 內可定期 reset:例如每處理 64k token reset 一次

    3. 與 RAG、cache、LoRA 等架構的整合與踩坑

    與 RAG:

    • RAG 解決「資料更新」,TTT 解決「怎麼更好地用同一份長 context」
    • 組合策略:
    • RAG 提供切好的 chunks
    • In-Place TTT 在讀完多個 chunks 後,讓模型更懂這批文件中常見的 schema/名詞
    • 踩坑:
    • 若檢索結果品質不穩,TTT 可能被噪音「帶偏」,建議在高 confidence 檢索結果上才啟用 TTT

    與 KV cache:

    • 注意 權重更新與 KV cache 一致性:
    • 一般做法是 TTT 階段只用來更新權重,不直接用於生成
    • 開始生成時,重新用更新後權重+原 context 做一次 forward 建立 KV(或只從 TTT 後的 block 開始)
    • 若使用 vLLM 類似框架,要確保:
    • 同一 session 的 KV cache 與 TTT 權重版本對齊,避免「舊權重產生的 KV」搭配「新權重」

    與 LoRA / adapters:

    • 一種實務上更穩的做法:
    • base 模型 frozen
    • 安裝一個 LoRA-adapter 只開在 MLP.w2
    • TTT 只更新 LoRA 權重
    • 好處:
    • 快權重是「外掛」,可以 per-session 建立、銷毀
    • 也可以在 A/B 測時方便地比較「有/無 TTT adapter」

    4. 小模型 + 超長 context:何時值得導入?

    In-Place TTT 對 參數較小、context 很長 的組合特別有價值:

    • 小模型在長 context 內本來就容易「記不住 pattern」,TTT 可以在當前 session 內補強
    • 和 LongSpec 等 長 context + speculative decoding 技術搭配:
    • 先用 LongSpec 等提升解碼效率
    • 再用 In-Place TTT 提升長文本任務表現

    可以用以下 heuristics 判斷是否值得導入:

    • 模型 ≤ 7B,context ≥ 32k,而且任務高度依賴長文本理解 → 強烈建議實驗 TTT
    • 模型很大(70B+)且 context 不長(≤ 8k) → TTT 收益相對有限
    • 對 latency/成本極敏感的線上服務 → 可以先在 async 或批次任務(離線總結、分析)試水溫

    總結:In-Place TTT 提供了一個工程上可落地的途徑,讓 LLM 在推理時針對當前長 context 做小幅度、可控的「就地學習」。

    若你正在:

    • 用小模型硬扛超長 context
    • 常常為某個固定 domain 調 prompt/RAG 卻仍覺得不穩

    那麼在 pipeline 中加入 MLP projection 級別的 In-Place TTT,是很值得 A/B 測的一步升級。


    🚀 你現在可以做的事

    • 在現有 LLM 服務中挑選一個長文本任務(如長文總結)實作一版只更新 MLP W2 的 In-Place TTT PoC
    • 針對「開/關 TTT」設計離線與線上 A/B 測試,觀察長 context 任務指標與 latency、成本變化
    • 若已有 RAG pipeline,在高信心檢索場景下試著加入 block-wise TTT,評估對 domain QA 準確率的提升
  • 本地部署 Hermes Agent:打造會成長的專屬 AI 助理

    📌 本文重點

    • Hermes Agent 幫你把零散腳本變成長期共事的本地 AI 助理
    • 核心是模組化 Agent、工具調用與長期記憶設計
    • 今晚就能跑起第一個專職 Agent,逐步接腳本與內部系統

    Hermes Agent 要解決的事很單純:幫你把「一堆零散的 AI 工具 + 腳本」,整理成一個會記憶、會學習、能長期陪你工作的本地 AI 助理。

    專案連結:https://github.com/NousResearch/hermes-agent


    核心功能:它跟一般 Agent 框架哪裡不一樣?

    Hermes Agent 的關鍵,不是「能不能叫 LLM 寫程式」,而是怎麼把它變成一個可以長期共事的 Agent。下面三個核心設計,是你決定要不要採用它時最值得看的一段。

    💡 關鍵: Hermes Agent 的設計重點在「長期共事與成長」,而不是一次性的自動化腳本。

    1. 模組化 Agent:一個框架養多個專職助手

    多數像 LangChain、AutoGen 的用法,是「專案導向」:

    • 你先有一個目標(爬資料、寫報告)
    • 再拼一條 Chain 或一組 Agent 協作

    Hermes Agent 反過來:先有一個固定的人格 / 角色,再依需求加能力。

    實際上你可以:

    • 建一個 ResearchAgent:只管幫你找資料、整理重點
    • 一個 CodeAgent:負責修 bug、寫測試
    • 一個 OpsAgent:每天早上拉資料、產報表寄給你

    架構上,它把一個 Agent 拆成幾塊:

    • Profile / Persona:這個 Agent 是誰、擅長什麼
    • Tools:它能調用哪些工具(API、資料庫、shell、Python 腳本…)
    • Memory / Skills:過去學到的東西、可重複使用的任務流程

    你可以先只開一個最簡單的 Agent,之後慢慢加工具,讓它越來越懂你的工作流,而不用每個新專案都重寫一套 Chain。

    可行動:想像一下,你現在桌面上有哪兩個「常做但不想做」的工作,可以各拆成一個 Agent?寫下名字,後面實作會用得到。

    2. 工具調用:把「你會的事」都變成它的工具箱

    Hermes Agent 支援類似 OpenAI function calling 的工具呼叫模式,但更偏向「長期維護」的設計:

    • 工具用 Python 寫一個函式就行
    • 透過結構化的 schema 告訴模型:這個工具是幹嘛的、要什麼參數
    • Agent 會根據任務,自動決定要不要用工具、用哪個工具、多次串聯

    這代表你可以很快把現有腳本變成工具:

    • 讀 Notion / Confluence / Obsidian 資料
    • 呼叫公司內部 REST API
    • 對 PostgreSQL / MySQL / DuckDB 下查詢
    • 跑你原本就有的 ETL 或報表腳本

    與其每次手動開 terminal 跑腳本,你只要跟 Agent 說:「幫我產出本週銷售報表,照上次格式寄給 A、B、C」,它會用工具補完細節。

    可行動:列出你現有最常用的 1–2 個 Python 腳本/內部 API,等等會示範怎麼把其中一個包裝成 Hermes 的工具。

    3. 記憶與長期學習:越用越像你的專屬助理

    Hermes Agent 的 slogan 是「The agent that grows with you」,核心是記憶與技能抽象:

    • 短期記憶:一次對話內的上下文、工具使用結果
    • 長期記憶:跨對話保存的重點資訊(你常用的資料來源、專案結構、偏好格式)
    • 技能學習:對常見任務的「解題路徑」可以被抽出來,下次直接套用,而不是每次都重新探索

    實際效果是:

    • 第一次要它寫測試,你可能要講得很細
    • 第三次之後,它知道專案架構、測試風格,提示可以短很多
    • 長期下來,它就像專門懂你的專案的「半自動同事」

    💡 關鍵: 同一個 Agent 會隨使用次數累積記憶與技能,提示成本會隨時間明顯下降。

    可行動:想一個你希望 Agent 逐漸學會的任務,例如「幫我維護這個 Side Project」,後面可以把相關 repo、規則慢慢餵給它,形成長期記憶。


    適合誰用?幾個今晚就能跑起來的場景

    1. 個人知識管理:把本地筆記變成可對話的知識庫

    場景:你用 Obsidian/Notion 存了很多筆記,但查資料時還是要開搜尋、翻一堆頁。

    用 Hermes Agent 可以:

    • 做一個 KnowledgeAgent
    • 工具:讀本地 .md 檔、全文檢索、建立向量索引
    • 任務:
    • 「幫我列出這個月我學過的 LLM 評估方法,附連結」
    • 「整理跟 X 專案相關的 meeting notes,產出一頁總結」

    今晚就能做的最小版本:

    • 先不管向量資料庫,只寫一個工具:給定關鍵字,在一個資料夾裡用 grep 或 Python 搜尋文字,回傳找到的段落
    • 讓 Agent 用這個工具找資料 + 組合答案,你得到一個「能全文搜尋你筆記、附整理」的聊天助理

    💡 關鍵: 即使不建向量資料庫,只用全文搜尋工具也能立刻把舊筆記升級成「可對話知識庫」。

    2. 專案協作機器人:懂 repo 結構、會寫測試的小隊友

    場景:你在一個中型 repo 開發功能,最常做的是:

    • 找相關 module
    • 看舊實作怎麼寫
    • 照既有風格補測試

    用 Hermes Agent 可以:

    • 建 DevAgent,給它:
    • 工具:讀檔案、在 repo 內全文搜尋、執行測試、跑 ruff 或 pytest
    • 記憶:專案目錄結構、常用 pattern、測試風格
    • 工作流:
    • 「這個 PR 變更幫我看一遍,列出可能爆的地方」
    • 「幫這個新 function 補上 pytest,照之前我們的 pattern」

    今晚就能做的最小版本:

    • 做一個工具:給檔名 + 行號範圍,回傳該段程式碼
    • 一個工具:在 repo 裡 rg 關鍵字
    • 再用 Hermes Agent 替你「問 repo」,比一般 Code Assistant 更懂上下文(因為記憶可以長期保留)

    3. 定時報表與小型自動化:每天幫你跑例行公事

    場景:你每週要手動:

    • 打 API 拉數據
    • 用 pandas 處理
    • 貼到 Google Sheet 或寄 Slack

    用 Hermes Agent 可以:

    • 做 OpsAgent:
    • 工具:呼叫內部 API、跑處理腳本、寄 email/Slack webhook
    • 任務:
      • 「每天 9 點幫我跑一次報表 A,失敗時 ping 我」

    今晚就能做的最小版本:

    • 先只做一個「手動觸發」的 Agent:
    • 工具:呼叫你現有的報表腳本,回傳路徑或結果
    • 每次要報表時,開 chat 說:「幫我產本週報表」
    • 之後再加排程(crontab / systemd / Airflow 都行)

    怎麼開始:從 clone 到跑起第一個 Agent

    以下以本機開發環境為例(Linux / macOS / WSL 都可)。詳細以官方 Repo 為準:NousResearch/hermes-agent

    步驟一:安裝與啟動最小可用 Agent

    1. Clone 專案

    bash
    git clone https://github.com/NousResearch/hermes-agent.git
    cd hermes-agent

    1. 建立虛擬環境並安裝依賴

    bash
    python -m venv .venv
    source .venv/bin/activate # Windows 改用 .venv\Scripts\activate
    pip install -r requirements.txt

    1. 設定 LLM API Key(先用你有的即可,如 OpenAI / Anthropic / 本地模型)
      新增 .env(或依官方文件的設定方式):

    env
    OPENAI_API_KEY=你的_key

    1. 啟動範例 Agent
      官方通常會附 demo / example,假設有:

    bash
    python examples/simple_agent.py

    終端機應該會出現一個互動提示,你可以直接輸入:

    「幫我總結一下這個資料夾裡 README 的重點」

    可行動:先照 repo README 跑通官方範例,不要一開始就改架構;確定 Agent 能穩定對話後,再進入下一步。

    步驟二:加一個你自己的工具(以讀檔案為例)

    假設你想讓 Agent 讀本地 markdown 筆記,我們新增一個最小工具:

    # tools/read_file.py
    from pydantic import BaseModel
    
    class ReadFileInput(BaseModel):
        path: str
    
    async def read_file_tool(args: ReadFileInput) -> str:
        try:
            with open(args.path, "r", encoding="utf-8") as f:
                return f.read()
        except FileNotFoundError:
            return f"檔案不存在:{args.path}"
    

    再在 Agent 設定裡掛上這個工具(實際寫法依官方 framework 為準):

    from tools.read_file import read_file_tool, ReadFileInput
    
    agent.register_tool(
        name="read_file",
        description="讀取本地文字檔內容,適合用來看筆記或程式碼。",
        func=read_file_tool,
        args_schema=ReadFileInput,
    )
    

    之後你就可以跟 Agent 說:

    「請讀 notes/ai/hermes-agent.md,幫我整理成 5 個 bullet points。」

    可行動:把上面工具改成你需要的腳本,例如呼叫公司 API、或對資料庫下查詢,先做一個,成功後再慢慢擴充。

    步驟三:保存記憶、接內部系統,讓它真正「隨你成長」

    1. 選一個持久化記憶的方式:

    2. 簡單:用 SQLite / 本地檔案存對話摘要與關鍵資料

    3. 進階:用向量資料庫(如 Chroma、Qdrant)存 embedding,讓 Agent 能在舊對話裡 retrieval

    4. 接公司內部 API:

    5. 為每個核心系統做一個工具(get_user_info, get_order_status…)

    6. 在工具描述裡寫清楚用途,讓模型知道何時該用

    7. 版本控制與演進建議:

    8. 把 Agent 設定(persona、工具列表)與「技能腳本」都放進 Git

    9. 每次大改前先開一個 branch,確保舊版 workflow 還能跑
    10. 用 README 記錄:這個 Agent 現在會做哪些事、還有哪些坑

    可行動:先挑一個「你每週一定會做」的任務,為它做一個專門 Agent,並在 README 寫下:

    • 它會用到哪些工具
    • 成功完成任務需要哪些資料
    • 未來想追加哪些能力

    小結:把 Hermes Agent 當成「長期共事的同事」,不要當玩具

    Hermes Agent 的價值,不在於多炫的 Prompt,而在於:

    • 你可以為每個常見任務,做一個專職 Agent
    • 把腳本和內部 API 收進同一個工具箱
    • 用記憶與技能,讓它越來越懂你的工作方式

    從今晚可以做的三件事開始:

    1. clone 專案 + 跑通官方範例
    2. 為一個你已有的 Python 腳本包一個工具
    3. 幫其中一個重複性工作建一個專職 Agent

    只要你願意每週花一點時間「教它」,這個本地部署的 Hermes Agent,會越來越像一個熟悉專案脈絡、能幫你扛瑣事的長期同事。

    🚀 你現在可以做的事

    • 打開 GitHub,clone 下來 NousResearch/hermes-agent,跑通 README 範例
    • 挑一個現有 Python 腳本或內部 API,按照文中範例包成一個 tool
    • 為一個最常做的重複性工作,寫出一個專職 Agent 的 persona 與需要的工具清單
  • 巨頭封鎖中國抄模組:防禦還是反噬創新?

    📌 本文重點

    • 防「抄模型」同時加高巨頭護城河
    • AI 正被納入新冷戰的科技武器庫
    • 指紋與監管合流恐拖慢開源與創新

    OpenAI、Google、Anthropic 聯手防堵「中國抄模組」,表面是在保護智慧財產,實際上也在把 AI 從「全球公用基礎設施」往「陣營技術」推回去。短期這是合理防禦,長期若缺乏國際規則與透明證據標準,將反噬全球開源、生態多樣性與創新速度。


    一、從產業面看:防「抄模型」,同時加高自家護城河

    這次由 OpenAI、Anthropic、Google 主導的合作,名義上是對抗中國團隊對其模型的未授權複製。在技術上,「抄模型」可以是幾種形式:

    • 直接竊取權重、在本地重新部署
    • 拿到權重後做 微調→漂洗,讓來源變得難以追溯
    • 透過 API 大量查詢,訓練「蒸餾模型」模仿行為

    針對前兩者,新一代 模型指紋技術(如論文中的 AttnDiff)正在改變遊戲規則。AttnDiff 強調:即便你對模型做 PPO/DPO 微調、剪枝、模型融合,在注意力行為層面仍然留下可辨識的「內在路由習慣」,可以用極少的提示抽取指紋,相似度高達 0.98。這一套技術配上律師團,會讓「偷拿開源權重、稍微洗一洗就說是自己家模型」的灰色區域急速收縮。

    💡 關鍵: 相似度高達 0.98 的指紋技術,等於讓「洗權重」這條灰色路線幾乎無所遁形。

    從產業權力結構來看,這件事的象徵意義更大:

    1. 閉源巨頭把「可執行的 IP 保護工具」握在自己手上:
    2. 越多雲端服務、SDK 接入這類指紋驗證機制,越容易把「合法模型」與「黑箱來源模型」分出兩個世界。
    3. 被標記為「高風險來源」的模型,可能直接被雲端、應用市場下架。

    4. 開源與中小團隊的風險成本被整包加上去:

    5. 很多創業團隊是基於 Llama、Qwen 等開源模型做二創,未來一旦巨頭主導的指紋與合規框架變成「事實標準」,
    6. 你不只要搞懂授權條款,還得擔心:某天有人說你在「模型溯源」上相似度可疑,要你舉證清白。

    7. API 模式被抬升為「最乾淨的合規路徑」:

    8. 自訓或拿權重自託管,法律與合規責任通通在你身上。
    9. 用巨頭 API,合約寫好「一切合理合法、責任共擔」,反而成為很多公司的風險最小解。

    💡 關鍵: 指紋與溯源一旦成為「事實標準」,會把自訓與自託管變成高風險行為,間接強化「API first」的產業格局。

    這會導致一個微妙結果:「防中國抄模型」的敘事,順便把全球中小玩家更緊地鎖回巨頭雲平台。


    二、從地緣政治看:AI 正在被武器化成新冷戰核心

    同一時間,幾個看似不相關的事件,其實是在同一條線上:

    • 美國五角大樓把 Anthropic 列入國防黑名單,法院目前暫不阻止;理由是「國家安全風險」。
    • 佛州對 OpenAI 啟動刑案調查,把模型風險上升到刑事責任層級。
    • 美國持續收緊對中國的 高階晶片與 EDA 軟體出口管制,再加上台灣國安單位指出,中國正積極挖角台灣半導體人才、技術,企圖繞過封鎖。

    把這些拼起來,你會發現:

    1. AI 公司已經變成「準國安資產」:
    2. 被黑名單的不是小型軍工承包商,而是 主流水平的大型模型公司 Anthropic。
    3. 這訊號非常直接:頂尖模型本身就是戰略武器,政府有正當性以「國安」為理由介入;不只是出口限制,還包括誰可以跟誰合作、誰可以接政府案。

    4. 「保護先進模型不被中國抄走」很快會被寫進出口與制裁框架:

    5. 現在是企業間結盟,下一步就是配合美國商務部、國防部,把「模型指紋+溯源」納入出口管制與制裁證據鏈:
      • 指紋相似度高 → 認定為「源自受管制技術」,限制其進入美國市場或雲端基礎設施。
    6. 結果就是全球 AI 地圖被硬切成:「美國陣營模型」、「中國及其友軍模型」,中間地帶愈來愈窄。

    7. 安全事件會被當成政治工具放大:

    8. 俄羅斯 APT28 利用 1.8–4 萬台路由器做情報攻擊,已經展示了一個現實:網路基礎設施早就是戰場。
    9. 一旦 AI 模型被視為跟路由器、5G、衛星同級的戰略基礎設施,「抄模型」、「中毒攻擊」(如 IoA、FFT 中的模型 poisoning)都很容易被上升為國安事件,順勢合理化更嚴格的技術封鎖。

    💡 關鍵: 當 AI 模型被正式納入國安與出口管制框架,技術競賽就會全面轉化為陣營對抗。

    結果是:AI 不再是全球性一般技術,而是被納入新冷戰的科技武器庫。 技術保護與出口管制不只是保護創新,而是在重畫地緣政治邊界。


    三、從治理與開源生態看:IP、指紋、監管三者合流,可能變成新枷鎖

    防中國「未授權複製」,表面上站在道德高地。但一旦這套框架被寫成政策模板,副作用會很大。

    1. IP 保護 × 模型指紋 × 監管框架,將形成可程式化的「技術邊界」:
    2. 有了 AttnDiff 這類工具,政府可以說:
      • 任何在我國使用的大模型,都必須接受指紋檢測,確保不是來源不明的「抄模組」。
    3. 再把最近關於「微調會激活模型對受版權保護書籍的逐字回憶」研究加進來,

      • 你就可以主張:有能力記憶、回吐受版權保護內容的模型,都是潛在侵權工具,必須強管。
    4. 各國會把「防中國」模板本地化 → 實際上是保護自家國產模型:

    5. 今天是防中國,明天可能變成:
      • 歐盟保護「歐洲數據主權與開源社群」;
      • 印度保護「國產語言模型」;
      • 其他國家則用來打壓外國雲端服務。
    6. 名義上是防抄襲、防監聽、防國安風險,實際上是數位保護主義的新版本。

    7. 學術與開源研究的「默認罪推定」風險升高:

    8. 做模型壓縮、蒸餾、聯邦微調的人,未來很可能遇到:
      • 「請證明你的模型沒有源自受限制權重。」
    9. 而模型 poisoning 研究(像 GRMP 那種高隱蔽攻擊)本來是為了強化安全,但在高度政治化環境中,也可能被解讀為「製造武器」。

    換句話說,防中國抄模型這套論述,極容易被全球各國複製成「我國優先」的技術護城河工具。受影響最大的不是真正的國家級攻擊者,而是缺乏法務與外交資源的研究者與中小型團隊。


    對開發者與使用者的實際建議:活在冷戰化 AI 時代,要怎麼自保?

    在這個「技術保護」與「科技冷戰」交疊的局面裡,如果你是:

    • 模型開發者 / 研究者:
    • 盡可能選擇 授權清晰的開源基礎模型(含商用條款),避免「權重來源說不清」。
    • 為自己的模型建立可公開說明的訓練與微調紀錄,必要時可以對外證明清白。
    • 在做安全研究(如蒸餾、poisoning、fingerprinting)時,保留完整實驗紀錄與倫理聲明,降低未來被政治化解讀的空間。

    • 產品團隊 / 創業者:

    • 商業上若無強烈自訓理由,API first 會是風險最低路徑:把合規責任部分外包給雲端巨頭。
    • 若一定要自訓或自託管模型,預先預算法務與合規成本,不要假設「開源=無風險」。

    • 終端使用者與企業採購方:

    • 在導入 AI 服務時,開始把「模型來源與溯源能力」視為評估項目之一。
    • 避免使用來源不明、無法說清權重責任的「便宜模型」,因為未來的法律與制裁風險可能遠高於你現在省下的成本。

    最後要說清楚的判斷是:OpenAI、Google 聯手防中國抄模組,在當前地緣政治下是完全可預期、也一定會發生的防禦行為;但如果我們任由企業結盟與單邊制裁、出口管制來主導規則,而沒有國際層級的透明證據標準與開放協定,AI 將從「全球基礎設施」退化成「陣營技術」。 那不是某個國家的損失,而是整個創新生態的共同折扣。

    🚀 你現在可以做的事

    • 檢查自己或團隊正在使用的模型來源與授權條款,整理一份可對外說明的「權重與數據來源」文檔
    • 若有自訓或微調模型,開始建立與備份完整的訓練流程與實驗紀錄,必要時可作為溯源證據
    • 針對未來要上的新專案,評估一次「API first vs 自訓 / 自託管」的風險與合規成本,調整技術策略
  • LatentAudit:用殘差幾何盯住 RAG 幻覺

    📌 本文重點

    • 光看檢索分數與事後自評難以即時監控幻覺
    • LatentAudit 直接讀殘差流幾何結構估真實度分數
    • 可在 RAG pipeline 中低延遲加入實時 guardrail

    在實務 RAG 專案裡,光靠「檢索品質 + 事後自評/投票」抓幻覺是不夠的:
    – 檢索成功 ≠ 回答一定忠於證據(模型還是會自由發揮)
    – 自評 / judge 模型會 吃額外 Token 和延遲,流量大時成本爆炸
    – 多輪對話、串接工具後,哪一步開始幻覺常常完全沒監控

    💡 關鍵: 只靠檢索分數和事後評審,既無法即時阻斷幻覺,又會讓延遲與成本大幅增加。

    LatentAudit 提供另一條路:直接讀取生成模型的 殘差流(residual stream)幾何結構,在推理中測量「模型內部狀態」與檢索證據之間的 馬氏距離,做到:

    • 不需要額外 judge 模型
    • sub-millisecond 延遲、可 16-bit 固定點實作
    • 少量標註就能校準成實用的 真實度分數,在 API 層或 UI 層直接觸發 fallback

    重點說明

    1. 為什麼傳統 RAG 監控做不到「實時 + 便宜」

    實務上的典型做法:

    1. 只看檢索分數:例如 cosine 相似度、BM25 分數
    2. 問題:檢索到對的文獻,但模型回答的細節錯了(over-generalize, mis-attribute)完全抓不到。

    3. 事後自評 / 多模型投票:

    4. 用 judge LLM 問「這個回答是否根據檢索到的內容?」
    5. 或讓多個模型生成,再投票 / 聚合。
    6. 問題:

      • 推理路徑變成:檢索 → 回答 → 評審,延遲翻倍以上
      • 成本和吞吐量吃不消,很難在大規模 production 開啟
      • judge 模型本身也會幻覺,還得再校準
    7. log 後離線分析:

    8. 用人審 / labeling 分析錯誤 pattern
    9. 問題:無法 實時阻斷 危險輸出(醫療/法律/金融)

    LatentAudit 直接把監控塞進 生成時的 forward pass:

    • 白盒讀取中後段 殘差流 activation
    • 與「證據 representation」做幾何對齊度測量
    • 即時計算 距離 → 真實度分數 → 決策(放行 / fallback)

    💡 關鍵: 把監控邏輯塞進 forward pass,能在幾乎零額外延遲下拿到可用的真實度分數。

    2. LatentAudit 的核心做法(殘差幾何 + 馬氏距離)

    架構概念:

    1. 選定幾層殘差流:例如 Llama-3-8B 的 layer 20–30 殘差向量 ( h_l )

    2. 建一個 evidence representation ( e ):

    3. 通常來自:

      • 把所有檢索到的 passages 拼在一起,取 encoder / 第一層 decoder 的 CLS / BOS 向量
      • 或平均檢索 chunks 的 embedding
    4. 在訓練(校準)階段:

    5. 收集 (question, evidence, answer) 三元組,並有「忠於證據 / 不忠」標註
    6. 對每個樣本取出中後段殘差流,做 pooling(例如平均或拼接):

      [
      z = P(h_{l_1}, …, h_{l_k})
      ]

    7. 在 latent 空間中估計「忠實」分佈的均值 ( \mu ) 和協方差 ( \Sigma )

    8. 定義馬氏距離規則:

    9. 把 residual 表示 ( z ) 投影到 evidence 表示空間,或做簡單線性對齊,最後計算

      [
      d_M(z, e) = (z – W e – b)^T \Sigma^{-1} (z – W e – b)
      ]

    10. 這就是 LatentAudit 的核心:一條二次判別規則(不需要深 judge 模型)

    11. 校準成真實度分數:

    12. 用 held-out 集合做 threshold / logistic calibration,得到:

      [
      s_{faith} = \sigma(\alpha \cdot d_M(z,e) + \beta)
      ]

    13. ( s_{faith} ) 越接近 1 表示越「有可能忠於證據」。

    因為只做矩陣乘、向量內積和少量逆協方差運算,
    可以用 16-bit fixed point 實作,延遲在 0.x ms 級別,可進一步配合 Groth16 做可驗證計算(不展開細節)。

    💡 關鍵: 使用 16-bit 固定點與馬氏距離,使得真實度評估可以在 sub-millisecond 延遲下完成。


    如何嵌入既有 RAG pipeline

    你需要:
    – 可白盒存取的模型(Llama、Qwen、Mistral 等開源或自託管)
    – 在 forward 裡 hook activation,並在生成過程中同步喂入 evidence 表示

    常見 stack:

    • OpenAI compatible API(自託管 vLLM / Ollama 上掛開源模型)
    • 各種向量庫(PGVector、Milvus、Weaviate、Qdrant、Elastic,…)

    典型 pipeline:

    1. user query → 檢索(向量庫) → 構造 prompt + evidence
    2. 呼叫 自託管模型(非黑盒雲 API)生成
    3. 在生成中,LatentAudit 模塊監控殘差流 → 算馬氏距離 → 輸出真實度分數
    4. API 返回:{ answer, faithfulness_score }
    5. 前端 / Orchestrator 根據 score 做 fallback 策略。

    實作範例

    以下以 vLLM + Llama3 自託管為例,展示核心落地點(偽碼 + Python 範例)。

    1. 在 HF 模型上 hook 殘差層

    from transformers import AutoModelForCausalLM, AutoTokenizer
    import torch
    
    MODEL_NAME = "meta-llama/Meta-Llama-3-8B-Instruct"
    model = AutoModelForCausalLM.from_pretrained(
        MODEL_NAME, torch_dtype=torch.bfloat16, device_map="auto"
    )
    tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
    
    TARGET_LAYERS = [20, 24, 28]
    residual_acts = []
    
    
    def make_hook(layer_idx):
        def hook(module, input, output):
            # input[0] 通常是 residual stream
            # 只取最後一個 token 的向量,減少開銷
            h = input[0][:, -1, :].detach().to(torch.float32)
            residual_acts.append((layer_idx, h))
        return hook
    
    
    for idx, blk in enumerate(model.model.layers):
        if idx in TARGET_LAYERS:
            blk.register_forward_hook(make_hook(idx))
    

    2. 建立 evidence representation

    假設你已經從向量庫拿到 top-k passages:

    def build_evidence_rep(passages: list[str]):
        text = "\n".join(passages)[:4096]  # 避免太長
        inputs = tokenizer(text, return_tensors="pt").to(model.device)
        with torch.no_grad():
            out = model.model(**inputs, output_hidden_states=True)
        # 用最後一層 hidden state 的 BOS / 第一 token 表示
        e = out.hidden_states[-1][:, 0, :].detach().to(torch.float32)
        return e  # shape: [1, d]
    

    3. 馬氏距離計算 + 校準

    事前你要離線擬合:
    – W、b、Σ^{-1}、α、β(可用 sklearn 或手寫)

    線上部分簡化為:

    # 假設以下參數已離線訓練好並載入
    W = torch.load("wa_projection.pt")         # [d_residual, d_e]
    b = torch.load("wa_bias.pt")              # [d_residual]
    Sigma_inv = torch.load("wa_sigma_inv.pt")  # [d_residual, d_residual]
    alpha, beta = torch.load("wa_logistic.pt")
    
    
    def latent_audit_score(evidence_vec, residual_acts):
        # pooling residual: 取指定層平均
        hs = [h for idx, h in residual_acts if idx in TARGET_LAYERS]
        H = torch.stack(hs, dim=1).mean(dim=1)  # [1, d_residual]
    
        # 對 evidence 做線性對齊
        e_proj = (evidence_vec @ W.T) + b  # [1, d_residual]
    
        diff = (H - e_proj)  # [1, d_residual]
        # 馬氏距離
        d_M = (diff @ Sigma_inv @ diff.transpose(0,1))[0,0]
    
        # logistic 校準成 [0,1]
        score = torch.sigmoid(alpha * d_M + beta).item()
        return score
    

    生成時流程:

    def rag_answer_with_faith(query, passages):
        residual_acts.clear()
    
        evidence_vec = build_evidence_rep(passages)  # [1,d]
    
        prompt = build_rag_prompt(query, passages)  # 你的 RAG prompt 模板
        inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    
        with torch.no_grad():
            out = model.generate(
                **inputs,
                max_new_tokens=256,
                do_sample=False,
            )
    
        answer = tokenizer.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
        score = latent_audit_score(evidence_vec, residual_acts)
    
        return {
            "answer": answer,
            "faithfulness_score": score,
        }
    

    這邊只在 一次 forward + generate 裡多做幾個矩陣運算,延遲增量極小;你可以把結果包成 OpenAI 兼容 API 回傳:

    {
      "id": "chatcmpl-...",
      "object": "chat.completion",
      "choices": [
        {
          "message": {
            "role": "assistant",
            "content": "...",
            "faithfulness_score": 0.82
          }
        }
      ]
    }
    

    前端或 Orchestrator 可以直接讀 faithfulness_score 做決策。

    💡 關鍵: 直接在 API 回傳中加入 faithfulness_score,可讓前端與協調層即時採用不同的 fallback 策略。

    4. Fallback 策略示例(醫療 / 法律 / 客服)

    簡單策略:

    THRESHOLD_WARN = 0.7
    THRESHOLD_BLOCK = 0.4
    
    
    def route_by_faithfulness(result):
        s = result["faithfulness_score"]
    
        if s < THRESHOLD_BLOCK:
            # 高風險:重新檢索 + 明確要求引用 evidence,或升級人工
            return {
                "mode": "escalate",
                "message": "本次回答可信度較低,已轉交人工處理。",
            }
        elif s < THRESHOLD_WARN:
            # 中風險:要求模型引用更多 evidence / 提示使用者核對
            return {
                "mode": "warn",
                "message": "以下回答可能不完全可靠,請以實際條文/文獻為準。",
            }
        else:
            # 正常放行
            return {
                "mode": "ok",
                "message": "",
            }
    

    實際場景:

    • 醫療問答:mode == "escalate" 時強制顯示「非醫療建議」,並把 case 丟進人工客服隊列
    • 法律諮詢:mode == "warn" 模式時要求模型 列出具體條文/條號 並顯示原文片段
    • 客服查詢:低分時先做 重新檢索(不同索引 or 更寬鬆 query) 再生成一次,若仍低分再轉人工

    多模型 / 多輪對話:
    – 對每輪回答都算一個 faithfulness_score,記錄在對話 state
    – 對 工具返回 / 多模型投票輸出 也可以跑 LatentAudit,看哪個候選與 evidence 更對齊,再做投票加權


    建議與注意事項

    1. 必須白盒存取模型

    • 無法在 OpenAI / Anthropic 純雲端黑盒模型上做(拿不到殘差流)
    • 適合:
    • 自託管 Llama / Qwen / Mistral 等
    • Ollama / vLLM,但要在本地 wrap core HF 模型 做 hook,而不是只用遠端 HTTP

    2. 殘差層選擇與標準化影響很大

    • 中後段層(例如 60–80% depth)通常信號最好
    • 建議在校準時網格搜尋:
    • 選幾組 layer subset + pooling 策略(最後 token / mean / concat)
    • 對每組分別訓練 W、Σ^{-1},選 AUROC / AUPRC 最佳
    • 標準化:
    • 建議對 residual 做 per-dimension z-score 或 whitening,有助於 Σ^{-1} 穩定

    3. 校準集的 domain mismatch 是大坑

    • 如果你用 PubMedQA 上的校準結果直接套到法律問答,誤報 / 漏報會很嚴重
    • 建議:
    • 至少針對你的業務 domain 收集 數百到數千個標註樣本
    • type 要包含:
      • 正確且完全有證據支撐
      • 幻覺 / 瞎掰
      • 部分支持(evidence 裡只有一半說法)

    4. 隱私與合規下收集校準資料

    • 若資料有 PHI / PII:
    • 在內網做標註與訓練,不要把 prompt / evidence / answer 傳出公司
    • 可以只存 殘差向量 + 二元標籤,丟棄原文內容,以降低隱私風險
    • 若需要對外可驗證(尤其在金融 / 公共服務):
    • 考慮用論文中的 16-bit fixed-point 實作 + Groth16,在不洩漏權重/activation 的前提下提供「監控邏輯正確執行」的證明

    5. 與現有評估/監控系統的整合

    • LatentAudit 不是 用來取代離線評估(BLEU, Rouge, factuality benchmark),而是:
    • 補上一層 以模型「內在狀態」為基準的實時 guardrail
    • 建議實務策略:
    • 離線:用 benchmark / 人工評估確認 RAG pipeline 基本可靠
    • 線上:啟用 LatentAudit,只作「低分拋錯/告警」,不要一開始就用來做 aggressive block
    • 每隔一段時間(例如每週)抽樣「被 block / warn 的案例」做人工 review,調整 threshold / 校準

    對你的專案的實際好處:
    – 在不引入第二個 LLM 的前提下,把幻覺監控塞進現有 RAG 路徑,几乎不加延遲
    – 增加一個 可量化、可調整的真實度分數,方便 API / UI / workflow 做自動化 fallback
    – 線上問題不再只有「出事後看 log」,而是可以 即時標記高風險回答,甚至直接攔截,特別適合醫療、法律、金融、客服等高風險場景。


    🚀 你現在可以做的事

    • 在現有自託管 Llama / Qwen / Mistral 專案中,加上殘差層 hook 並輸出簡單的 faithfulness_score
    • 針對你的業務 domain 收集一批「忠於證據 / 幻覺 / 部分支持」標註樣本,用來擬合 W、Σ^{-1} 與校準參數
    • 在 API 回傳中加入 faithfulness_score,並在前端或 Orchestrator 中實作最簡版本的 warn / block / escalate 策略
  • 用 W-RAC 讓你的 RAG 省錢又好查

    📌 本文重點

    • W-RAC 目標是在不犧牲 RAG 效果下大幅壓低 chunking 成本
    • 先把網頁拆成可定址的小單元,再用 LLM 只做「分組決策」
    • 保留結構化資訊有助於 debug、調優與控制向量庫容量

    一件事先講清楚:W-RAC 的目的,就是在不犧牲 RAG 效果的前提下,把「為了 chunking 花給 LLM 的錢」砍到最低。

    參考論文:Web Retrieval-Aware Chunking (W-RAC)


    為什麼你現在的 chunking 很可能在燒錢

    多數團隊做 RAG,會遇到幾個典型做法:

    • 固定長度切分(例如 500 tokens 一刀)
    • rule-based(照標題、段落、HTML tag 切)
    • 直接丟給 LLM「幫我分合理的 chunk」

    這幾種方法的共通問題:

    1. 重複內容被 embed 很多次
      尤其是網頁側邊欄、導覽列、footer,幾乎每個 chunk 都有一份。

    2. LLM 成本被當 tokenizer 用
      用 LLM 來重寫、分段、產生摘要,等於把整個網站內容吃一遍,token 直接爆掉。

    3. 不好 debug
      一個查詢跑出來一堆 chunk,很難追:

    4. 這個 chunk 為什麼被這樣切?
    5. 是哪個頁面、哪個段落?

    W-RAC 的核心想法:先把網頁拆成結構化「可標號的小單元」,LLM 只負責決定「哪些單元湊成一個 chunk」,完全不改寫原文。

    這樣可以:

    • LLM 只看「結構化 outline + 短內容片段」,token 使用大幅下降
    • chunk 是由原始小單元組合而成,可追蹤來源、可重建原文
    • 重複小單元只存一次,減少向量庫容量

    💡 關鍵: 先抽取可定址小單元,再用 LLM 只做分組規劃,可以在保留 RAG 效果的前提下,把 chunking 相關的 LLM token 成本壓到最低。


    核心功能:W-RAC 在做什麼?

    1. 把網頁拆成「可定址單元」

    具體做法:

    1. 用瀏覽器自動化抓頁面(例如 Playwright)
    2. 保留 DOM 結構,轉成一棵樹:
    3. 節點:標題、段落、表格列、列表項目等
    4. 每個節點給一個 ID(例如 page_123.h2_3.p_2)
    5. 把每個節點變成一個「原子單元」,包含:
    6. id
    7. tag(h1/h2/p/li/td…)
    8. text(文字內容)
    9. path(在頁面中的位置)

    你可以實作的步驟:

    pip install playwright beautifulsoup4
    playwright install
    

    用 Playwright 拉 HTML,再用 BeautifulSoup 做 DOM 清洗、節點提取,最後存成 JSON:

    {
      "id": "page_123.h2_3.p_2",
      "tag": "p",
      "path": ["body", "main", "section[2]", "h2", "p[2]"],
      "text": "本方案適用於企業內部知識庫..."
    }
    

    行動:先做「乾淨的節點抽取」,還不要想 embedding 和 LLM,確保每個網頁能拆成穩定、可追蹤的小單元。


    2. 用 LLM 做「分組決策」,而不是改寫文本

    傳統 agent 會:把整頁文字丟進 LLM,請它「改寫 + 切 chunk」。

    W-RAC 則是:

    1. 給 LLM 的不是全文,而是「節點清單 + 結構資訊」:
    2. 節點 ID
    3. 簡短前幾個字(preview)
    4. tag / 標題層級
    5. 要 LLM 回傳的,只是ID 分組規劃,例如:
    [
      {"chunk_id": 1, "node_ids": ["...h2_1", "...h2_1.p_1", "...h2_1.ul_1"]},
      {"chunk_id": 2, "node_ids": ["...h2_2", "...h2_2.p_1"]}
    ]
    

    範例提示詞(可直接改用自己的模型):

    你是一個文件分組器。給你一個網頁節點清單,每個節點有:id、tag、text_preview、heading_level。
    
    目標:
    - 將相關的節點分成多個 chunk
    - 每個 chunk 內容長度約 300–800 字
    - 優先讓同一個小節(同一個 h2/h3 底下)的節點在同一個 chunk
    
    輸出格式:只回傳 JSON 陣列,每個元素包含:
    - chunk_id:整數
    - node_ids:字串陣列
    
    不要產生任何說明文字。
    

    接下來你在程式裡做:

    • 根據 node_ids 把原子單元的 text 串起來
    • 生成真正要 embed 的 chunk 文本

    行動:選一個便宜的小模型(例如本地 LLM 或雲端小模型),先在 1–2 個頁面上跑一輪「ID 分組」,確認輸出格式與 chunk 長度合理,再批次上線。


    3. 保留結構化資訊,提升可觀測性與調優效率

    因為每個 chunk 只是「小單元的組合」:

    • 每個 chunk 知道自己由哪些 node_id 組成
    • 每個 node_id 可以反查 DOM path → 原頁面位置

    你可以做到:

    • 查詢輸出時,在後台顯示:
    • chunk 來源頁面 URL
    • 對應的標題、段落位置
    • 線上觀察「常被命中的 chunk」長什麼樣,是否太長或太短

    簡單的監控策略:

    1. 在 RAG pipeline 中記錄:query / 命中 chunk_id / 來源 page_id
    2. 定期統計:
    3. 哪些頁面 chunk 命中率高但回答不精準 → 調整該頁 chunk 最大長度
    4. 某些 tag(例如 table)被切得太散 → 調整「表格應視為一組」的規則

    行動:把 node_id 和 chunk_id 一起寫入向量庫的 metadata,之後才能在 dashboard 上做查詢與可視化。


    適合誰用:三個典型場景

    1. 公司知識庫 / 文件中心

    情境:

    • 你有 Confluence、Notion、GitBook 或自建 docs 站
    • 想做內部問答助手,但頁面一多,embedding 成本驚人

    W-RAC 的落地方式:

    1. 用 Playwright 把內部 docs 網站轉成 HTML
    2. 用 BeautifulSoup 抓出 h1–h3、段落、列表,做節點抽取
    3. 用小模型做 chunk 分組
    4. 把完成的 chunk 丟進現有向量庫(如 OpenSearch、PGVector、Weaviate)

    效果:

    • 導覽列、側邊欄只存一次,不會每個 chunk 重複
    • 每個問題能對應到具體章節,方便文件 owner 微調內容

    💡 關鍵: 對於大量公司文件,W-RAC 可以避免重複 embed 導覽與樣板內容,顯著降低向量儲存與 embedding 成本。

    2. 官網 FAQ / 產品說明頁

    情境:

    • 產品 FAQ 分散在多個頁面、Accordion、tab 裡
    • 用固定長度切,很容易一個 chunk 內混到不同問題

    W-RAC 做法:

    • 把每個 Q/A 區塊視為一個原子單元
    • LLM 分組時以「一問一答」為最小單位

    好處:

    • 用戶問「退款怎麼算?」時,命中的 chunk 幾乎就是整個退款 FAQ,不會混到完全不相干的條款

    3. 大量公開網頁做 RAG(爬站型應用)

    情境:

    • 你在做垂直搜尋 / 行業資料聚合
    • 動輒幾十萬頁 HTML,要控制成本

    W-RAC 的優點在這裡會放大:

    • LLM 只負責分組計畫,成本可比「全 LLM 分 chunk」少一個數量級(論文的主張)
    • 分組邏輯可重跑:
    • 想換 chunk 長度,只要重新跑 LLM 分組,不必重新爬網

    行動:挑一個實際場景(知識庫、FAQ、或爬站),先對 50–100 個頁面做 W-RAC pipeline,算出:LLM token vs 傳統做法的差異,作為是否全面導入的依據。


    怎麼開始:從技術棧到實作指引

    建議技術棧

    類別 推薦選項 備註
    抓網頁 Playwright / Puppeteer Playwright 對登入、動態頁面支援較好
    HTML 解析 BeautifulSoup / lxml 把 DOM 轉成節點樹、抽取文字與 tag
    分組 LLM 任一小模型(如本地 Qwen/LLama) 只做規劃決策,不改寫文本,成本壓得很低
    向量庫 PGVector / Qdrant / Weaviate 支援 metadata 查詢較重要,以便 debug
    嵌入模型 開源 embedding 或雲端 embedding 固定長度輸入即可,和 W-RAC 本身無強耦合

    行動:先決定你現有的向量庫與 embedding 方案,再把「抓網頁 + W-RAC 分組」當作前處理模組接進去。


    最快上手路徑(簡化版流程)

    1. 抓一頁 HTML
    2. 用 Playwright:

    “`python
    from playwright.sync_api import sync_playwright

    with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto(“https://your-site.com/faq”)
    html = page.content()
    browser.close()
    “`

    1. 用 BeautifulSoup 拆節點
    2. 把 h1–h3、p、li、table row 都變成節點
    3. 幫每個節點生成 id 與 path

    4. 呼叫 LLM 做分組

    5. 使用前面提供的提示詞
    6. 控制每次輸入的節點數量(例如 100–200 個),避免 context 太大

    7. 依照 node_id 組 chunk

    8. 按分組結果串 text,加入 metadata(node_ids、page_url)

    9. 寫入向量庫 + 接到現有 RAG

    10. 查詢時流程不變,只是每個 chunk 背後多了完整來源資訊

    線上觀察 chunk 品質與調優策略

    觀察重點:

    1. 回答不準時,回頭看 chunk:
    2. 是否同一個 chunk 裡混了太多主題?
    3. 是否重要上下文被切開?
    4. 調整策略:
    5. 提示詞裡明確告訴 LLM:
      • 表格應盡量保持在同一 chunk
      • 同一個 h2 底下不要分太多 chunk
    6. 調整每個 chunk 的目標字數(例如從 800 改成 500)

    行動:在你的 RAG 後台加一個「檢視來源 chunk」按鈕,點下去就顯示該 chunk 的 node 列表與原頁面位置,方便你和 PM / 內容 owner 一起 review。


    小結:把 LLM 用在刀口上

    W-RAC 的重點不是多厲害,而是很務實:

    • LLM 只做「分組規劃」這種高價值決策
    • 文本本身盡量保持原樣,避免幻覺與重寫成本
    • 一旦你有了「結構化可定址單元」,後面調優都變簡單

    如果你正在為 RAG 成本與效果卡關,先不要換模型,先把 chunking 換成類似 W-RAC 的流程,很可能就能省下一大筆 embedding/LLM 費用,還順便讓系統更好 debug。

    🚀 你現在可以做的事

    • 選一個實際頁面,用 Playwright + BeautifulSoup 做出「乾淨節點抽取」JSON
    • 用一個便宜的小模型,照文中提示詞跑一輪「ID 分組」,實際組出 chunk 並寫入向量庫
    • 在你的 RAG 後台加上 chunk_id / node_id 的 metadata 顯示與檢視來源 chunk 按鈕,開始觀察與調整 chunk 策略
  • Compiled AI:把提示變成可審計工作流

    📌 本文重點

    • 用 LLM 在編譯階段產生狹義程式碼,執行期不再依賴 LLM
    • 業務邏輯可測試、可審計,安全面積與成本大幅下降
    • 特別適合高要求、高流量且規則穩定的企業級工作流

    在多數專案裡,我們會每個請求都叫一次模型,把非結構化的 prompt 丟給 LLM,期待它「大致照規則」行事。問題是:結果不穩、難回溯、成本高,還容易被 prompt injection 玩壞。Compiled AI 要解的是這個痛點:

    把原本寫在 prompt 里的業務邏輯,在編譯階段用 LLM 產生狹義程式碼,透過型別檢查、靜態分析與測試驗收,一旦通過就當成普通程式部署,執行期不再依賴 LLM。

    對開發者的直接好處:

    • 結果可預測且可審計:輸出由 deterministic code 決定,不是每次抽樣
    • 安全面縮小:執行期不再接受任意自然語言指令
    • 成本與延遲大幅下降:大量交易共用同一份已編譯邏輯,token 成本被攤薄

    💡 關鍵: Compiled AI 把「每次都叫 LLM」改成「先編譯一次,再重複執行」,大幅提升穩定性並攤平成本。


    重點說明

    1. 架構:LLM 只在「編譯階段」出現

    典型 Compiled AI 架構可以拆成三層:

    1. 模板/SDK 層(受控框架)
    2. 你先定義好已驗證的 workflow 模板與 SDK,例如:HTTP 呼叫、DB 查詢、RAG 檢索、權限檢查等
    3. LLM 只能在模板內部空洞生成狹義業務邏輯函式,例如 select_customer_segment()、build_rag_query()

    4. 編譯管線(有 LLM)

    5. Step 1 – Prompt 設計:描述任務、提供 API 規格 & 範例,要求輸出符合特定語言/框架(如 TypeScript + 自家 SDK)
    6. Step 2 – 產生 code artifact:LLM 產生一份或多份候選程式碼
    7. Step 3 – 謝與測試:型別檢查、靜態分析、單元測試/合約測試,不過關就自動 loop 回 LLM 要求修正
    8. Step 4 – 人工審核 + 簽章(視風險):例如醫療或金流流程

    9. 執行期(無 LLM)

    10. 線上請求只執行已編譯出的 code artifact,全程 deterministic,可以完整 log & replay

    核心概念:限制 LLM 的自由度,換取可測試、可版本控管的業務邏輯程式碼。


    2. 工作流設計:把一個傳統 RAG / Agent 重構成 Compiled AI

    以一個典型 RAG QA 流程為例:

    使用者問問題 → LLM 根據 prompt 決定如何搜尋 → 呼叫向量庫 → LLM 基於檢索結果生成答案

    在傳統設計中,LLM 負責檢索策略 + 答案生成,兩段都高度隨機。重構成 Compiled AI,可以這樣拆:

    1. 編譯階段
    2. 用 LLM 生成一個狹義函式:build_search_plan(question: string) => SearchPlan,被嵌在已驗證的 RAG 模板中
    3. SearchPlan 僅包含:要查哪個 index、使用哪些 filter、topK、是否需要 fallback 等
    4. 再用 LLM 生成:synthesize_answer(question, contexts) => string,但這個函式需遵守強約束(例如:不可編造、必須引用 context id)

    5. 執行階段

    6. 每次 QA 時:
      • 用 deterministic code 呼叫 build_search_plan() → 打 DB / 向量庫
      • 把檢索到的 contexts 丟給 synthesize_answer()(也是普通函式)
    7. 整個過程再也不直接丟自然語言給 LLM,所有 decision path 都是可測試、可覆盤的程式碼

    8. 版本控管與灰度發布

    9. 每次重新編譯:產出新版本如 rag_workflow_v3.ts
    10. 用 Git tag & CI pipeline 把版本與測試報告綁在一起
    11. 線上:用 routing 或 feature flag 灰度流量,對比 v2 / v3 的成功率、平均延遲、查詢成本

    3. 工程實務:與「每請求叫一次模型」的差異

    基於現有研究與業界實測,Compiled AI 在幾個維度的典型差異:

    • 可靠性(確定性 vs 隨機)
    • 傳統:每次請求都用 sampling(temperature > 0),同一輸入結果可能不同
    • Compiled AI:執行期只跑 deterministic code + DB/RAG,相同輸入必然同樣輸出

    • 安全

    • 傳統:使用者輸入直接進 prompt,prompt injection 面積很大
    • Compiled AI:執行期輸入只餵進已定義的函式參數(string / enum / id 等),無法直接改變控制流

    • 成本與延遲

    • 編譯階段比較貴,但只做一次,之後可在大量請求上攤平
    • 實務上常見:十幾次交易後就開始比傳統架構便宜,長期 token 使用量可降數十倍

    💡 關鍵: 只要請求次數夠多,執行期省下的 token 成本與延遲,會很快抵消一次性的編譯開銷。


    實作範例

    以下用 TypeScript + 假想 SDK 示範一個簡化版 pipeline。

    1. 已驗證模板/SDK

    // sdk.ts - 由你維護的安全 SDK
    
    export type SearchPlan = {
      index: 'faq' | 'policy' | 'logs';
      topK: number;
      filters?: Record<string, string>;
    };
    
    export async function runRagWorkflow(
      question: string,
      buildSearchPlan: (q: string) => SearchPlan,
      synthesizeAnswer: (q: string, ctxs: string[]) => string
    ): Promise<string> {
      const plan = buildSearchPlan(question);
      const contexts = await vectorSearch(plan.index, question, plan.topK, plan.filters);
      return synthesizeAnswer(question, contexts);
    }
    
    async function vectorSearch(
      index: string,
      query: string,
      topK: number,
      filters?: Record<string, string>
    ): Promise<string[]> {
      // 已驗證的檢索實作
      /* ... */
      return [];
    }
    

    2. LLM 產生的狹義業務邏輯(編譯產物)

    在編譯階段,你用一個 prompt 要求模型只實作兩個函式:

    // generated_v3.ts - 由 LLM 產生,但要通過型別檢查與測試
    
    import { SearchPlan } from './sdk';
    
    export function buildSearchPlan(question: string): SearchPlan {
      const q = question.toLowerCase();
    
      if (q.includes('退款') || q.includes('billing') || q.includes('invoice')) {
        return { index: 'policy', topK: 5, filters: { category: 'refund' } };
      }
    
      if (q.includes('錯誤') || q.includes('error code')) {
        return { index: 'logs', topK: 10 };
      }
    
      return { index: 'faq', topK: 8 };
    }
    
    export function synthesizeAnswer(question: string, contexts: string[]): string {
      // 嚴格規定:
      // 1. 不得回答與 contexts 無關內容
      // 2. 必須在文末列出引用的 context 索引
      const summary = summarizeWithRules(question, contexts); // 你事先實作好的工具
      const citations = contexts
        .map((_, i) => `[#${i + 1}]`)
        .join(' ');
    
      return `${summary}\n\n引用來源:${citations}`;
    }
    

    3. 編譯 pipeline(CI 裡跑)

    // compile.ts - 只在 CI / 開發環境執行
    
    import { z } from 'zod';
    import { callLLM } from './llm_client';
    import { execSync } from 'child_process';
    
    const schema = z.object({
      code: z.string(),
    });
    
    async function generateCode() {
      const prompt = `
    你是一個 TypeScript AI,請只輸出一個檔案內容,實作:
    - export function buildSearchPlan(question: string): SearchPlan
    - export function synthesizeAnswer(question: string, contexts: string[]): string
    
    必須符合已存在的型別定義:
    - SearchPlan { index: 'faq' | 'policy' | 'logs'; topK: number; filters?: Record<string, string> }
    
    禁止:
    - 呼叫任何未在註解中允許的函式
    - 使用 eval / new Function
    - 動態匯入
      `;
    
      const raw = await callLLM({
        model: '**gpt-4.1**',
        temperature: 0,
        response_format: { type: 'json_schema', schema },
        messages: [{ role: 'user', content: prompt }],
      });
    
      const { code } = schema.parse(JSON.parse(raw));
      return code;
    }
    
    async function main() {
      const code = await generateCode();
      require('fs').writeFileSync('generated_v3.ts', code, 'utf8');
    
      // 1) 型別檢查
      execSync('npx tsc --noEmit', { stdio: 'inherit' });
    
      // 2) 靜態分析
      execSync('npx eslint generated_v3.ts', { stdio: 'inherit' });
    
      // 3) 測試
      execSync('npm test -- generated_v3.test.ts', { stdio: 'inherit' });
    }
    
    main().catch((err) => {
      console.error(err);
      process.exit(1);
    });
    

    搭配 CI/CD:

    • CI:觸發 compile.ts → 產出 generated_v3.ts → 跑測試 → 產出報表
    • CD:若通過,打 tag rag_workflow_v3,並更新配置讓 5% 流量導到 v3;監控成功率、latency、成本指標再逐步擴大

    💡 關鍵: 把 LLM 產物納入 CI/CD(型別檢查、靜態分析、測試與灰度發佈),就能像管理普通程式碼一樣管理 AI 邏輯。


    建議與注意事項

    1. 業務規則變更頻率

    Compiled AI 適合:

    • 規則相對穩定、但正確性要求高的流程(客服 QA、金融函數呼叫、醫療文件處理)

    不適合:

    • 每天都在改規則、或依賴即時實驗的場景,因為每次改都要走「重新編譯 + 測試」流程
    • 高度探索型、open-ended 任務(創作、策略 brainstorm、UX 研究等)

    實務建議:

    • 把流程拆成兩層:核心決策邏輯用 Compiled AI,外層的探索與創意仍然用即時 LLM

    2. 測試覆蓋不足 = 把錯誤「編進系統」

    Compiled AI 的風險是:一旦編譯出的邏輯有 bug,它會一直穩定地錯。

    必做:

    • 為生成函式設計合約測試:同一輸入 → 必須產出指定的 SearchPlan / 函式呼叫序列
    • 對關鍵場景建立 golden QA 測試集,每次編譯都跑完整 regression
    • 對模型產物加上防呆檢查(如:topK 不可大於 50,index 只能是白名單)

    3. 安全與最小權限

    • 模板 / SDK 層要實施 最小權限:
    • 不給生成函式直接打 DB 連線,只能呼叫封裝好的 queryCustomerById(id) 等高階 API
    • 不允許檔案寫入、外網 request 等敏感操作
    • 透過靜態分析檢查:是否有 eval、動態 import、直接執行 shell 等 pattern

    4. 成本模型與「何時值得編譯」

    可以用簡單估算:

    • 編譯一次成本:C_compile(幾萬 token)
    • 傳統架構每次請求成本:C_online
    • Compiled AI 每次請求成本:C_compiled(通常 ≪ C_online)

    只要請求數 N 滿足:

    C_compile + N * C_compiled < N * C_online

    就值得改成 Compiled AI。研究與實務常見:十幾到幾十次請求後就開始回本,高流量業務會很划算。

    5. 與現有專案整合的落地步驟

    1. 先挑一個穩定且高流量的子流程(例如:FAQ RAG 檢索策略、金融 function calling 的參數整理)
    2. 為它抽象出一個窄介面函式(例如 buildSearchPlan、prepareFunctionCallParams)
    3. 建立 minimal 的編譯 pipeline(LLM → 生成 code → tsc + 測試)
    4. 先 offline 對比:新老流程在測試集上的正確率 / 成本
    5. 小流量灰度上線,配合 metrics 監控,逐步拓展到更多流程

    結論:Compiled AI 的核心不是「用 LLM 寫程式」,而是把 prompt 中模糊的規則,轉成可測試、可簽章、可審計的程式碼工件。對需要穩定性、安全與成本控制的企業工作流,特別是 RAG、function calling、金融與醫療場景,是非常值得實驗的架構升級方向。

    🚀 你現在可以做的事

    • 在現有系統中挑一段高流量、規則穩定的 RAG 或 function calling 流程,先抽象出一個窄介面函式如 buildSearchPlan
    • 建一個最小可行的編譯 pipeline:用 LLM 產生 TypeScript 函式 → 跑 tsc + 單元/合約測試 → 輸出 generated_v1.ts
    • 用 feature flag 灰度導入新流程,監控正確率、延遲與 token 成本,評估轉為 Compiled AI 的回本點
  • MemFactory:把記憶型 Agent 變成一行模組

    📌 本文重點

    • MemFactory 把記憶變成可插拔、可訓練的模組
    • 用 GRPO 讓 Agent 自己學會記什麼、忘什麼與怎麼用
    • 可直接套用 Memory-R1/RMM/MemAgent 等 SOTA 架構

    用一句話說:MemFactory 讓你不用自己手刻記憶策略,就能把「會自己學會記什麼、忘什麼」的記憶 Agent 套進現有 LLM。

    原文論文:[MemFactory: Unified Inference & Training Framework for Agent Memory]


    為什麼你現在的 Agent 記憶,其實很「陽春」?

    大多數現在線上跑的客服 Bot、Copilot、助理,所謂「長期記憶」其實就是:

    1. 把歷史對話丟進 embedding
    2. 存進向量資料庫
    3. 每次問問題時相似度檢索幾條,塞回 prompt

    問題在於:

    • 哪一句要寫進記憶?(重要資訊 vs. 嘮嗑)
    • 什麼時候要更新?(舊偏好 vs. 新偏好)
    • 什麼時候該忘?(過期任務、已完成專案)
    • 檢索時要抓什麼粒度?(一條摘要還是整段歷史)

    如果你現在是用 if-else + heuristics 在寫這些邏輯,其實就是:

    把一個適合用 RL 學的策略問題,硬寫成規則引擎。

    MemFactory 做的事就是:把「記憶生命週期」拆成標準模組,然後用 GRPO 讓 Agent 自己學會怎麼用記憶。

    💡 關鍵: 與其不斷堆 if-else 修修補補,不如把記憶當成可訓練策略,長期可維護性與效果都會更好。


    核心功能 1:記憶生命週期標準化,像樂高一樣換零件

    MemFactory 把記憶相關操作,拆成可插拔的原子組件:

    • 寫入(Write):決定哪些內容要變成長期記憶
    • 壓縮(Compress / Summarize):長對話變短摘要
    • 遺忘(Forget / Prune):過期或冗餘記錄被丟棄
    • 檢索(Retrieve):在任務中調出最有用的記憶

    在框架裡,你可以:

    • 用官方提供的模組(如 MemAgent / Memory-R1 風格的寫入器、檢索器)
    • 把其中一個環節換成自己寫的策略,其他保持不動
    • 在同一組任務上,對比不同「記憶組合」帶來的效果

    你能做的具體事:

    • 快速把原本「只有 RAG」的聊天機器人,換成「有寫入+遺忘」的版本
    • 在同一個專案裡 A/B test:
    • A:只靠向量相似度檢索
    • B:加上學會「只記 summary」的壓縮模組

    這讓記憶不再是寫死在程式碼裡的一堆 if-else,而是可以替換、疊加、訓練的模組。

    💡 關鍵: 把「寫入、壓縮、遺忘、檢索」標準化後,你可以像換零件一樣快速試不同記憶策略。


    核心功能 2:用 GRPO 訓練「要記什麼、怎麼用」而不是手刻規則

    MemFactory 內建 Group Relative Policy Optimization (GRPO),重點不是名字,而是它幫你解決這兩件事:

    1. 讓 Agent 在真實任務中試錯:
    2. 成功完成長期任務 → 給正向獎勵
    3. 忘掉重要資訊、答錯、反覆問同樣問題 → 給負向獎勵
    4. 從多維度評分:
    5. 正確性(答案對不對)
    6. 連貫性(有沒有跟之前的對話對得上)
    7. 成本(少查一點沒用記憶、token 不要炸掉)

    訓練的結果,是一個「懂得控制自己記憶」的 policy:

    • 在對話中主動抽取關鍵資訊寫入記憶
    • 任務結尾自己產生任務總結存起來
    • 下次遇到相關任務時,知道該檢索哪一段

    你能做的具體事:

    • 不用設計「多久忘一次」「最多存幾條」這種規則,改成定義:
    • 什麼是成功回合(例如客服一次解決率)
    • 什麼是失敗回合(例如用戶反覆問同一件事)
    • 用 MemFactory 把這些 reward 寫進環境,讓 Agent 自己調整記憶策略

    💡 關鍵: 只要設計好 reward,GRPO 會在真實任務中自動逼出更好的記憶策略,而不用人工調參「存幾條、多久忘」。


    核心功能 3:直接套 SOTA 記憶 Agent 設計跑實驗

    MemFactory 已經把幾個知名記憶 Agent 的架構變成可直接套用的配置:

    • Memory-R1
    • RMM(Reinforced Memory Management)
    • MemAgent

    你可以:

    • 直接用官方提供的 config 跑 baseline
    • 把你的任務資料接上去,再用同一組框架做微調
    • 在同一個評測上,對比不同記憶架構的效果

    你能做的具體事:

    • 拿 MemAgent 官方釋出的 dataset,直接在本地跑一次論文裡的實驗流程
    • 把自己的客服對話 log 換成環境,保留原本的 MemAgent 架構,重訓一個「專屬你公司的記憶策略」

    適合誰用?三個典型場景

    1. 客服 Bot / 企業 Copilot:需要記「客戶長期歷史」

    需求:

    • 認得老客戶、知道過去投訴內容、偏好設定
    • 不要每次都叫客戶重講一遍

    用法:

    • 用 MemFactory 把「每次對話後的 summary」寫入客戶個人記憶
    • 訓練 Agent 學會:什麼樣的歷史有助於降低重複提問率

    2. 長期專案助理:跟著你跑一個月的專案

    需求:

    • 記得每次會議決議、待辦事項、誰負責什麼
    • 自動形成「專案記憶庫」,幫你追蹤進度

    用法:

    • 把每次對話當作一個 episode
    • 用 reward 指標:
    • 助理能否從記憶中準確回顧前次決議
    • 是否能串起跨週的任務

    3. 學習/研究助教 Bot:跟著你讀一本書、做一個研究題目

    需求:

    • 記住你已經學過哪些章節、卡在哪些概念
    • 適時用舊記憶幫你複習、舉例

    用法:

    • 設計「測驗」情境:Bot 如果能用過去筆記解出新題目 → 給高 reward
    • 讓記憶策略學會:哪些摘要對長期解題幫助最大

    怎麼開始:10 分鐘跑一個「多輪任務+記憶回顧」 Demo

    下面是一條最短路徑:從零到跑出一個會做記憶回顧的 Agent。具體指令以官方 Repo 為準,這裡給的是典型流程草稿。

    1. 安裝 MemFactory

    假設你已經有 Python 3.10+ 環境和 GPU:

    # 建議先建虛擬環境
    python -m venv .venv
    source .venv/bin/activate  # Windows 用 .venv\Scripts\activate
    
    pip install memfactory
    

    如果官方是 GitHub Repo,可能會是:

    git clone https://github.com/xxx/MemFactory.git
    cd MemFactory
    pip install -e .
    

    行動:把這段指令貼進你的實驗機/本地環境,確認能 import memfactory 即可。

    2. 選一個基礎 LLM:以 Llama / Qwen 為例

    MemFactory 通常透過 Hugging Face 或本地後端調用模型,你可以先挑一個開源模型:

    # 例:下載並準備一個 7B 等級模型
    huggingface-cli download meta-llama/Meta-Llama-3-8B-Instruct
    # 或
    huggingface-cli download Qwen/Qwen2-7B-Instruct
    

    在 MemFactory 的 config 裡指定:

    model:
      name: "Qwen/Qwen2-7B-Instruct"  # 或 Llama 模型
      backend: "vllm"                  # 依你使用的推理後端調整
    

    行動:先選一個你機器跑得動的模型(7B 左右),記下模型名稱,等下寫進 config。

    3. 套官方 MemAgent 設定,跑一個多輪任務 Demo

    大部分情況下,官方會提供類似:

    # 使用內建 MemAgent 設定
    memfactory run \
      --config configs/memagent_demo.yaml \
      --task multi_turn_todo_with_review
    

    這類 demo 通常會做:

    • 與 Agent 進行多輪對話(例如安排一週工作計畫)
    • Agent 在過程中抽取「關鍵任務」寫進記憶
    • 最後請它做「本週任務回顧」,看有沒有正確調出記憶

    你可以觀察:

    • 日誌裡每一步的「寫入」「壓縮」「遺忘」「檢索」行為
    • 沒有記憶 vs. 開啟 MemAgent 記憶策略的表現差異

    行動:先用官方 demo 跑一次,看 log 裡每個記憶操作的輸出,理解「記憶生命週期」是怎麼被拆開的。

    4. 改成自己的 Domain:以客服為例

    假設你有一批客服對話紀錄:

    1. 把對話整理成 episode 格式(每個工單一個 episode)
    2. 在 MemFactory 的任務設定裡換成你的 dataset:
    3. env.dataset_path: data/your_customer_logs.jsonl
    4. reward: 設計成:
      • 一次解決 → +1
      • 客戶重複追問同樣問題 → -1
    5. 仍然沿用 MemAgent 的記憶架構,只是換成你的訓練環境:
    memfactory train \
      --config configs/memagent_customer_service.yaml \
      --grpo  # 開啟 GRPO 訓練記憶策略
    

    行動:先複製官方 MemAgent config,改 dataset 路徑與 reward 規則,試著在你的一小批真實對話上訓練一晚,觀察 Agent 對「老客戶」的記憶有沒有變好。


    小結:把「記憶」當成可訓練的模組,而不是硬寫的規則

    如果你現在的 Agent 記憶只是:

    • 儲存所有對話
    • 檢索前 N 句最近的內容

    那你會遇到:成本爆炸、重要資訊被雜訊淹沒、長期任務斷線。

    MemFactory 提供的是一個更實際的路線:

    • 記憶生命週期 = 寫入 + 壓縮 + 遺忘 + 檢索 → 做成可插拔模組
    • 用 GRPO 在真實任務上訓練「要記什麼、怎麼用」
    • 直接復用 Memory-R1 / RMM / MemAgent 等架構,少走重造輪子的路

    如果你手上已經有客服、Copilot、教學 Bot 類的專案,最直接的下一步是:

    1. 拉一台可以跑 7B 模型的機器
    2. 裝上 MemFactory,跑完官方 MemAgent demo
    3. 把你的對話資料接進去,先做一個小規模試驗

    從那一刻開始,你的 Agent 就不是只會「背稿子」,而是開始學會「怎麼整理自己的記憶」。

    🚀 你現在可以做的事

    • 在實驗機上安裝 memfactory 並確認可以 import memfactory
    • 選一個你跑得動的 7B 模型,寫進 MemFactory 的 config 裡跑一次官方 MemAgent demo
    • 把一小批真實對話整理成 episode,加上簡單 reward 規則,試著用 memfactory train 訓練一晚觀察效果
  • Deep Researcher Agent:幫你 7×24 小時跑深度學習實驗

    📌 本文重點

    • 讓 Agent 自動從開題到調參跑完整實驗流程
    • 透過雙層記憶與精簡工具控制 token 與成本
    • 實測可連跑 30+ 天、500+ 次實驗且指標提升 52%

    Deep Researcher Agent 不是寫論文工具,而是幫你自動設計、啟動、監控、調整深度學習實驗的「實驗室助理」,讓你晚上開好一個任務,隔天早上直接看總結與下一步建議。

    原文與程式碼: arXiv: Deep Researcher Agent


    核心功能:把「開題到調參」變成自動流程

    1. 零成本監控:只讀日誌與進程,不再瘋狂 call API

    多數「AI 助手監控訓練」的做法是:每隔幾分鐘就丟當前 log / loss 給 LLM 解讀,API 費用跟著訓練時間線性上升。Deep Researcher Agent 直接反其道而行:

    做法:

    • 不在訓練中途問 LLM
    • 只用本機腳本:
    • 檢查訓練進程(還活著嗎?GPU 滿不滿?)
    • 讀 log 檔 / checkpoint 資訊
    • 訓練跑完後,才把「摘要後的訓練結果」送給 LLM 分析

    結果:

    • 一個專案可以連續跑 30+ 天、500+ 次實驗,LLM 每日成本約 0.08 美元
    • 你可以安心開長實驗,不用擔心「監控本身」把錢燒光

    💡 關鍵: 把 LLM 使用集中在「訓練後一次分析」,可以在連跑 500+ 次實驗的情況下,將每日成本壓到約 0.08 美元。

    你可以立刻做的事:

    • 檢查你現有的訓練流程,是否一定要「在線可視化」?
    • 如果只是每天看一次結果,Deep Researcher Agent 的這種「訓練中不問 LLM,訓練後一次分析」就非常適合。
    • 思考:你現在哪些監控行為其實可以改成「訓練後解析 log」,先在自己腳本裡做一次簡單實驗。

    2. 雙層記憶 + 精簡工具:防止 context 爆炸、token 費用受控

    讓一個 Agent 連續工作幾天,最常見的問題就是:

    • 每次對話都把所有歷史實驗貼進去
    • context 越來越長,token 費用越來越高,最後不是超長就是被截斷

    Deep Researcher Agent 用兩個設計解決:

    雙層固定大小記憶(Two-Tier Memory)

    • 短期記憶(Working Memory):
    • 只放當前 1~數個實驗的細節(超參、log 摘要、錯誤訊息)
    • 控制在約 5K 字元級別,方便每次對話完整送進 LLM
    • 長期記憶(Research Memory):
    • 只存「實驗結論」與「調參心得」,像是研究筆記
    • 例如:
      • 「batch size > 64 容易 OOM」
      • 「加入 label smoothing,val F1 提升約 3%」
    • 每次對話只抽取跟當前主題最相關的幾條結論給 LLM

    效果:

    • 跑到第 300 次實驗時,Agent 不會忘記前面學到的規則
    • 同時每次 LLM 呼叫的 context 仍保持在可控長度

    💡 關鍵: 透過短期與長期記憶拆分,即使到第 300 次實驗仍能保留前面經驗,同時維持每次對話在可控 token 範圍。

    精簡工具集(Master-Worker 工具設計)

    Deep Researcher Agent 不是給 Agent 一大堆雜亂工具,而是用「主代理 + 工人工具」的拆分方式:

    • 主代理(Research Agent):負責思考研究方向與高層決策
    • 工具極少:像是「列出已完成實驗」「建立新實驗配置」「讀取實驗結果」
    • 工作腳本(Workers):真正執行訓練的 Python / shell 指令
    • 不需要 LLM 介入,只在啟動時決定指令與參數

    你可以立刻做的事:

    • 列出你現在所有給 LLM 能呼叫的「工具」或指令,分成:
    • 必須由 LLM 決策的(例如:如何改超參)
    • 完全可以由固定腳本處理的(例如:啟動訓練、sync log)
    • 把第二類先抽出去,用單純腳本運行,減少 LLM 每次對話要「理解的東西」。

    3. 實際成效:30+ 天、500+ 次實驗,指標提升 52%

    論文中給了一個具體部署紀錄:

    • 同時跑 4 個研究專案
    • 連續運作超過 30 天
    • 累積超過 500 次實驗迭代
    • 其中一個專案的核心指標(文中稱 meta-metric)提升 52%
    • 每天 LLM 成本約 0.08 美元

    💡 關鍵: 在連續 30+ 天、500+ 次迭代中,單一專案 meta-metric 能提升 52%,顯示自動實驗迭代對指標有明顯放大效果。

    背後做的事包括:

    1. 自己提出假設(例如:換 optimizer / lr schedule)
    2. 自動改訓練腳本或 config
    3. 啟動新一輪訓練
    4. 訓練結束後讀取 log,分析哪裡變好或變壞
    5. 寫成研究筆記,決定下一輪調整

    你可以立刻做的事:

    • 選一個你目前「還在摸索怎麼調參」的專案(例如:分類模型 F1 卡在 0.7)
    • 想像:如果可以一週內自動跑 100 次變體,你會想讓 Agent 幫你嘗試哪些方向?
    • 先寫下三個:例如 optimizer、資料增強、模型寬度/深度
    • 等下在「怎麼開始」段落,我會示範怎麼把這些需求塞進 Agent。

    適合誰用?三種典型場景

    1. 個人研究者:晚上丟任務,早上看實驗日誌

    情境:你在做論文或 side project,每天能盯 terminal 的時間有限,但有 GPU 資源。

    你可以這樣用:

    • 晚上:
    • 給 Deep Researcher Agent 一個初始實驗設定(Model A + Dataset X)
    • 勾勒你允許它調整的範圍(例如 lr、batch size、增強策略)
    • 隔天早上:
    • 看 Agent 整理的:
      • 已跑過的實驗表格
      • 每一類調整的效果摘要
      • 下一步建議(例如「接下來專注調整 learning rate decay」)

    2. Startup ML 團隊:小團隊也能跑「持續自動調參」

    情境:公司只有 1–3 個 ML 工程師,但有幾台 GPU,要在短期內打磨一個核心模型(推薦、排序、廣告 CTR 等)。

    你可以這樣用:

    • 把既有的 PyTorch / Hugging Face 訓練腳本接入 Deep Researcher Agent
    • 讓 Agent 針對特定線上指標(例如 AUC / NDCG)做持續探索
    • 團隊成員每天只需要花 30 分鐘看報告與決定是否採用 Agent 建議的設定

    3. 公司內部模型調參:封裝成本、控管風險

    情境:你是公司內部「那個會調參的人」,大家都找你幫忙加一點準確度,但手工改 config 太耗時間。

    你可以這樣用:

    • 把公司的標準訓練 pipeline(包含資料路徑、監控、部署步驟)封裝成一個「Agent 可叫的 Worker」
    • 為每個專案設一個 sandbox:
    • 限制 Agent 只能用某些 GPU、只能改某些超參
    • 其他同事只要:
    • 把資料與 baseline config 準備好
    • 按一次「啟動自動調參」,等報告

    怎麼開始:最小可用 Workflow

    以下以「你已有一個 PyTorch / Hugging Face 訓練腳本」為前提,示範最快上手方式。實作細節可對照論文附檔與 GitHub(論文頁面會附上連結)。

    步驟 0:準備環境與專案

    1. 準備一台能跑你模型的機器(本機或遠端,都可以):
    2. Python 3.10+、CUDA、PyTorch / Transformers 已能正常訓練
    3. 選一個專案當作試驗田:
    4. 例如 train.py 接受 --lr --batch_size --model_name 等參數

    步驟 1:Clone 專案、安裝依賴

    # 以假想 repo 名稱為例,實際請依論文提供的 GitHub
    git clone https://github.com/xxx/deep-researcher-agent.git
    cd deep-researcher-agent
    
    pip install -r requirements.txt
    

    接著,設定你的 LLM 金鑰(例如 OpenAI / Claude):

    export OPENAI_API_KEY=你的_API_KEY
    # 或依 repo 說明設定其他模型供應商
    

    步驟 2:接上你現有的訓練腳本

    假設你原本的訓練指令是:

    python train.py \
      --model_name bert-base-chinese \
      --lr 2e-5 \
      --batch_size 32 \
      --output_dir runs/exp1
    

    你需要做兩件事:

    1. 定義一個 Worker 指令模板(讓 Agent 能替換超參):
    2. 在 Deep Researcher Agent 的設定檔(例如 config/experiments.yaml)中新增:

    yaml
    experiments:
    - name: text_classification_bert
    command_template: >-
    python /path/to/your/train.py
    --model_name {model_name}
    --lr {lr}
    --batch_size {batch_size}
    --output_dir {output_dir}
    search_space:
    model_name: ["bert-base-chinese", "hfl/chinese-roberta-wwm-ext"]
    lr: [1e-5, 2e-5, 3e-5]
    batch_size: [16, 32]

    1. 指定 log / metric 的位置與格式:
    2. 讓 Agent 知道到哪裡讀結果,例如:

    yaml
    log_config:
    metric_file: "{output_dir}/metrics.json"
    target_metric: "f1"

    並確保你的 train.py 在訓練結束會輸出一個 metrics.json,內容類似:

    json
    {"f1": 0.73, "accuracy": 0.88}

    步驟 3:啟動一個最小實驗

    完成以上設定後,你可以啟動一個最小自動實驗循環,例如:

    python run_agent.py \
      --experiment text_classification_bert \
      --max_iterations 5
    

    這會做的事通常包括:

    1. Agent 讀取目前專案目標與 search space
    2. 設計第 1 個實驗配置,產生實際指令
    3. 啟動訓練進程,等待完成
    4. 讀取 metrics.json,寫入研究記憶
    5. 依照結果調整下一輪超參,直到跑完 max_iterations

    跑完後,你可以查看:

    • logs/ 目錄:每次實驗的設定、結果、分析
    • 研究摘要檔:看到 Agent 寫的「這幾次實驗學到了什麼」

    步驟 4:把它變成你的「夜間實驗助手」

    當你確認一輪流程跑得穩:

    1. 把 max_iterations 調大,例如 50 或 100
    2. 使用排程或 tmux / screen,在下班前啟動一次 Agent
    3. 第二天早上:
    4. 開啟 Agent 產生的 summary(通常是 markdown / text)
    5. 根據它給的建議,決定:
      • 是否擴大 search space
      • 是否更換模型架構

    小結:先讓它代替你跑 5 次實驗就好

    Deep Researcher Agent 真正帶來的改變不是「多一個會寫程式的 ChatGPT」,而是:

    • 你不再需要手動複製貼上超參、啟動訓練、整理 log
    • 你可以把「實驗設計+結果分析」外包給一個成本極低、24 小時上班的助手

    建議你的第一步:

    1. 選一個已有訓練腳本的小專案
    2. 按上文接入 Deep Researcher Agent,只跑 5 次迭代
    3. 看看它整理出來的實驗表與建議,感受一下:「如果把這件事放大到 500 次實驗,對你現在的工作會有什麼幫助?」

    接著,你就可以考慮把公司或實驗室真正重要的專案,一個一個遷移進這套自動化實驗流程裡。

    🚀 你現在可以做的事

    • 檢查現有訓練腳本,先挑一個小專案依照文中的 experiments.yaml 範例接入 Deep Researcher Agent。
    • 實際跑一次 --max_iterations 5 的自動實驗循環,觀察 log、metrics 與 Agent 產出的研究摘要。
    • 根據初次結果,逐步擴大 search space 與 iterations,評估是否將公司或實驗室的核心專案遷移到這套流程。
  • OpenAI 開 AI 稅,其實是在畫新憲法

    📌 本文重點

    • AI 稅與四天工週可能強化巨頭壟斷
    • 白皮書成為 AI 時代「經濟憲法」初稿
    • 富裕「有模型國」壯大,全球「訂閱國」被邊緣化
    • 羅賓漢敘事不能外包給少數矽谷公司

    OpenAI 推 AI 稅、公共財富基金與四天工週,看起來是在幫社會設計安全網,實際上是在搶先畫出 AI 時代的經濟憲法草稿:誰能賺模型的錢、誰來分配紅利、誰有權定義「合理不平等」。問題不是政策內容好不好,而是這套規則為何能由一家公司率先寫出來。


    一、AI 稅與四天工時:安全網,還是只保護「有模型的人」?

    在最新白皮書裡,OpenAI主張:

    • 對 AI 利潤課徵類「機器人稅」,資金進入公共財富基金;
    • 以此支撐更厚的安全網,並推動四天工週、不減薪;
    • 搭配對高資本利得課更高稅,去抵消超級智能帶來的貧富差距。

    💡 關鍵: AI 利潤被集中課稅並導入公共基金,實際上是在搶先定義誰有資格分享未來 AI 紅利。

    表面上,這是一套「羅賓漢式」的再分配藍圖,試圖讓 AI 富足不只停在股東帳上。但如果從產業結構看,這很可能是替現有巨頭量身打造的「高門檻、低競爭」新秩序。

    第一層:誰付得起 AI 稅與合規成本?

    AI 稅看似是對整個產業徵收,實際上只有幾種玩家真的有能力承擔:

    • 掌握大型算力與基礎模型的公司(OpenAI、Anthropic、Google 等);
    • 已有全球營收與法務團隊的跨國雲端平台;
    • 極少數大到不怕做重資本投資的傳統巨頭(金融、電信、雲端硬體)。

    對這些玩家而言,高昂合規與稅務設計成本其實是護城河。當政府把白皮書變成準標準,

    • 小型模型公司、開源團隊與地區型新創,會被迫在一套為「超大模型」設計的框架下求生;
    • 能把「稅」轉價給終端客戶的,往往是平台本身,而不是被平台替代的那群勞工。

    第二層:四天工週是誰的福利?

    若 AI 真的成為「通用勞動替代品」(Anthropic CEO Dario Amodei 的說法),那麼四天工週 + 等薪,對不同階層的意義會完全不同:

    • 對高技術白領:AI 提升產能,有空間在工時上讓利,同時薪資甚至因稀缺技能提升;
    • 對中低技能與重複性工作者:不是四天工週,而是零天工週——直接被自動化替代;
    • 對平台依賴型勞工(外送、計程車、內容農場):AI 壓低價格,工時不減、收入不保。

    在缺乏強制性談判機制與集體協商前,AI 紅利很容易落在「有議價權、有股權、有股市帳戶的人」手上。公共財富基金如果只在富國成立,並主要來自 Big Tech 的超額利潤,就會變成一種「給有模型國家的國內紅利」,而不是全球性的平衡機制。

    換句話說,AI 稅與四天工週若不搭配勞權與產業結構改革,很容易變成「幫巨頭合法化壟斷的補償配套」,而不是打破階級的工具。


    二、當白皮書變成產品路線圖:誰在寫 AI 時代的經濟憲法?

    更關鍵的問題不在於政策細節,而是誰有資格替社會設計 AI 經濟規則。

    OpenAI 的角色非常特殊:

    • 它握有算力(與微軟 Azure 深度捆綁)、模型(GPT 系列)、資料與終端產品;
    • 又透過政策部門與官方 Blog,輸出「智慧時代工業政策」、「公共財富基金架構」等準政府級白皮書。

    這裡有一個新的權力結構:

    • 過去,財稅制度與工時制度是政黨、工會、產業、學界拉扯後的妥協產物;
    • 現在,AI 財政與工時討論,開始由少數 AI 實驗室用白皮書「寫初稿」,再把文本丟給政策圈「微調」。

    當「政策即白皮書,白皮書即產品路線圖」時,幾件事會悄悄發生:

    1. 法規會偏好大型中央集成式模型(因為利於監管、計稅與掛勾公共基金);
    2. 「安全網」設計會內建假設:AI 是不可逆的國策基礎建設,不能被民主程序實質質疑,只能在分配方式上「討價還價」;
    3. 研究資金與民意調查,會被引導去回答「如何最佳實作這套框架」,而不是「這套框架是否合理」。

    💡 關鍵: 當企業白皮書成為政策起點,民主程序就只剩微調細節,而無法真正選擇架構。

    這就是為什麼,在討論 OpenAI 的 AI 稅構想時,關鍵不是它左不左派、紅利分配多不多,而是它把自己擺在一個「草擬社會契約」的位置上。

    當一家公司同時是技術供應者、基礎建設、監管遊說者與政策設計者,民主討論的空間就被壓縮成:「你要 OpenAI 版 AI 稅,還是微調過的 OpenAI 版 AI 稅?」。


    三、AI 稅只會在富裕國家落地?「有模型國」 vs 「訂閱國」的斷層

    把視角拉到國際,AI 稅與公共財富基金還牽涉到全球競爭與地緣政治。

    當前情境是:

    • 美國在大型語言模型與前沿算法上領先,中國則在視覺、監控與應用生態上強勢;
    • 晶片封鎖與出口管制讓先進 GPU 成為戰略物資;
    • 伊朗威脅攻擊「Stargate」AI 資料中心則提醒大家,資料中心本身已是戰爭目標。

    在這個框架下,OpenAI 提出的 AI 稅與公共財富基金,更像是一套「有模型國專屬」的內部再分配工具:

    • 有能力課 AI 稅、建公共基金的,多半是掌握晶片、雲端與模型的少數富裕國家;
    • 多數全球南方國家,既沒有大型模型,也沒有能課稅的本土巨頭,只能扮演「訂閱國」:
    • 付訂閱費使用 API 和 SaaS;
    • 讓本地數據與勞動成果餵進他國模型;
    • 但分到的,只有局部生產力提升,沒有 AI 資本利得。

    結果是:

    • 有模型國:一邊用晶片封鎖維持技術優勢,一邊用 AI 稅和公共財富基金穩定國內社會;
    • 訂閱國:承受工作被遠端自動化、資料外流、基礎設施受制於雲端出口風險,卻拿不到真正的資本紅利。

    💡 關鍵: AI 稅在富國內部分配紅利的同時,可能加深全球南北之間的數位殖民與經濟斷層。

    這不是科技樂觀主義者宣稱的「全球共享 AI 紅利」,而是多層封裝的數位殖民結構:技術、雲端、稅制與國防綁在一起,讓 AI 產生的「矽紅利」鎖在少數國家與公司手中。


    結論:別把「羅賓漢敘事」外包給矽谷創辦人

    AI 產業確實需要用稅制與工時制度重分配風險與紅利,這一點 OpenAI 說得沒錯。但如果我們讓少數 AI 公司以白皮書先發制人,整套制度最後只會長得像:

    巨頭寫規則 → 國家負責背書 → 勞工與全球南方負責適應。

    下一步我們真正需要的是一份「多極參與的 AI 社會契約」,而不是把新一輪羅賓漢敘事交給幾位矽谷創辦人代筆。具體來說:

    • 對 開發者:
    • 積極加入與支持開源模型、生態與標準組織(如開源基金會、地方社群),讓「非巨頭路線」在技術與話語上都有存在感;
    • 在公司內部推動,任何採用外部基礎模型的方案,都必須評估供應商政策與鎖定風險,而不只是技術性能。

    • 對 勞工與工會:

    • 把 AI 納入集體談判議題:不只談薪資,還要談 AI 導入節奏、再訓練預算、四天工週是否附帶裁員;
    • 優先要求「AI 導入前的影響評估」與工會參與權,而不是事後被迫接受「AI 既成事實」。

    • 對 全球南方與政策制定者:

    • 組建跨國聯盟,爭取在任何 AI 國際治理框架中,納入數據主權、模型利潤分潤與技術移轉條款;
    • 對 AI 稅與公共基金持審慎態度:先問「誰寫規則、誰分錢、誰付代價」,再問這套方案有多進步。

    AI 時代的關鍵問題不再是「要不要課 AI 稅」,而是誰有權定義什麼樣的 AI 經濟秩序算是「合理」。如果這個問題沒有民主答案,任何再分配設計,都只是在替新一輪的集中權力披上正義外衣。

    🚀 你現在可以做的事

    • 搜尋並關注本地或線上的開源 AI 社群與基金會,了解「非巨頭路線」的技術與治理實驗
    • 在你的工作場域發起討論:盤點 AI 導入計畫,要求納入勞權影響評估與員工參與機制
    • 追蹤各國 AI 稅與公共基金政策提案,整理「誰寫規則、誰分錢、誰付代價」的利害關係人清單
  • AI Agent 正在變成各行各業的「專職角色」:從雲端故障指揮官到教育出題機的三個實戰案例

    如果哪天你打開 Slack,發現新加入的同事叫「ActionNex」,職稱寫著 Oncall Outage Manager(雲端故障值班經理),你大概不會意外——但真正驚訝的,是這位「同事」其實是個 AI Agent。

    這不是科幻,也是現在進行式。

    這一波 Agent 熱潮,真正有趣的變化不是「模型又變多強」,而是它開始在各個領域變成一個具體的專職角色:

    • 在微軟 Azure,它是負責雲端停機調度的虛擬值班經理(ActionNex)
    • 在科研實驗室,它幫科學代理整理、鍛造會自己長大的技能庫(SkillFoundry)
    • 在程式課教室,它是老師身邊的出題助教(CODE-GEN)

    這篇文想聊的不是「又有幾篇新論文」,而是:

    Agent 落地時,真正重要的設計點,其實不是「模型多大、多強」,而是:
    1. 怎麼設計技能庫
    2. 怎麼設計工作流
    3. 怎麼設計人類在回圈中的協作

    我們會拆三個案例,順便帶到兩個很關鍵的底層技術:Profile-Then-Reason(PTR) 和 Combee,來看 Agent 要怎麼變得更穩、更會學。


    一個共通現象:Agent 在團隊裡,開始有「職稱」了

    先抓一個大方向:

    以前我們講 LLM,多半把它當「加強版 ChatGPT」——一個很聰明的通用助手。

    但這幾個系統有個共同點:

    • 它們不是「萬事通」,而是清楚限定職責的角色
    • 它們都有專用的工具與技能庫
    • 它們都有固定的工作流程(workflow)
    • 它們都有穩定運作的記憶系統
    • 而且都強調 human-in-the-loop(人類在回圈中)

    換句話說,真正落地的 Agent,比較像是:

    「你團隊裡多了幾位非常認真、永遠 oncall、不會累的專職同事。」

    接下來就來看這三位「新同事」各自長什麼樣子。


    案例一:ActionNex —— 微軟 Azure 的雲端故障「虛擬指揮官」

    情境想像一下:

    凌晨三點,某區域的 Azure 服務掛了。平常流程:

    1. 值班工程師被叫醒
    2. 開會、看 dashboard、翻 playbook
    3. 瘋狂在 Teams 上 ping 各團隊
    4. 邊排查邊對外更新狀態

    這種跨團隊、資訊不完整、高壓的情境,過去完全靠人撐著。

    微軟在 ActionNex 論文 裡做的事情是:

    把這整個「停機事件管理」流程,交給一個 專職 Agent 當指揮官。

    ActionNex 怎麼工作?

    它接收的資訊其實非常雜:

    • 停機事件內容(Ticket、公告)
    • 遙測資料(各種監控指標)
    • 人類在 Teams / Email 裡的對話

    第一步,它會做一件很重要的事:

    把一堆雜訊壓縮成一串「關鍵事件」(critical events)

    有點像是:

    • 從「聊天紀錄 + log + 報表」
    • 自動剪輯成一條事件時間線:「01:32 服務 A 延遲飆升 → 01:37 DB 重啟失敗 → 01:40 客戶大量 Time-out」

    接著它會用一套分層記憶系統來推理下一步該做什麼。

    三層記憶:讓 Agent 像資深值班工程師一樣「有歷史感」

    ActionNex 把記憶分成三種:

    1. KCA 知識庫(Key-Condition-Action)
      從歷史 playbook 萃取:
    2. 關鍵條件(Condition):例如「延遲 > 200ms 且錯誤率 > 5%」
    3. 對應動作(Action):例如「先 rollback 上一版」「切到備援區域」
      這有點像整個團隊的「作戰 SOP」被結構化塞進 Agent 裡。
    4. 情境記憶(Past outage memories)
      過去每一次停機的「故事版」:發生什麼、怎麼處理、結果如何。
    5. 工作記憶(Working memory)
      這次事件當下的進度:已做哪些操作、各團隊目前狀態。

    推理代理會把當前的關鍵事件,拿去跟這些記憶對照:

    • 找出「長得很像的歷史事件」
    • 套用對應的 KCA 規則
    • 給出「下一步該做什麼」的建議

    最重要的:人機協作,而不是全自動

    ActionNex 不是來「接管」值班,而是變成:

    • 為每個角色(不同團隊)
    • 在不同階段(初始 triage、調查、修復、收尾)
    • 給出角色與階段條件化(role- and stage-conditioned) 的建議

    而且每一次人類的接受 / 拒絕 / 更改行動,

    都會回寫成新的資料,讓系統持續「學會更像這個組織真正的作法」。

    簡單講,它就是個永遠在場、會記住每一次事故教訓的「虛擬 oncall 指揮官」。

    實測成效:不只是 demo,是真的上線用

    這篇論文最關鍵的一段是:

    • 在 8 次真實 Azure 停機案例 中測試
    • 下一步行動建議的:
    • 精確率約 71.4%
    • 召回率約 53–55%

    換句話說:

    • 它給的「可用建議」不少,而且品質不差
    • 又因為有值班工程師在回圈裡,不會傻傻地完全照做

    對營運團隊來說,這不是「AI 會不會取代我」的題目,而是:

    「我多了一個懂歷史、熟 SOP、24 小時在線的值班副手。」


    案例二:SkillFoundry —— 幫科研 Agent 打造會自己長大的技能庫

    第二個案例走進研究室。

    現在很多實驗室都在做「科學代理」:

    • 幫忙寫分析程式
    • 跑生物資訊 pipeline
    • 讀 paper、查資料

    但現實問題是——科研世界的「知識」非常碎:

    • GitHub repo 裡的腳本
    • API 文件
    • Lab wiki、Notebook
    • Database 查詢
    • 方法論寫在論文裡

    對 Agent 來說,這些都像一堆散落各地的「技能零件」,

    會寫 Python ≠ 會跑你實驗室那套 pipeline。

    SkillFoundry 做的事情,就是:

    把這些 heterogeneous 資源,鍛造成「可以直接拿來用的技能包」,而且會自我演進。

    什麼是「技能包」?

    在 SkillFoundry 裡,每個 skill 不是一句 prompt,而是一個完整的「模組」:

    包含:

    • 任務範圍(這技能用來幹嘛)
    • 輸入/輸出格式
    • 執行步驟(step-by-step 程序)
    • 環境假設(需要哪些環境 / 資料)
    • 來源(來自哪個 repo / 文件 / 論文)
    • 測試(怎樣算成功)

    很像你在寫一個「可重用的工具」,不是臨時寫一段 code 貼上就算。

    SkillFoundry 的核心流程:

    可以想像成四步:

    1. 建立領域知識樹(Domain Knowledge Tree)
    2. 把目標領域(例如基因組學)拆成一棵樹:
    3. 節點可能是:資料前處理 → 比對 → 變異檢測 → 下游分析
    4. 從高價值分支挖資源
    5. 從 repo / API / 文件 / 論文中抓出相關程式與描述
    6. 用 LLM 幫忙抽取出「這個操作到底在做什麼」
    7. 轉成技能包 + 測試
    8. 把操作流程寫成結構化 skill
    9. 自動或半自動生成測試案例
    10. 閉環驗證 + 自我演進
    11. 讓代理實際用這些 skill 去解 benchmark / 真實任務
    12. 觀察:
      • 哪些技能常用?
      • 哪些技能常出錯?
    13. 依狀況進行:擴展/修復/合併/刪減

    這個「挖 → 寫成 skill → 用 → 回饋 → 精煉」的迴圈,就是它的「自我演進」。

    結果:不是在堆技能,而是真的變強

    幾個有意思的數字:

    • SkillFoundry 產生的技能庫,跟現有的 SkillHub / SkillSMP 比,
    • 70% 以上的技能是新的(不是抄舊東西)
    • 把這些技能接上現有 coding agent:
    • 在多個科學基準上表現有明顯提升
    • 對像基因組學這種比較硬的任務,提升特別明顯

    更關鍵的是:

    你可以針對某個具體任務,按需設計一批技能,而不是丟給模型自己猜要怎麼做。

    從產品角度來看,這個訊號非常清楚:

    • 真正厲害的科學 Agent,不只是「模型懂很多生物學」
    • 而是它有一套針對領域打造的技能庫 + 驗證機制

    如果你在做 B2B / 垂直領域產品,這其實就是:

    「先把你的 domain SOP 結構化成一個會自己長大的技能庫。」


    案例三:CODE-GEN —— 程式課老師的 AI 出題助教

    第三個案例走進教室。

    程式課老師大概都懂這個痛點:

    • 要為不同程度的學生出足夠多、夠有品質的題目
    • 題目要對齊課程目標(不是隨便考)
    • 還要兼顧:清晰度、合理難度、沒有語病、程式碼要能跑…

    CODE-GEN 做的是:

    用一個 Human-in-the-loop 的 RAG Agent 系統,當老師的「出題助教」。

    兩個 Agent:出題者 + 驗題者

    整個系統拆成兩個角色:

    1. Generator(出題代理)
    2. 讀課程內容、學習目標(透過 RAG 把相關教材餵給模型)
    3. 產生多選題:題幹、選項、正解、解析
    4. Validator(驗證代理)
    5. 獨立地、用另一套流程檢查題目
    6. 檢查七個教學維度,例如:
      • 題目是否清晰
      • 程式碼是否可執行、沒有 bug
      • 概念是否對齊課程目標
      • 正確答案是否合理

    兩個 Agent 都配了一些專用工具:

    • 用來實際跑程式碼
    • 驗證輸出
    • 做精確計算

    所以這不是「LLM 靠感覺出題」,而是:

    LLM + 工具 + 另一個 LLM 當審稿編輯。

    人類在回圈:老師還是最後的權威

    CODE-GEN 強調的是 Human-in-the-loop:

    • 研究找了 6 位領域專家(程式教師)
    • 對 288 題 AI 生成題目做評估
    • 得到 2016 組人機共同評分數據

    在可被人類直接檢查的維度(清晰度、程式碼有效性、概念對齊、答案合理性)上:

    • 成功率在 79.9% – 98.6% 之間

    但研究也坦白說:

    • 有一些「比較微妙」的教學品質問題
    • 例如題目的「教育價值」「是否真的能引導學生思考」
    • 還是需要人類專業來判斷

    我覺得這是很健康的設計哲學:

    AI 幫你「大量產出高水準草稿」,
    老師主導「最後把關與精修」。

    對任何內容產品團隊也一樣:

    • 不要期待 Agent「全自動產出完美內容」
    • 要把它當成高效率內容工廠 + 嚴謹的 QA 流程

    底層技術:要讓 Agent 穩、快、會學,靠什麼?

    看完三個落地案例,你會發現一個 pattern:

    • 都是多步驟流程
    • 都要跟工具互動
    • 都要反覆執行很多次

    這種情境下,兩個瓶頸很常見:

    1. Agent 推理流程太長 → 延遲爆炸、錯誤累積
    2. 想讓 Agent 自我提升 → 學得太慢或學壞

    這時候,兩篇研究上場:Profile-Then-Reason(PTR) 和 Combee。

    Profile-Then-Reason(PTR):先寫流程,再執行

    一般常見的 Agent 模式(像 ReAct)是:

    想一步,call 一次工具;看結果,再想下一步。

    問題是:

    • 工具多 → LLM 每一小步都要重新推理
    • 跑久了延遲很高,而且很容易一錯再錯、錯誤累積

    PTR 論文 提出一種不一樣的做法:

    Profile-Then-Reason:先用模型「把整個工作流程寫出來」,再用比較穩的運算子去執行這個流程。

    大致流程:

    1. Profile(定義流程):
    2. LLM 看任務與可用工具
    3. 一口氣設計出一個 explicit workflow(像寫一個簡化版 pipeline)
    4. Execution(執行):
    5. 由 deterministic 或 guarded operator 來跑這個 workflow
    6. 這一步不再狂 call LLM,而是照規劃一步步執行
    7. Verification(驗證):
    8. 有一個 verifier 來檢查整個 trace 合不合理
    9. Repair / Re-Reason(修正)(只有必要才做)
    10. 若 verifier 發現流程不可靠,才再叫 LLM 來調整流程

    核心 idea 是:

    「盡量把『思考成本』集中在一兩次,再用穩定的程式化執行接手。」

    實驗結果:

    • 在 6 個 benchmark、4 個不同模型上測試
    • PTR 的精確匹配率普遍優於 ReAct
    • 模型呼叫次數也被嚴格限制在 2–3 次 左右

    尤其在:

    • 以檢索為主(RAG-heavy)
    • 任務拆解很多階段

    這種情境,PTR 特別吃香。

    對產品設計來說,這個訊息很直接:

    真正複雜的工作流,不要用「一直問模型下一步要幹嘛」來跑,而是讓模型先設計流程,再讓系統執行。

    Combee:讓一大群 Agent 的經驗變成可用的「系統提示升級」

    第二個問題是:

    「我們收了一堆 Agent 執行軌跡,怎麼讓它們真的變成 Agent 變強的養分?」

    過去像 ACE、GEPA 這類 prompt learning 方法,可以從歷史任務中學出更好的 system prompt,但多半:

    • 針對單一 Agent 或小量並行
    • 當你想一次學很多 trace,就會:
    • 要嘛變超慢
    • 要嘛品質崩掉

    Combee 的出發點是:

    我們需要一個可以「高並行學 prompt」的框架,才配得上現在一堆大規模 Agent 執行軌跡。

    它的做法可以簡化理解為三個關鍵機制:

    1. 平行掃描(Parallel scan)
    2. 把大量軌跡拆開,在多個 worker 上同時做提示學習
    3. 增強隨機重排(Enhanced random reshuffling)
    4. 避免某些偏差樣本一直堆疊導致 prompt 學壞
    5. 動態批次控制(Dynamic batch size)
    6. 根據學習狀況調整 batch,兼顧穩定與速度

    實驗上,在 AppWorld、Terminal-Bench、Formula、FiNER 等任務上:

    • 相比之前方法,學習速度最高快 17 倍
    • 準確度大致持平或更好
    • 成本維持相近

    這帶來一件很實際的想像:

    未來你的產品如果有 10,000 個 Agent 在跑任務,它們的「軌跡」真的可以變成一種集體學習機制,而不是只拿來算 dashboard。


    三個案例的一致設計:記憶、技能、驗證、人類在回圈

    把 ActionNex、SkillFoundry、CODE-GEN 放在一起,你會看到一張很像的架構圖:

    1. 記憶系統(Memory)
    2. ActionNex:KCA + 過往事故 + 當前工作記憶
    3. SkillFoundry:領域知識樹 + 已驗證技能歷史
    4. CODE-GEN:課程內容、過往題目與評分結果
    5. 技能庫(Tools / Skills)
    6. ActionNex:操作手冊轉成 KCA;各種維運工具
    7. SkillFoundry:每個帶測試的 skill module
    8. CODE-GEN:程式執行、驗證工具 + RAG 工具
    9. 工作流程(Workflow / Orchestration)
    10. 有明確的階段:感知 → 推理 → 行動 → 回饋
    11. PTR 類的技術則用來把這工作流更結構化、穩定化
    12. 驗證與自我修正(Verification & Self-Improvement)
    13. ActionNex:人類值班人員的使用/拒絕行為
    14. SkillFoundry:用 benchmark 與測試來修技能
    15. CODE-GEN:Validator Agent + 老師評分
    16. Combee 類技術:把這些軌跡學成更好的 prompt
    17. Human-in-the-loop(人類在回圈中)
    18. 不只是「可選的審核」,而是:
      • ActionNex:值班工程師 + 跨團隊溝通
      • SkillFoundry:領域專家指導知識樹、審關鍵技能
      • CODE-GEN:老師最後裁決題目品質

    這裡面有一個很重要的觀點:

    真正落地的 Agent 系統,設計重心往往不在「選哪個模型」,而在:

    • 你怎麼整理你組織的知識(記憶)
    • 你怎麼把流程拆成可重用的技能
    • 你怎麼安排工作流與驗證點
    • 你怎麼讓人類有自然的介面可以介入、修正、教它

    如果你想在自家產品導入 Agent,應該先思考什麼?

    把研究拉回產品實務,我會建議你先從這三個問題開始,而不是先問「要不要上 GPT-4.1 還是別的?」

    1. 你想讓 Agent 當什麼「專職角色」?

    不要一開始就說:「我要一個 AI 助手。」

    改問:

    • 在你的業務裡,有沒有:
    • 雜事多、流程固定
    • 但又需要一定專業判斷的角色?

    例如:

    • 客服團隊裡的「初步 triage 專員」
    • SRE 團隊裡的「值班副手」(像 ActionNex)
    • 研究團隊裡的「腳本整理小幫手」(像 SkillFoundry)
    • 教育團隊裡的「出題助教」(像 CODE-GEN)

    給它一個清楚的職稱和職責範圍,

    你比較有機會設計出真的能上線用的 Agent,而不是玩具 demo。

    2. 你的「技能庫」要怎麼長出來?

    機器不懂你公司到底怎麼做事。

    你需要回答:

    • 你們現在的 SOP 放在哪?(文件、Notion、Wiki、內部工具?)
    • 哪些操作可以拆成「技能」?
    • 每個技能:輸入是什麼、輸出是什麼、怎樣算成功?
    • 有沒有測試機制可以驗證技能沒壞?

    可以借鏡 SkillFoundry 的心法:

    • 先畫一棵「業務知識樹」
    • 選幾個高價值分支去做 POC
    • 用半自動方式把 SOP 轉成技能,儘量帶上測試與環境假設

    3. 你要怎麼把人類放進回圈?

    這點在三個案例裡都被反覆強調:

    • 沒有人類在回圈的 Agent,很難安全地上產線

    你可以設計:

    • 哪些階段一定要人類確認?
    • 例如:
      • 發布外部公告前
      • 修改關鍵設定前
      • 上線前最後一版題目
    • 人類的操作會不會被記錄、回饋?
    • 接受 / 拒絕 / 修改 Agent 建議
    • 能不能作為未來 prompt / 技能優化的資料

    這裡就呼應 Combee 的價值:

    如果你能把大量的「人類如何修正 Agent」軌跡存下來,未來可以用高並行的 prompt learning 框架,把整體系統悄悄調得越來越好。


    結語:先設計角色與流程,再談模型

    ActionNex、SkillFoundry、CODE-GEN、PTR、Combee 這幾篇研究,對我來說共同在傳遞一件事:

    Agent 不再只是「一個更聰明的大模型」,而是「被放進組織裡,負責特定工作的專職角色」。

    而當它變成「同事」之後,你最需要思考的其實是那些很「工程」也很「管理」的問題:

    • 你要給它什麼職稱和職責?
    • 它的技能從哪裡來,怎麼維護?
    • 它的工作流長什麼樣?
    • 它怎麼跟人類同事協作、被教會?

    模型當然重要,但更像是:

    一個很會學習、很會表達、很會寫 code 的「大腦」,
    真正決定它能不能上線成為團隊一員的,是你給它的 記憶、技能、流程與人際關係(human-in-the-loop)設計。

    如果你正準備在產品裡導入 Agent,可以試著先畫一張圖:

    1. 中間寫上那個你想要的「AI 職稱」
    2. 左邊列出它需要什麼技能(對應到工具 / API / SOP)
    3. 右邊畫出它每天的工作流程(哪裡要人類確認)
    4. 下方想想:它今天做錯了,你要怎麼讓它明天變得更好?

    當這張圖足夠清楚,選用哪個模型,反而是一個比較好解的工程問題了。


    延伸閱讀

    • ActionNex: A Virtual Outage Manager for Cloud
      https://arxiv.org/abs/2604.03512
    • SkillFoundry: Building Self-Evolving Agent Skill Libraries from Heterogeneous Scientific Resources
      https://arxiv.org/abs/2604.03964
    • CODE-GEN: A Human-in-the-Loop RAG-Based Agentic AI System for Multiple-Choice Question Generation
      https://arxiv.org/abs/2604.03926
    • Profile-Then-Reason (PTR): Bounded Semantic Complexity for Tool-Augmented Language Agents
      https://arxiv.org/abs/2604.04131
    • Combee: Scaling Prompt Learning for Self-Improving Language Model Agents
      https://arxiv.org/abs/2604.04247