TERMy決定論的ターミナルアシスタント – 高速でLLM不要のコマンド自動化

TL;DR

TERMy は、埋め込み表現や機械学習、大規模言語モデルを使用せずに自然言語のリクエストをシェルコマンドに変換する高速で決定論的なターミナルアシスタントであり、低リソース機器向けに安価で即時かつ安全です。


LLMを使わないターミナルアシスタントの重要性

従来のAI駆動のコマンドアシスタントは、GPUメモリを大量に消費し、トークンコストが発生し、遅延を引き起こす大規模言語モデル(LLM)に依存しています。TERMyはルールベースのパーサーと軽量なデータセット形式を使用することで、4GBのVRAMさえあればCPU上で1秒未満の応答が可能になります。


コア設計制約

TERMyは以下の3つの厳格な制約に基づいて構築されています:

  1. 埋め込み表現なし – システムはベクトル表現を保存しません。
  2. 機械学習なし – 推論は確率的ではなく決定論的です。
  3. LLMなし – すべての処理はホストCPU上で実行されます。 これらの制約により、ラップトップからRaspberry Pi Zeroまで、さまざまなデバイスで動作可能な最小限で予測可能な実装が実現されています。

NPC‑Forgeデータセット形式(NDF 0.0)

アシスタントは、各エントリが以下の内容を定義するJSONベースのデータセットを読み取ります:

  • カテゴリ – 論理的なグループ(例:linux_files)。
  • 入力フレーズ – 自然言語のトリガー。
  • ツール – 実行するシェルコマンドテンプレート。
  • メッセージ – ユーザーに表示されるテキスト応答。
  • 思考 – オプションの診断トレース。
  • 権限 – セキュリティフラグ("ask" は破壊的行動を示す)。

例:

{
  "category": "linux_files",
  "input": ["ファイル一覧", "ファイルとディレクトリ一覧"],
  "tools": [{
    "name": "run_in_terminal",
    "arguments": {
      "command": "ls -lah",
      "explanation": "現在のディレクトリ内のファイルを一覧表示します。",
      "goal": "現在のディレクトリの内容を表示する",
      "mode": "sync"
    }
  }],
  "message": "完了",
  "thinking": ["これは非常に簡単です!", "これは退屈ですね..."],
  "permission": "yolo"
}

新しい機能を追加するのは、dataset_docker.json のような別の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" としてマークされ、実行前にユーザーの確認が求められます。このシンプルなルールにより、誤操作による損害を大幅に低減しつつ、システムは完全に決定論的です。


パースパイプライン(約1000LOC)

TERMyのコアは、PythonとJavaScriptの両方で実装された2つのクロスランゲージクラス——FlintParserFlintNPC——で構成されています。処理ステップは以下の通りです:

  1. ノイズ除去 – 不適切な語、間投詞、感謝の言葉を削除。
  2. 感情分析 – ストリップされたトークンの軽量なカウント。タグ付けにのみ使用され、コマンド生成には使わない。
  3. 正確一致 – 入力フレーズの直接検索。
  4. テンプレート一致 – 変数抽出を伴うパターンマッチング。
  5. 確率的一致 – IDFT重み付きBag-of-WordsとLevenshtein距離を使用したフォールバック。タイポを許容。 最終ステップはオプションであり、以前の段階が失敗した場合にのみ呼び出されます。

パフォーマンスとハードウェアフットプリント

すべてのパイプラインがルールベースであるため、TERMyは中程度のラップトップ(i7‑4790K、16GB RAM、GTX 1050 Ti)でもミリ秒単位で応答します。GPUは不要で、メモリ使用量は10MB未満に保たれ、組み込みデバイスに適しています。


コミュニティからのフィードバック要約

  • Nate B.nl2bash 論文(arXiv 1802.08979)をリンクし、自然言語からシェルスクリプトへの変換に関する先行研究を指摘。
  • publlus_enigma は伝統的なNLPへの回帰を称賛し、依存関係の簡素化を強調。
  • zserge はこのアプローチをELIZA風のシステムに例え、より豊かなデータセット形式を特徴として挙げた。
  • superposition は、現在LLMベースのシェルでトークンを消費している開発者にとってのトークン節約の利点を強調。
  • mbil は、信頼度が低いクエリに対してTERMyがLLMにフォールバックし、自動的に新しいデータセットエントリを生成するハイブリッドモデルの提案——作者はこれも将来の課題として認識している。
  • dmos62 は、実行されたコマンドを毎晩分析してNPC‑Forgeレシピに変換する自己学習ルーチンの提案。外部モデルなしでシステムが成長可能になる。
  • paguasmarsuperposition は、TERMyを「メインモデル」として捉え、高コストなLLM APIから繰り返しタスクをオフロードできると評価。

既存のNLUフレームワークとの比較

機能 TERMy Rasa / NLP.js ChatScript
学習データ 手作業によるJSONデータセット 監督付きMLモデル スクリプトベースのルール
実行コスト CPUのみ、< 10MB Python/Javaランタイムが必要、GPUオプション 大きなC++バイナリ
ラテントシー 1秒未満 数秒〜数分(モデル読み込み) 変動
拡張性 JSONファイルを追加 モデルの再トレーニング 新しいスクリプトの作成
セキュリティ 権限フラグ、決定論的 モデルの信頼度に依存 手動のセキュリティチェック

GitHub Copilotとの統合

作者はTERMyをVS CodeにCopilot風のハッチとして接続しました。ユーザーが自然言語のコマンドを入力すると、TERMyは即座に適切なシェルスニペットを返し、トークンベースのLLM呼び出しを回避します。これにより、決定論的なエージェントが日常的なタスクを処理し、重いLLMは複雑で創造的なクエリにのみ割り当てられる実用的なワークフローを示しています。


今後の方向性

  • 自己学習 – 実行されたコマンドの毎晩分析により、新しいデータセットエントリを自動生成。
  • ハイブリッド信頼度ルーティング – 信頼度が低いリクエストをLLMに委譲し、生成されたコマンドを決定論的データセットに取り込む。
  • 広範なデバイス対応 – マイコンやIoTデバイスへの移植により、本当に普遍的なアシスタントを実現。
  • コミュニティデータセットの拡張 – ドメイン固有のJSONレシピ(Docker、Kubernetes、Gitなど)を共有するリポジトリの構築。

はじめ方

  1. NPC‑Forge リポジトリをクローン。
  2. PythonまたはNode.jsの依存関係をインストール(標準ライブラリのみ)。
  3. datasets/ にNDF 0.0スキーマに従ったJSONファイルを配置。
  4. flintnpc(Python)または flintnpc.js(Node)を実行してアシスタントを起動。
  5. 提供されたVS Code拡張を使用するか、CLIを直接呼び出す:termy "ファイル一覧"

結論

TERMyは、日常的なターミナル自動化において高コストなLLM呼び出しを、決定論的でルールベースのNLPで置き換える可能性を証明しました。即時応答、低リソース、明示的な権限ゲートによるセキュリティを維持しながら、軽量な会話型エージェントの分散型エコシステムを築くためのオープンソースデータセット形式を提供しています。

Sources

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト