TERMy 確定性終端助手 – 快速、無 LLM 的命令自動化

TL;DR

TERMy 是一個快速、確定性的終端助手,能將自然語言請求轉換為 shell 命令,且不使用任何嵌入向量、機器學習或大型語言模型,使其在低資源機器上既便宜、即時又安全。


為何非 LLM 終端助手至關重要

傳統的 AI 驅動命令助手依賴大型語言模型(LLM),消耗大量 GPU 記憶體,產生 Token 成本並引入延遲。TERMy 透過使用基於規則的解析器與輕量級資料集格式,消除這些缺點,使 CPU 上僅需 4 GB VRAM 即可實現亞秒級回應。


核心設計限制

TERMy 建立在三個硬性限制之上:

  1. 無嵌入向量 – 系統不儲存向量表示。
  2. 無機器學習 – 推理是確定性的,而非機率性的。
  3. 無 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 的核心由兩個跨語言類別組成——FlintParserFlintNPC——分別以 Python 與 JavaScript 實作。處理步驟如下:

  1. 雜訊清除 – 移除咒罵語、感嘆詞與感謝詞。
  2. 情緒分析 – 輕量級的清除後詞元計數,僅用於標籤,不參與命令生成。
  3. 精確匹配 – 直接查找輸入語句。
  4. 模板匹配 – 使用模式匹配與變數提取。
  5. 機率匹配 – 使用 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 菜譜,使系統能在無外部模型的情況下成長。
  • paguasmarsuperposition 均認為 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 等)。

開始使用

  1. 克隆 NPC‑Forge 儲存庫。
  2. 安裝 Python 或 Node.js 依賴(僅標準程式庫)。
  3. 將符合 NDF 0.0 模式的 JSON 檔案填入 datasets/ 目錄。
  4. 執行 flintnpc(Python)或 flintnpc.js(Node)啟動助手。
  5. 使用提供的 VS Code 延伸模組,或直接呼叫 CLI:termy "列出檔案"

結論

TERMy 證明,確定性、基於規則的 NLP 可取代昂貴的 LLM 呼叫,用於日常終端自動化,提供即時、低資源的命令生成,同時透過明確的權限閘門維持安全性。其開源資料集格式鼓勵社群貢獻,為輕量級對話代理的去中心化生態系鋪路。

Sources

相關

  • 專案
  • 專案
  • 專案
  • 專案
  • 專案