模型 / 資料集
ax-llm/ax avatar
ax-llm/ax

Ax:以 TypeScript 為核心的 DSPy 多語言實作,值得審視的程式化 LLM 框架

The pretty much "official" DSPy framework for Typescript

2,924 個 Star194 個 ForkTypeScriptApache-2.0

秒懂

它是什麼?
Ax 將 DSPy 的程式化 LLM 開發模式帶到 TypeScript,並編譯出 Python、Java、C++、Go 與 Rust 套件。本文檢視其簽章、部署設定檔、代理與流程設計,並指出採用前須確認的關鍵限制。
適合誰用?
適合需要在 TypeScript 中採用 DSPy 風格的開發者,尤其是重視型別安全、串流解析與多語言一致性的團隊。不適合只想快速呼叫 LLM API 而不想學習簽章 DSL 的人,也不適合需要完整 Python DSPy 生態系(如大量現成最佳化器與社群範例)的專案。
可以商用嗎?
可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 6 天前。
用什麼語言寫的?
主要是 TypeScript(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

Ax 解決的問題:把 DSPy 的程式化模式帶出 Python

DSPy 原本是 Python 生態的產物,它主張用「簽章」與「最佳化器」取代手寫 prompt,讓 LLM 應用程式像傳統程式一樣可組合、可測試。Ax 宣稱自己是 DSPy 的 TypeScript 官方對應實作,但它的野心更大:README 明列 TypeScript、Python、Java、C++、Go、Rust 六種語言,且 TypeScript 是「source implementation」。這意味著它不是一個簡單的移植,而是想建立一個跨語言的共同程式模型。對 TypeScript 開發者來說,Ax 填補了一個真實空缺:以往要用 DSPy 就得開 Python 服務,或用不完整的 JS 移植。Ax 的目標使用者是那些已經在 Node.js 或前端工具鏈中建構 LLM 功能,卻想要 DSPy 那種結構化生成與自動最佳化能力的團隊。它同時服務於多語言 monorepo 的專案,因為同一套簽章邏輯可以編譯成不同語言套件。

簽章 DSL、fluent builder 與 Standard Schema:型別安全的核心

Ax 的基礎是簽章,它定義輸入與輸出的型別。README 提供一個簡單範例:ax('review:string -> sentiment:class "positive, negative, neutral"'),這是一個字串 DSL,描述從 review 字串到 sentiment 分類的轉換。執行後會回傳一個型別為 literal union 的 sentiment 值,也就是說 TypeScript 編譯器知道結果只能是 'positive'、'negative' 或 'neutral'。除了字串 DSL,還有 fluent 的 f() builder,以及支援任何 Standard Schema v1 驗證器的選項,例如 Zod、Valibot、ArkType。這是一個務實的設計:DSL 適合快速原型,而 Zod 等工具能讓既有驗證邏輯直接套用到 LLM 輸出。但這也帶來學習曲線,你必須理解簽章語法,而不是直接寫 prompt。Ax 的型別安全不是執行期才檢查,而是編譯期就反映在 TypeScript 型別上,這對大型程式碼庫有吸引力。文件中沒有詳細說明 DSL 的完整語法,實際使用前需要查閱 docs 目錄下的規格。

部署設定檔:名稱決定 wire 行為,不是 model ID

Ax 的 AI 用戶端設定採用「命名部署設定檔」的概念。在 30 秒範例中,ai({ name: "openai", apiKey: ... }) 建立一個用戶端,然後 switch name 到 "anthropic" 或 "google-gemini" 就能更換供應商,同一份簽章程式碼不需修改。關鍵在於:這個 name 不是單純的模型名稱,而是部署設定檔,它決定了 wire 行為。README 特別舉例:一個 DeepSeek 模型如果由 Together 代管,就應該用 Together 的端點與推理規則,而不是 DeepSeek 的原生格式。這個設計解決了多供應商整合的混亂,因為不同代管服務對同一模型的 API 格式可能不同。但這也意味著你必須事先知道每個模型要透過哪個供應商存取,如果直接指定 model ID 而沒有對應設定檔,可能無法正確連線。文件提到 docs/AI_PROFILES.md 有完整的部署設定檔與類別遷移說明,採用前應該先檢查你的模型是否在清單中。

串流是預設路徑:提早解析、提早失敗、節省 token

Ax 的設計哲學是串流優先,理由是它能在模型完成前就做有用的事。README 描述這個流程:邊抵達邊解析欄位、執行串流斷言、提早失敗、取消進行中的串流,然後啟動修正,而不必在已知輸出無效時繼續花 token。這是個聰明的成本控制手段,特別對長輸出或高延遲模型。當你只需要最終物件時,forward() 會回傳完整結果;需要增量輸出時,streamingForward() 直接暴露串流。Ax 聲稱其熱路徑很薄,只做「渲染簽章、呼叫 provider、解析結果、回傳型別值」,因此延遲接近直接呼叫 provider。倉庫內有一個串流延遲基準測試,可用環境變數設定 provider 與模型,例如 AX_STREAM_BENCH_PROVIDER=anthropic 與 AX_STREAM_BENCH_MODEL=claude-sonnet-4-5-20250929。README 宣稱近期在 Claude 與 Gemini 上的測試顯示 provider 佇列與模型生成主導延遲,但這些數據無法從文件中獨立驗證,實際效能需自己跑基準。

代理與流程:從單次生成到複雜程式圖

Ax 不只做單次生成,它提供 AxAgent 與 AxFlow。Agent 具備執行期、上下文預算、檢查點、動作日誌重播、探索、記憶、技能與委派。Flow 則是型別化的程式圖,支援分支、迴圈、回饋、快取行為、平行執行,以及 .returns(...) 投影。這兩個抽象讓開發者能建構多步驟的 LLM 應用,而不只是單一呼叫。README 的架構圖顯示 AxGen 連接到 AxAgent 與 AxFlow,而最佳化器(如 GEPA)則作用於這些結構。這與 DSPy 的模組化概念一致,但 Ax 將其包裝成 TypeScript 的型別安全 API。對比直接使用 OpenAI SDK 寫迴圈,Ax 提供內建的檢查點與重播機制,這對需要可重現性的代理應用有價值。不過,這些功能在 README 中只有列舉,沒有詳細的 API 範例,實際上手需要查閱 src/examples/ 目錄下的可執行範例。

多語言編譯:共享語意核心與檢查在 packages/ 的生成碼

Ax 最特別的宣稱是「一個語意核心」編譯成六種語言。README 提到 docs/COMPILER.md 解釋語言無關的 Ax 編譯器如何運作,而生成原始碼檢查在 packages/<language> 目錄下,方便檢視。當 AxIR(Ax 的中間表示)變更時,執行 npm run axir:generate-packages 可以重新整理套件。倉庫的範例執行器會使用這些已提交的套件,例如 npm run example -- python src/examples/python/generation/axgen-openai.py,不需要開發者記住各語言的編譯指令。這個設計有兩個含義:一是跨語言一致性對多語言團隊有吸引力,二是生成碼是「一等公民」,版本更新時必須重新生成。但這也帶來維護成本,因為每次 Ax 升級都可能觸發跨語言套件的變更,而檢查在 repo 中的生成碼會讓 diff 變大。文件中沒有說明編譯器是否支援所有語言的所有功能,例如 Go 的 runtime/goja actor runtime 是選用的,這暗示某些語言可能不是完整移植。

最佳化器與評估流程:GEPA 與可攜帶工件

Ax 包含最佳化器,例如 GEPA(Genetic Programming with Evaluators?文件未展開全名)與 few-shot bootstrapping。它支援可攜帶的最佳化器工件,以及評估與 apply 流程。這意味著你可以在某個環境最佳化 prompt,然後將工件帶到另一個環境套用。這對生產部署有實際價值,因為最佳化通常需要大量 token,不適合在每次請求時執行。README 沒有提供 GEPA 的具體用法,只說它存在於最佳化器清單中。對比 Python DSPy 的成熟最佳化器生態,Ax 的文件明顯較薄,這是一個風險點:你可能需要閱讀原始碼或範例才能理解如何驅動最佳化器。此外,最佳化器通常需要一個評估函式來衡量輸出品質,Ax 的文件沒有明確說明這個評估函式如何撰寫,這對新使用者是障礙。採用前應該先查看 src/examples/ 中是否有最佳化器的實際範例。

限制與替代方案:何時不該選 Ax

Ax 有幾個明顯的限制。第一,它宣稱支援六種語言,但 TypeScript 是唯一「source implementation」,其他語言是編譯生成,這意味著新功能可能先在 TypeScript 出現,其他語言有延遲。第二,文件相對精簡,README 只提供 30 秒範例與功能列表,深入細節依賴 docs/ 目錄與 src/examples/,這對需要快速評估的團隊是摩擦。第三,版本迭代快速,release 24.0.18 在 2026-09-09 發布,前一個是 24.0.17(09-01),再前是 24.0.16(08-31),一週內三個 minor release,這暗示 API 可能還在變動,升級成本需要納入考量。第四,Ax 的部署設定檔機制要求你理解供應商與模型的對應關係,如果目標模型不在官方設定檔中,可能需要自行擴充,文件沒有詳細說明擴充方式。替代方案是直接使用各供應商的 SDK(如 openai、@anthropic-ai/sdk),搭配 Zod 手動驗證輸出,這能完全控制 wire 格式,但會失去 DSPy 的簽章抽象與最佳化器。另一個替代是 Python 的原始 DSPy,它的生態系與社群範例更成熟,但需要跨語言服務。對比之下,Ax 的價值在於型別安全與多語言一致性,但犧牲了 Python 生態的豐富度。

編輯結論

適合需要在 TypeScript 中採用 DSPy 風格的開發者,尤其是重視型別安全、串流解析與多語言一致性的團隊。不適合只想快速呼叫 LLM API 而不想學習簽章 DSL 的人,也不適合需要完整 Python DSPy 生態系(如大量現成最佳化器與社群範例)的專案。採用前應先驗證:你的目標模型是否在官方 AI_PROFILES.md 中有對應的部署設定檔,因為設定檔名稱決定了 wire 行為,而非單純的 model ID;另外,若你依賴 Zod 以外的 Standard Schema 驗證器,需確認其相容版本。Ax 的跨語言承諾仰賴其編譯器與檢查在 packages/ 下的生成程式碼,若你的團隊只使用單一語言,這層抽象可能帶來不必要的升級成本。最終判斷:Ax 是 TypeScript 生態中少見的完整 DSPy 實作,但其多語言野心與快速版本迭代(24.0.x 系列)意味著你必須準備好追蹤每個 minor release 的變更。

官方來源

  1. ax-llm/ax on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社群筆記

社群筆記