← 部落格

工程筆記

AIPOCH Open Science:把科研 Agent 做成可治理工作台

AIPOCH Open Science:把科研 Agent 做成可治理工作台

AIPOCH 在 2026 年 8 月 24 日發布 Open Science v0.19.0。這是一個以 local-first、model-agnostic 為方向的開源 AI research workbench:Agent 可以讀取檔案、執行 Python 與 R、呼叫科學資料連接器,並把報告、表格與圖形連回可檢查的活動歷史。

這個版本最值得看的地方,不是又多了一個模型或聊天入口,而是把原本藏在 UI 背後的狀態變成可治理的系統邊界。Marketplace Specialists 開始記錄套件來源,Notebook output 會標示是否過期,OAuth 補齊授權生命週期,Artifact 有穩定識別與預覽,session 啟動則改為先載入摘要。

這些改動正把 scientific agent 從「會回答問題的介面」,推向「能執行、能回看,也知道何時不該相信結果的本機工作台」。

先把問題說清楚:Research Agent 不只是聊天 UI

科學研究的 Agent loop,比一般問答多了幾個不能省略的階段:理解問題、選擇資料與工具、提出計畫、取得執行許可、執行程式或 connector、產生 artifact,最後讓研究者檢視、重跑或否決結果。只要其中一段沒有留下狀態,最後的報告就可能看起來完整,卻無法回答幾個基本問題:

  • 這張圖是由哪一個 notebook state 產生的?中間的變數是否已經被改過?
  • Agent 當時載入了哪個 Specialist 或 skill?它是誰發布的?
  • 這次外部請求使用哪個身份、哪種 protocol,token 何時取得與刷新?
  • 報告中的檔案、Markdown 圖片和 notebook output,能否連回同一次執行的 artifact version?
  • session 被壓縮或重新開啟後,研究者看到的是原始 evidence,還是模型重新拼出的敘述?

Open Science 的 repository 將產品定位為可重現、可檢查的科學發現工作台;v0.19.0 則把這個定位落到一組具體的 runtime 機制。這些機制不等於已經證明科學結論正確,也不是 benchmark 結果。它們先處理的是「系統是否知道自己做了什麼,以及能否把這些狀態交給人檢查」。

v0.19.0 的四個控制面

1. Skills 從內容檔變成可治理套件

這個版本把 Marketplace 安裝的 Specialists 視為有來源、有生命週期的受管套件。官方 release notes 列出幾個重要邊界:套件會帶有 marketplace 來源,發布者擁有的內容改為唯讀,手動 ZIP 不能直接覆寫;更新也必須以較高的 SemVer 對應既有內容基準。

Installed 頁面則將 All、Custom、Marketplace、Built-in 分組,並把更新、建立可編輯副本、啟用、停用與解除安裝收進同一套管理流程。

這個設計解決的是一個常被低估的供應鏈問題:如果一個 skill 能改變 Agent 選工具、讀資料或執行 side effect 的方式,它就不是普通的 Markdown 附件。 它至少需要可辨識的 origin、版本比較規則、內容完整性與可逆的安裝操作。

但 read-only publisher content 只代表本機不能直接竄改已安裝的內容,不代表 publisher 本身可信,也不代表 skill 沒有 prompt injection 或危險工具權限。實際部署仍應留下 package digest、publisher identity、審查者、依賴、允許的 filesystem/network scope,以及每次 session 實際載入的版本。

這和 AI Agent 完整指南 裡談的 execution envelope 是同一個方向:Agent 的能力不應只寫在 system prompt,而應被放進可觀察、可回滾的 runtime contract。

2. Notebook 不再假裝所有 output 都是最新的

Notebook 的危險不只在程式碼可能失敗,也在執行成功後,舊 output 仍會看起來像新結果。v0.19.0 會追蹤不同 Python 與 R 執行之間的依賴,並在程序內用 tree-sitter WASM 分析程式。

release notes 特別列出別名、根物件修改、類別、S4/R6 物件、複製/參照語義,以及常見科學運算函式庫的副作用。後續 output 會被標記為 staleclearunknown,不再默默沿用過期狀態。

可以把它想成一個有限的依賴圖:

  1. 某次 run 讀取或建立變數,並產生一個 output。
  2. 後續 run 可能透過 alias、物件 mutation、class method 或 library operation 改變同一個根物件。
  3. 系統比較 output 所依賴的變數狀態與最新執行狀態。
  4. 若能判定依賴仍然一致,標記為 clear;若依賴已改變,標記為 stale;若靜態分析無法安全判斷,保留 unknown

