TERMy 確定性終端助手 – 快速、無 LLM 的命令自動化
TL;DR
TERMy 是一個快速、確定性的終端助手,能將自然語言請求轉換為 shell 命令,且不使用任何嵌入向量、機器學習或大型語言模型,使其在低資源機器上既便宜、即時又安全。
為何非 LLM 終端助手至關重要
傳統的 AI 驅動命令助手依賴大型語言模型(LLM),消耗大量 GPU 記憶體,產生 Token 成本並引入延遲。TERMy 透過使用基於規則的解析器與輕量級資料集格式,消除這些缺點,使 CPU 上僅需 4 GB VRAM 即可實現亞秒級回應。
核心設計限制
TERMy 建立在三個硬性限制之上:
- 無嵌入向量 – 系統不儲存向量表示。
- 無機器學習 – 推理是確定性的,而非機率性的。
- 無 LLM – 所有處理皆在主機 CPU 上執行。 這些限制迫使系統採用最小化、可預測的實作,可在從筆電到 Raspberry Pi Zero 的各種裝置上運行。
NPC‑Forge 資料集格式(NDF 0.0)
助手讀取基於 JSON 的資料集,其中每個項目定義:
- 類別 – 邏輯分組(例如
linux_files)。 - 輸入語句 – 自然語言觸發詞。
- 工具 – 要執行的 shell 命令範本。
- 訊息 – 顯示給使用者的文字回應。
- 思考 – 選用的診斷追蹤。
- 權限 – 安全旗標(
"ask"表示可能具有破壞性的動作)。
範例項目:
{
"category": "linux_files",
"input": ["列出檔案", "列出檔案與目錄"],
"tools": [{
"name": "run_in_terminal",
"arguments": {
"command": "ls -lah",
"explanation": "列出目前目錄中的檔案。",
"goal": "顯示目前目錄內容",
"mode": "sync"
}
}],
"message": "完成",
"thinking": ["這非常簡單!", "這很無聊..."],
"permission": "yolo"
}
新增功能僅需將另一個 JSON 檔案(例如 dataset_docker.json)放入資料集目錄即可。
模板式意圖解析
為處理如檔案名稱等變數元素,TERMy 使用 模板意圖。模板定義了一序列標籤,每個標籤代表一個詞彙集或類型化實體。檔案建立範例:
{
"intent": "file_creation",
"category": "linux_files",
"type": "template",
"structure": [[
{"tag": "<||vocab_create||>", "type": "vocab", "required": true},
{"tag": "<||vocab_file||>", "type": "vocab", "required": false},
{"tag": "<||file||>", "type": "filename", "required": true}
]],
"message": "<||completion||>",
"tools": [{
"name": "run_in_terminal",
"arguments": {
"command": "echo '' > '<||file||>' && termy_set_context 'active_file' '<||file||>'",
"explanation": "將 <||string||> 寫入檔案 <||file||>。",
"goal": "目錄配置",
"mode": "sync"
}
}],
"permission": "ask",
"thinking": ["好的,我被要求建立檔案 <||file||>。"]
}
標籤詞彙集另行定義,例如:
{"<||vocab_create||>": ["建立", "製作", "產生", "打造", "鑄造"]}
正規表示式用於提取如檔案名稱等類型化實體。
透過權限閘門確保安全
每個資料集項目皆包含 permission 欄位。預設情況下,具有破壞性的命令標記為 "ask",執行前會提示使用者確認。此簡單規則大幅降低意外損壞風險,同時保持系統完全確定性。
解析流程(≈ 1000 LOC)
TERMy 的核心由兩個跨語言類別組成——FlintParser 與 FlintNPC——分別以 Python 與 JavaScript 實作。處理步驟如下:
- 雜訊清除 – 移除咒罵語、感嘆詞與感謝詞。
- 情緒分析 – 輕量級的清除後詞元計數,僅用於標籤,不參與命令生成。
- 精確匹配 – 直接查找輸入語句。
- 模板匹配 – 使用模式匹配與變數提取。
- 機率匹配 – 使用 IDF 加權的 Bag‑of‑Words 與 Levenshtein 距離作為備用,容忍拼字錯誤。 最後一步為可選,僅在先前階段失敗時觸發。
性能與硬體佔用
由於整個流程皆為基於規則,TERMy 在一般筆電(i7‑4790K,16 GB RAM,GTX 1050 Ti)上可於 毫秒級 回應。無需 GPU,記憶體佔用低於 10 MB,適合嵌入式裝置。
社群反饋精選
- Nate B. 提及 nl2bash 論文(arXiv 1802.08979),指出先前已有將自然語言轉換為 shell 指令的研究。
- publlus_enigma 贊揚回歸傳統 NLP,強調簡化依賴堆疊的優勢。
- zserge 將此方法類比為 ELIZA 式系統,但擁有更豐富的資料集格式。
- superposition 強調對目前耗用 LLM 指令的開發者而言,節省 Token 的優勢。
- mbil 建議採用混合模型,讓 TERMy 在低信心查詢時回退至 LLM,並自動產生新資料集項目——作者承認此為未來工作方向。
- dmos62 提出每晚執行自我學習程序,將執行的命令轉換為 NPC‑Forge 菜譜,使系統能在無外部模型的情況下成長。
- paguasmar 與 superposition 均認為 TERMy 可作為「主模型」,將重複性任務從昂貴的 LLM API 中釋放出來。
與現有 NLU 框架的比較
| 特性 | TERMy | Rasa / NLP.js | ChatScript |
|---|---|---|---|
| 訓練資料 | 手動撰寫的 JSON 資料集 | 監督式機器學習模型 | 腳本式規則 |
| 執行成本 | 僅 CPU,< 10 MB | 需要 Python/Java 執行環境,可選 GPU | 大型 C++ 二進位檔 |
| 延遲 | 亞秒級 | 數秒至數分鐘(模型載入) | 變動 |
| 可擴展性 | 新增 JSON 檔案 | 重新訓練模型 | 新增腳本 |
| 安全性 | 權限旗標、確定性 | 取決於模型信心 | 手動安全檢查 |
與 GitHub Copilot 的整合
作者將 TERMy 整合至 VS Code,作為類似 Copilot 的介面。當使用者輸入自然語言命令時,TERMy 即時回傳適當的 shell 片段,跳過基於 Token 的 LLM 呼叫。此示範了實用工作流程:由確定性代理處理例行任務,而重型 LLM 則保留給複雜、創造性的查詢。
未來方向
- 自我學習 – 每晚分析已執行命令,自動產生新資料集項目。
- 混合信心路由 – 將低信心請求委派給 LLM,再將生成的命令納入確定性資料集。
- 更廣泛的裝置支援 – 適配至微控制器與 IoT 裝置,實現真正無所不在的助手。
- 社群資料集擴展 – 共享領域特定的 JSON 菜譜儲存庫(Docker、Kubernetes、Git 等)。
開始使用
- 克隆 NPC‑Forge 儲存庫。
- 安裝 Python 或 Node.js 依賴(僅標準程式庫)。
- 將符合 NDF 0.0 模式的 JSON 檔案填入
datasets/目錄。 - 執行
flintnpc(Python)或flintnpc.js(Node)啟動助手。 - 使用提供的 VS Code 延伸模組,或直接呼叫 CLI:
termy "列出檔案"。
結論
TERMy 證明,確定性、基於規則的 NLP 可取代昂貴的 LLM 呼叫,用於日常終端自動化,提供即時、低資源的命令生成,同時透過明確的權限閘門維持安全性。其開源資料集格式鼓勵社群貢獻,為輕量級對話代理的去中心化生態系鋪路。
Sources
相關
- 專案
- 專案
- 專案
- 專案
- 專案