TypeChat:用 TypeScript 型別取代 prompt engineering 的介面層
TypeChat is a library that makes it easy to build natural language interfaces using types.
秒懂
- 它是什麼?
- 微軟開源的 TypeChat 把自然語言介面的控制點從提示詞搬到型別定義上,由程式負責組提示、驗證回應、必要時請模型自行修復。這篇談它的機制、實際安裝與設定、以及它明顯不適用的場合。
- 適合誰用?
- 如果你已經有一組穩定的 TypeScript 型別可以描述使用者意圖,而且能接受多一次模型往返換取結構化輸出,TypeChat 值得先裝起來跑一個最小 schema 驗證流程;如果你的場景是自由文本生成、串流逐字輸出,或你無法為意圖寫出封閉的型別集合,這個函式庫會變成阻礙,直接呼叫模型 API 更省事。動手前先確認三件事:你的模型是否支援結構化輸出或穩定的 JSON 回應、你的驗證函式能否給出可讀的錯誤訊息(這決定修復迴圈的有效性)、以及修復重試次數與失敗後的降級路徑由誰決定。
- 可以商用嗎?
- 可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 6 天前。
- 用什麼語言寫的?
- 主要是 TypeScript(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
它真正取代的是決策樹,不是提示詞
傳統做法裡,一個自然語言介面通常靠決策樹判斷使用者想做什麼,再一層層收集參數。TypeChat 的 README 把這條路徑換成另一種:先用型別描述應用支援的意圖,例如一個判斷情緒的 interface,或購物車、音樂應用這種較複雜的結構。意圖要擴充時,就往 discriminated union 裡加一個型別;要讓 schema 分層,就用一個 meta-schema 依使用者輸入挑選子 schema。
所以它的核心主張不是「少寫 prompt」,而是把不確定性關進型別系統裡。決策樹的節點是人工窮舉的,型別的組合則由編譯器與執行期驗證共同守住。這個轉換有個前提:你的意圖必須能被寫成封閉的型別集合。做不到這件事的應用,用 TypeChat 反而多一層。
三段資料流:組提示、驗證、非 LLM 摘要
README 把 TypeChat 在型別定義之後接手的工作列成三步。第一步是用型別組出送給 LLM 的提示。第二步是驗證模型回應是否符合 schema,不符合就透過進一步的語言模型互動修復。第三步是用不經過 LLM 的方式,把實例摘要成簡短文字,用來確認結果符合使用者意圖。
第三步是整個設計裡最容易被忽略、也最值得注意的一段。摘要刻意不走模型,意味著確認環節不會再引入一次生成誤差,代價是摘要品質取決於函式庫對實例的處理方式,而不是模型的表達能力。第二步的修復則是把驗證失敗當成正常路徑而非例外:模型第一次吐出的東西不合 schema 並不算災難,而是觸發下一輪對話的訊號。這也解釋了為什麼這個函式庫的延遲特性與單純呼叫一次模型不同。
安裝與可用的語言實作
TypeScript/JavaScript 的安裝指令在 README 裡寫得很直接:
npm install typechat
README 另外列出可從原始碼使用的實作,包括 Python、TypeScript 與 C#/.NET 三個目錄或倉庫。要注意的是,README 中被註解掉的區塊顯示 PyPI 與 NuGet 的套件安裝路徑並未啟用,也就是說那兩個生態系的官方套件發佈狀態,從這份材料無法確認。若你要用 Python 或 .NET,得預期是從原始碼走,而不是一行套件安裝指令。
想要看實際運作,README 建議直接讀 typescript/examples 下的範例專案,可以在本機或 GitHub Codespace 執行。這是最快理解 schema 該怎麼寫的方式,因為 README 本身沒有給出完整的型別範例。
驗證失敗的修復迴圈是成本,也是風險
把「驗證失敗就再問一次模型」寫進核心流程,等於承認輸出穩定性不是常態。這個設計在實務上有兩個直接後果。第一是每次請求的模型呼叫次數不固定,最壞情況是多輪往返,延遲與費用都隨之上升。第二是修復本身也可能失敗,而 README 沒有描述重試上限或最終失敗時的行為,這部分必須由使用端的程式碼決定。
還有一個更根本的邊界:驗證只能保證結構正確,不能保證語意正確。一個符合 schema 的物件,欄位值仍可能是模型編出來的。README 提到的第三步摘要正是為此存在,它讓你能把實例拿回來對照使用者原意,但這個確認動作是給人看的,不是自動判斷。如果你的流程完全無人檢視,這層保護等於沒有生效。
什麼時候不該用它
TypeChat 假設輸出是一份可被型別描述的結構化物件。如果你的應用要的是自由文本、長篇生成、逐字串流顯示,這個假設就不成立,硬套只會讓你在型別裡塞進一個 string 欄位,等於白做。
另一個不適合的情況是意圖本身無法窮舉。客服對話、開放式問答這類場景,使用者想做的事沒有邊界,寫不出封閉的 discriminated union。此時 schema 會不斷膨脹,維護成本轉移到型別定義上,而這正是它想幫你避開的那種脆弱性。
還有一種常被忽略的狀況:當你的模型已經原生支援結構化輸出,而且你的需求只是「拿到一份 JSON」,TypeChat 的驗證與修復層就顯得多餘。它的價值在於型別驅動的提示組裝與失敗修復,不在於把 JSON 解析出來。
與手寫 prompt 加 JSON Schema 的差異
最直接的替代方案是自己寫 prompt,附上一份 JSON Schema,然後用既有的驗證器檢查回應。兩者的差別在失敗之後發生什麼事。手寫路線通常是把錯誤往外拋,由呼叫端決定要不要重試;TypeChat 則把重試內建為流程的一部分,並且會把不符規格的輸出送回模型請它修正。
第二個差別在提示的來源。手寫 prompt 是一段會隨需求增長的文字,README 自己也指出這種做法「comes with a steep learning curve and increased fragility as the prompt increases in size」。TypeChat 把提示的生成綁在型別上,型別改了提示就跟著改,不需要手動同步兩份會漂移的東西。代價是你被綁在 TypeScript 的型別表達能力上,而某些約束用型別寫起來比用自然語言描述更繞。
如果你的團隊本來就有完整的 JSON Schema 治理流程,自己接驗證器並不見得比較差,只是重試邏輯要自己寫。
授權、維護與升級的現實
專案採用 MIT 授權,這是寬鬆授權,允許修改與再散布,但這篇不提供法律意見,商用前仍應由法務確認你們的使用方式。倉庫未被封存,README 也保留了微軟的貢獻者授權協議與行為準則流程,代表外部貢獻需要先簽 CLA,PR 會由機器人標記狀態。
這份材料沒有檢索到任何近期 release,因此無法從版本節奏判斷升級成本。可觀察的維護訊號只有最後推送時間與倉庫未封存這兩項。實際採用前,比較務實的做法是先確認 typescript/examples 裡的範例是否仍能在你使用的模型與執行環境上跑起來,因為範例與函式庫版本之間的同步狀況,是這類工具最容易斷掉的地方。
編輯結論
如果你已經有一組穩定的 TypeScript 型別可以描述使用者意圖,而且能接受多一次模型往返換取結構化輸出,TypeChat 值得先裝起來跑一個最小 schema 驗證流程;如果你的場景是自由文本生成、串流逐字輸出,或你無法為意圖寫出封閉的型別集合,這個函式庫會變成阻礙,直接呼叫模型 API 更省事。動手前先確認三件事:你的模型是否支援結構化輸出或穩定的 JSON 回應、你的驗證函式能否給出可讀的錯誤訊息(這決定修復迴圈的有效性)、以及修復重試次數與失敗後的降級路徑由誰決定。這三點在 README 裡都沒有預設答案,必須由你的程式碼補上。
社群筆記