工程上最重要的不是 parser 能涵蓋多少語法,而是它不會把「無法判斷」偽裝成「沒有問題」。stale 表示依賴狀態已改變,但不直接表示研究結論錯誤;clear 也只表示目前追蹤到的依賴未被判定為改變,不能取代領域審查、統計檢查或確定性重跑。

這與 Enterprise RAG 的評估與失敗診斷 採用同一原則:系統要把證據狀態顯示出來,讓使用者知道何時需要重新取得或驗證資料。

3. OAuth 不只是「登入成功」

v0.19.0 新增 xAI(Grok)OAuth subscription provider。同一個訂閱帳號可透過 xAI Responses API,支援 Claude Code 的 Anthropic Messages、OpenCode 的 Chat Completions,以及 Codex 的 Responses 三種 agent protocol。

release notes 也提到 Settings 與 onboarding 的裝置碼登入、由應用程式主程序負責 token refresh、一次 401 retry,以及本機用 o200k_base 近似計算 token 數量。

這裡其實有兩層不同的工程問題:

  • 協定相容性:同一個 provider 如何把不同 protocol 的 message、tool call、token counting 與 model capability 映射到共同的 Responses API。
  • 身份與授權生命週期:如何開始授權、取消、失敗恢復、重新嘗試、finish later、處理 runtime invalidation,以及如何以預先註冊的 redirect URI 限制 callback 邊界。

把 token refresh 放在 main process、對 401 做單次 retry,表示產品有明確的 runtime ownership;但它不會自動解決 secret storage、log redaction、connector scope 或多使用者主機的隔離。release notes 也把 agent identity 與 capability scope isolation 列為修正項目,這提醒我們:「能呼叫同一個模型」和「能代表同一個身份做所有事情」必須分開。

如果團隊要採用類似設計,至少應為每次 connector invocation 記錄 actor、provider、protocol、scope、token source、redirect client 與 refresh outcome,而不是只在 UI 顯示一個「已連線」。

4. Artifact、session 與 context 都需要可追蹤的邊界

v0.19.0 讓訊息中的受管檔案連結與 Markdown 圖片,可以依穩定的 artifact/version ID、受管路徑或唯一檔名找到產物,並在既有的預覽工作台開啟與縮放。Notebook 圖形也能在工具群組內預覽;已終止的 notebook 則改為唯讀。

這些改動看似只是 UX,卻會直接影響證據能否被回看:研究者需要知道眼前是哪個 artifact、哪個版本,又是由哪一次執行產生。

Session 也採用 summary-first startup。查詢 metadata 與逐輪用量會複製進 SQLite materialized view;啟動時先讀摘要與索引,只有在開啟或匯出特定 session 時,才載入完整檔案。這可避免啟動時逐一解析大量 JSON,但摘要只是物化檢視,不能當成完整對話紀錄。

Context compaction 也會顯示清楚的 transcript boundary,讓使用者知道對話在哪裡被壓縮,而不是只看到一列難以解釋的工具紀錄。

這些機制合在一起,形成一個實用的 artifact contract:結果要有穩定身份,session 要知道自己載入的是摘要還是完整歷史,context 被壓縮時要留下可見邊界,結束後的研究狀態要避免再被誤寫。 它仍然不能保證 provenance 的語義完整;例如 artifact 可能被正確連回 run,卻沒有記錄資料集版本、環境 lock、隨機種子或外部 API response。

一個完整的研究回合:從能力到可回放產物

