| Date | Decision | Rationale |
|---|---|---|
| 2025-12-15 | 採用憲法-子法層級架構 | 類似 speckit 的規則層級,可擴展且清晰 |
| 2025-12-15 | DDD + DAL 獨立架構 | 業務邏輯與資料存取分離,提高可測試性 |
| 2025-12-15 | Skills 模組化拆分 | 單一職責,可組合使用,易於維護 |
| 2025-12-15 | Memory Bank 與操作綁定 | 確保專案記憶即時更新,不遺漏 |
| 2026-01-01 | Neural-Symbolic 混合架構 | Agent 做推導規劃,SymPy 做精確計算 |
| 2026-01-01 | MVP 暫不含 Lean4 | 技術複雜度高,先用維度檢查 + 反向驗證 |
| 2026-01-01 | Test-Driven Design 方法 | 先定義題目和期望結果,再實作系統 |
| 2026-01-02 | 公式知識庫三層架構 | principles(基礎)→ domain(領域)→ derived(推導),支援狀態追蹤和社群貢獻 |
| 2026-01-02 | sympy-mcp 足以執行推導 | 實測藥動學 ODE 推導成功,NSForge 專注知識管理而非計算引擎 |
| 2026-01-02 | 步進式推導哲學 | 人類推導是一步一步的,每步都可加入新元素變成新公式。不應該一步求解!這是我們與純符號系統最大的不同。 |
| 2026-01-02 | 新增橋接工具 | derivation_record_step + derivation_add_note 讓人類知識可以在推導過程中隨時注入 |
| 2026-01-02 | 強化 NSForge 推導工具 | 5 個推導工具(substitute, simplify, solve_for, differentiate, integrate)直接支援 notes/assumptions/limitations 參數,每步計算都帶知識記錄 |
| 2026-01-02 | Handoff 機制 | 新增 derivation_export_for_sympy + derivation_import_from_sympy + derivation_handoff_status,實現 NSForge ↔ SymPy-MCP 無縫轉換。當 NSForge 無法處理(ODE, 矩陣, 極限等)時自動轉給 SymPy-MCP,完成後再導入回來繼續步進式推導。 |
| 2026-01-21 | v0.2.4 Production-Level 品質標準 | 完成全面品質驗證:類型安全(MyPy 0 errors)、程式碼品質(Ruff)、安全掃描(Bandit)、測試覆蓋(31/31)。確立提交 ToolUniverse PR 的準備標準:文檔完整、類型安全、測試通過。 |
| 2026-01-21 | ToolUniverse PR 策略 | 經分析確認 NSForge 高度適合 PR 至 ToolUniverse:(1) 互補性高:現有 700+ 工具缺符號推導能力;(2) 不重複:PK/PD 工具僅查詢資料,不推導公式;(3) 不會太重:作為 local MCP tool 獨立運作。定位為「Computational Science Tools」,強調與現有藥學工具的協同作用。 |
| 2026-01-04 | USolver 協作橋接 | 新增 derivation_prepare_for_optimization() 支援與 USolver MCP 協作。NSForge 負責推導領域修正公式,USolver 負責找最佳參數值。採用橋接工具模式:自動分類變數類型、提取參數值、生成領域約束、輸出 USolver 範本。協作帶來價值:領域智慧(藥物交互作用、體脂、年齡)+ 數學精確(Z3/OR-Tools/CVXPY/HiGHS 優化)= 可操作的最佳值。 |
「NSForge 可以推導出修正後的公式,但如何找到最佳參數值?」
NSForge 強項:
- 推導領域修正公式
- 注入專業知識(藥物交互作用、體質差異)
- 追蹤推導溯源
USolver 強項:
- 找到最佳參數值
- 四種求解器(Z3, OR-Tools, CVXPY, HiGHS)
- 滿足約束條件
功能:將 NSForge 推導結果轉換為 USolver 可用格式
自動處理:
-
變數分類 - 啟發式識別優化變數 vs 參數
if "dose" in var.lower() or var in ["t", "x", "y"]: optimization_vars.append(var) # 需要找最佳值 else: parameters[var] = extract_from_steps(var) # 從推導中提取
-
約束生成 - 根據變數類型生成領域約束
dose: 0.001 ≤ dose ≤ 0.100 (mg)t: t ≥ 0concentration: C ≥ 0
-
範本輸出 - 提供完整 USolver 使用範例
返回:
function_str: 函數字串function_latex: LaTeX 顯示variables: 優化變數列表parameters: 參數與值suggested_constraints: 建議約束usolver_template: 可直接使用的範本workflow_next_steps: 工作流指引
Phase 1: NSForge 推導
────────────────────
derivation_start("Fentanyl dosing with modifications")
derivation_substitute("CL", "CL_ref * (1 - 0.3*BF) * (1 - 0.02*age)")
derivation_substitute("V1", "V1_ref * (1 + 0.5*BF)")
...
→ C(t, dose) = dose/V1_adj × exp(-CL_adj/V1_adj × t)
Phase 2: 準備優化
────────────────────
derivation_prepare_for_optimization()
→ 返回:
- variables: ["dose", "t"]
- parameters: {"CL_adj": 9.52, "V1_adj": 15.875}
- constraints: ["dose >= 0.001", "dose <= 0.100", "t >= 0"]
- USolver template with examples
Phase 3: USolver 求解
────────────────────
[使用 USolver MCP]
solve_optimization(
function="dose/15.875 * exp(-9.52/15.875 * t)",
objective="C(t=5) close to 2.5",
constraints=["dose >= 0.001", "dose <= 0.100"]
)
→ optimal_dose = 0.035 mg (35 mcg)
情境:65 歲體脂 30% 併用 midazolam 的病人
NSForge 推導:
- 體脂修正清除率:-30%
- 年齡修正:-2%/年
- 藥物交互作用(midazolam):-25%
- → 最終清除率降至 9.52 L/hr
USolver 優化:
- 目標:術後 5 分鐘血中濃度 2-3 ng/mL(鎮痛有效)
- 約束:劑量 1-100 mcg
- → 最佳劑量 = 35 mcg
| 單獨使用 | 協作使用 |
|---|---|
| NSForge: 推導公式,但不知道給多少 | NSForge: 考量所有修正因子 |
| USolver: 優化參數,但用標準公式 | USolver: 找到最佳值 |
| 結果: 精確但不貼近現實 | 結果: 35 mcg,同時考量體質、年齡、交互作用 |
為何不在 NSForge 內建優化?
- 職責分離:NSForge 專注推導,USolver 專注優化
- 避免重複造輪子:USolver 已有 4 種工業級求解器
- 擴展性:未來可與其他 MCP 協作(Lean4 驗證、CORE 文獻)
為何選擇橋接工具模式?
- 自動化:減少 Agent 手動格式轉換
- 領域知識注入:約束條件來自專業判斷
- 可追溯:完整工作流記錄在 Skill 文檔
創建 .claude/skills/nsforge-usolver-collab/SKILL.md(~300 行):
- 4 階段工作流程
- 3 個典型用例(藥物劑量、電路設計、資源分配)
- 完整 Fentanyl 範例(含數值)
- 故障排除(變數分類錯誤、約束過嚴)
- 求解器選擇指南(線性→HiGHS、組合→OR-Tools)
NSForge 定位更新:
原來: 推導領域修正公式(終點)
現在: 推導領域修正公式(起點) → 為下游工具準備輸入
├─ USolver: 優化求解
├─ SymPy-MCP: 複雜計算(已有 Handoff)
└─ 未來: Lean4 形式驗證、CORE 文獻檢索
「我們的推導如果無法執行的時候要轉給 SymPy-MCP,但怎麼轉?」
NSForge 專注於:
- 步進式記錄
- 人類知識注入
- 公式溯源存檔
SymPy-MCP 專長於:
- ODE/PDE 求解
- 矩陣運算
- 極限/級數
- 向量微積分
功能:導出當前推導狀態給 SymPy-MCP
返回:
intro_many_command: 可直接執行的變數定義指令current_expression: 當前表達式introduce_expression_command: 可直接執行的表達式載入指令suggested_actions: 建議的下一步操作
功能:從 SymPy-MCP 導入計算結果
參數:
expression: SymPy-MCP 的結果operation_performed: 執行了什麼操作sympy_tool_used: 使用的工具名稱notes: 人類說明assumptions_used: 使用的假設limitations: 結果的限制
效果:
- 記錄為新步驟
- 更新當前表達式
- 保持完整的推導歷史
功能:顯示能力邊界和 Handoff 選項
返回:
- NSForge 能做什麼
- 什麼需要交給 SymPy-MCP
- 當前推導狀態
- Handoff 流程指引
NSForge: derivation_start → ... → 遇到 ODE
↓
NSForge: derivation_export_for_sympy()
↓
→ intro_many_command
→ current_expression
↓
SymPy-MCP: intro_many([...], 'real positive')
SymPy-MCP: introduce_expression("...")
SymPy-MCP: dsolve_ode(...)
SymPy-MCP: print_latex_expression(...)
↓
NSForge: derivation_import_from_sympy(
expression="...",
operation_performed="Solved ODE",
sympy_tool_used="dsolve_ode",
notes="...",
assumptions_used=[...],
limitations=[...]
)
↓
NSForge: 繼續步進式推導...
- 能力互補 - NSForge 知識管理 + SymPy-MCP 複雜計算
- 無縫銜接 - 不需要手動轉換格式
- 保持追蹤 - 即使轉給 SymPy-MCP,步驟仍然完整記錄
- 知識注入 - import 時可以加入 notes、assumptions、limitations
- NSForge 是主控 - 推導會話始終在 NSForge
- SymPy-MCP 是執行器 - 只負責計算,不管理狀態
- Agent 做橋接 - 根據需要呼叫 export/import
- 人類知識不丟失 - 每次 import 都可以加入說明
「人類的推導是一個步驟一個步驟來的!」
這意味著:
- 不是一步求解 - 不能給起點終點就自動跑完
- 每步都可加入新元素 - 推導過程中發現的洞見可以即時注入
- 變成新公式 - 加入修正後就是一個更穩定、不一樣的新公式
| 純符號系統 | NSForge 步進式推導 |
|---|---|
| 輸入 → 自動求解 → 輸出 | 輸入 → 步驟1 → 人類洞見 → 步驟2 → 修正 → ... |
| 公式是靜態的 | 公式是演化的 |
| 人類只看結果 | 人類參與過程 |
| 無法加入領域知識 | 每步都可注入專業判斷 |
傳統做法(一步求解):
給定: MM equation + Arrhenius
求: V_max(T)
結果: V_max_ref * exp(E_a/R * (1/T_ref - 1/T))
步進式推導:
Step 1: 載入 Michaelis-Menten
Step 2: 代入 Arrhenius for V_max
📝 Note: 假設 V_max 遵循 Arrhenius,但酵素在高溫會變性
Step 3: 加入 Hill-type 校正因子
📝 Note: γ(T) = 1 / (1 + (T/T_denat)^n) 描述變性行為
Step 4: 簡化得到最終形式
→ 這是一個「新公式」,比原始 Arrhenius 更適用於生物系統!
- 保留計算步驟分離 - 每個操作都是獨立步驟
- 新增橋接工具 -
derivation_record_step,derivation_add_note - notes 是一等公民 - 人類知識與數學推導同等重要
- 產生的是「演化過的公式」 - 不只是數學變換,而是加入了領域知識的新公式
NSForge 不只是「符號計算的 wrapper」,而是:
「讓人類專家與符號系統協作,產生經過專業判斷的推導結果」
討論如何實作「Principle + Modifications → Derived Form」框架。
實測 sympy-mcp 可以:
- 解藥動學 ODE(一室模型)
- 代入修正公式(體脂肪校正、溫度校正)
- 從 Arrhenius 方程推導溫度依賴藥動學模型
結論:不需要額外的推導引擎,sympy-mcp 已足夠。
採用「公式知識庫」架構:
formulas/
├── principles/ # 基礎物理定律(不變)
├── domain/ # 領域公式(有文獻)
└── derived/ # 推導公式(可增長)
├── proposed/ # 待檢驗
└── verified/ # 已檢驗
- 公式(LaTeX + SymPy)
- 推導來源(可追溯)
- 狀態(proposed/verified/deprecated)
- 文獻引用
- 使用限制
- 驗證狀態
- 避免重造輪子
- 可追溯推導來源
- 品質分級(proposed vs verified)
- 知識庫可持續增長
需要讓 AI Agent 能進行可驗證、可重現的符號推導。
- Agent 可以寫公式(表達沒問題)
- Agent 直接輸出推導(無法保證正確)
- SymPy 執行計算(100% 正確)
- SymPy 不知道「下一步該做什麼」
推導規劃是核心缺口:
- SymPy 是執行器,不是規劃器
- Lean4 可驗證,但不會自動規劃
- LLM 可規劃,但可能出錯
採用 Neural-Symbolic 混合方案:
- Agent + 人:做推導規劃(選策略、決步驟)
- MCP Server:檢查步驟合理性
- SymPy:執行每一步計算
- Verifier:維度檢查 + 反向驗證
- 發揮 Agent 的靈活性
- 保留 SymPy 的精確性
- 可驗證可追蹤
- 技術複雜度可控
MVP 必做:
- DSL Parser - 解析推導腳本
- Step Executor - SymPy 執行
- Basic Verifier - 維度 + 反向驗證
- Formula KB - 3-5 領域核心公式
- MCP Wrapper - Agent 可呼叫工具
暫不實作:
- Lean4 形式驗證
- 自動推導規劃
- 完整公式庫
- 先驗證核心概念
- 從具體題目擴充公式庫
- 形式驗證可後續加入
採用 Test-Driven 方法:
- 先定義具體題目(5 個 Level)
- 定義期望的 DSL 腳本和輸出
- 選 2-3 題做 prototype
- 從 prototype 回饋修正設計
- Level 1: 單步 SymPy(微分、積分)
- Level 2: 單公式(理想氣體、運動學)
- Level 3: 多步推導(RC 濾波器、碰撞力學)
- Level 3.5: 含 ODE(藥動學)
- Level 4: 交互式(參數不足)
- Level 5: Lean4-style tactics | 2026-01-01 | 架構演化:從「完整推導模板」到「可組合推導框架」 | 用戶關鍵洞察:「公式是理想化的(如 F=ma),但現實問題需要修正(加入摩擦力)」。這意味著我們不可能窮舉所有問題的完整模板。正確的做法是:
- 提供基礎原理(principles)- 由 Lean4 證明的理想化定理
- 提供修正項庫(modifications)- friction, drag, heat_loss 等
- 提供推導引擎 - Agent 根據問題特徵動態組合
- 提供常見變體 - 社群貢獻的 derived_forms
這樣既保證理論正確性(Lean4),又能應對無限可能的實際問題。 |