把 release notes 的功能放進同一個研究回合,會更容易看出它們如何互相配合。以下是根據 v0.19.0 已公布能力整理出的工程流程,不是 AIPOCH 宣稱的單一內建 pipeline:

  1. 建立身份與能力邊界。 使用者選定 agent framework 與 provider,完成 OAuth device authorization;系統同時記錄 actor、protocol、skill 的 origin/version,以及這個 session 被授予的 tool scope。token 本身不應進入研究紀錄。
  2. 先產生計畫,再取得執行許可。 Agent 把研究問題拆成資料讀取、程式執行與 artifact 產生步驟;在需要 review 的設定下,研究者先批准計畫,才讓有 side effect 的動作開始。
  3. 執行 notebook 與 connectors。 Python 或 R run 完成後,依 tree-sitter WASM 的分析結果更新變數與依賴狀態。若後續程式改變了前一個 output 的依賴,系統將它標成 stale;若無法安全判定,則保留 unknown
  4. 完成並註冊 artifact。 圖片、表格、報告與 managed file 都要掛到 run 和 stable artifact/version ID;訊息內的連結再透過這個識別找到 preview,而不是只依賴檔名或模型描述。
  5. 在交付前檢查 freshness 與 provenance。 clear 只代表追蹤到的依賴沒有被判定為改變;staleunknown 應觸發 rerun、人工審查或明確的限制說明,不能直接進入正式報告。
  6. 結束、壓縮與重開都保留邊界。 終止的 notebook 以 read-only preview 保留;session 啟動先讀 SQLite summary;context compaction 以 transcript boundary 告知使用者。重新開啟時,系統應能分辨「摘要可供導航」和「完整 evidence 已被載入」是兩件事。

這個流程的重點,是把「模型做了什麼」拆成幾種可以分別測試的狀態:身份是否正確、能力是否受控、程式結果是否新鮮、產物是否可定位、交付是否經過足夠審查。當其中一個狀態是 unknown,安全的行為不是補一段更有信心的文字,而是把不確定性傳遞到下一個 gate。

Provenance contract:至少要能回答這十個問題

v0.19.0 的 release notes 描述了 artifact lineage、connector provenance、session metadata 與 notebook dependency tracking 等能力,但沒有宣稱以下欄位就是公開且固定的 AIPOCH schema。這是一份可用來設計團隊研究紀錄的建議 contract:

欄位建議記錄用來檢查什麼
run_idrun、session、parent run 與 actor這次動作屬於哪個研究回合,誰觸發了它
input_ref檔案/資料集 URI、版本與必要的 hash輸入是否能被重新取得,內容是否已變更
code_refnotebook、cell、repository revision 與 environment lock哪份程式與執行環境產生結果
model_refmodel、provider、framework、protocol 與設定哪個推論路徑影響了結果
skill_refskill origin、publisher、SemVer、digest 與依賴能力是否來自已審查且可重建的套件
permission_snapshotconnector、filesystem、network 與 approval scope執行時實際被允許做什麼
dependency_snapshotoutput 依賴的變數、root object 與狀態為何 output 是 clearstaleunknown
artifact_refstable artifact ID、version、類型與 parent artifact這個檔案或圖形能否連回正確的 run
freshness狀態、判定時間、判定器版本與 rerun 結果交付時是否仍可把結果視為當前狀態
review_recordreviewer、決策、理由、時間與 export/replay 事件誰在什麼證據上批准、否決或重新執行

不要把 raw OAuth token、secret 或完整敏感輸入直接塞進這份紀錄;token_source、client identity、refresh outcome 與 secret reference 通常比 token 本身更適合進入 audit trail。證據欄位也應採 append-only 或 immutable version,使用者可編輯的標題、顏色與筆記則放在另外的 presentation layer,避免 UI 修改覆蓋研究事實。

這份 contract 的價值不是欄位越多越好,而是每個欄位都對應一個可執行的決策:缺少 dataset version 就不能宣稱可重現;unknown 就不能自動匯出;skill digest 改變就要跑 regression;artifact 找不到 parent run 就要標記 provenance 不完整。這也是把 release-level feature 轉成團隊 operating rule 的關鍵一步。

用一個工程模型讀這個 release

可以把 v0.19.0 的功能整理成研究工作流中的幾個決策點:

研究步驟系統要回答的問題v0.19.0 提供的對應團隊仍需驗證
選擇模型與身份這次請求代表誰?走哪個 protocol?xAI OAuth、device auth、token refresh、三種 protocol adaptersecret storage、scope、費用與多使用者隔離
載入能力Agent 用的是哪份操作知識?Marketplace origin、read-only publisher content、SemVer baselinedigest pinning、review、dependency 與 injection 測試
執行 Notebookoutput 是否仍對應當前變數?Python/R cross-run tracking、clear/stale/unknownparser 覆蓋率、動態程式碼、科學語義與 rerun policy
產生 evidence圖片與檔案從哪次執行來?stable artifact/version resolution、preview、read-only terminated notebookdataset/environment/seed 完整 provenance
重開或壓縮 session使用者看到的是什麼狀態?SQLite summary-first、compaction transcript boundarysummary loss、replay、export 與 disaster recovery

這個表也說明了為什麼不能只用「功能數量」評估 release。它的價值在於把失效模式放到產品表面:過期 output 不再默認新鮮;未經授權或 callback 不完整的 connector 不再只是背景錯誤;可更新的 skill 不再是任意覆寫的資料夾;artifact 也不再只能靠一段模型文字描述。

它解決了什麼,還沒有解決什麼

已經變清楚的邊界

第一,能力供應鏈有 origin、version 與 lifecycle。這讓團隊有機會對 skill 做 review、回滾與更新策略,而不是將所有操作指示視為同一種可信文字。

第二,Notebook 的 freshness 變成一級狀態。即使分析不是完整的語言語義證明,至少 unknownstale 能阻止 UI 默默把舊結果當成當前結果。

第三,身份與產物的可見性變好。OAuth connector、agent capability、artifact version、session summary 和 compaction boundary 都有更明確的 ownership 與查詢入口。

仍不能直接宣稱的事

  • clear 不等於科學結論正確;它只反映被系統追蹤的依賴沒有被判定為改變。
  • publisher content read-only 不等於 publisher 可信,也不等於 skill 具備最小權限。
  • OAuth lifecycle 完整不等於 token 一定安全;本機儲存、撤銷、log、redirect 與 connector scope 仍要單獨測試。
  • artifact lineage 不等於 citation correctness;資料來源、單位、統計方法與外部 API 回應仍需要 domain-specific validation。
  • release notes 能證明功能與 maturity 狀態,不能單獨證明 Agent reliability、研究產出品質或團隊 ROI。

官方 release 仍列出幾個重要限制:R 目前只能使用受管環境;遠端運算仍以 SSH 為主,尚未支援 Slurm 或雲端 GPU 提交;provider 選擇也受目前 framework 的 endpoint 相容性限制。

Review 採自願啟用,且只作用於個別紀錄,不能取代引用、單位、統計或研究方法的領域驗證。Sandbox、憑證保管庫與多人協作也仍在 roadmap 或尚未完成。這些限制反而讓 v0.19.0 的定位更清楚:它先處理 local-first workbench 的狀態邊界,並沒有把科學研究的責任外包給 Agent。

如果要導入,先建立五條團隊規則

如果你要把類似模式帶進自己的 research agent 或 AI platform,我會先建立以下規則,而不是先追求更多 tools:

  1. 任何 artifact 都要有 identity。 至少記錄產生它的 run、input、code revision、model、prompt/config、environment、dataset version 與時間;缺少的欄位要明確標成 unknown。
  2. 任何可改變行為的 skill 都當作 package。 固定來源與 digest,記錄 publisher 和依賴,更新走 review 與 regression;若只允許 editable copy,也要保留與原 package 的 lineage。
  3. staleunknown 都要進入 gate。 顯示警告只是第一步;在匯出報告、送出決策或寫入共享資料集之前,定義何時必須 rerun、何時需要人工批准。
  4. 把身份、能力與模型分開。 一個 subscription 可以服務多種 protocol,不代表每種 agent、connector 或 filesystem 都有相同 scope;execution identity 應該能被審計與撤銷。
  5. 用失效模式評估系統。 除了 task success,也測 false freshness、stale detection 的誤判、artifact provenance completeness、重跑成本、token 與 connector 費用、context compaction 後的 replay,以及 provider outage 時的 recovery。

Bloss0m 的判斷:真正的變化是從 chat history 走向 project state

Open Science v0.19.0 值得寫,不是因為它把所有 scientific agent 問題都解完,而是因為它示範了一條很務實的產品路線:把研究 Agent 的可靠性拆成一組可以被 UI、runtime 與資料層共同承擔的狀態契約。

Skills 需要來源與版本;Notebook output 需要 freshness;OAuth 需要身份與生命週期;Artifact 需要 stable ID 與 provenance;session 需要知道摘要和完整歷史的差別。這些東西放在一起,才形成一個可操作的 governance surface。

對想把 Agent 接進真實研究資料的團隊,最值得借鑑的不是某個特定模型或桌面介面,而是這個判斷:當 workflow 會產生程式、資料變更與可被引用的結果,系統的核心資料結構就不該只有 chat history,還必須有能被檢查、重跑與撤銷的 project state。

相關閱讀與原始來源

歡迎演講、企業內部技術分享與架構交流;可以先查看我適合分享的主題與公開工程成果。

演講與聯絡