TERMy 确定性终端助手 – 快速、无需大语言模型的命令自动化

TL;DR

TERMy 是一个快速、确定性的终端助手,将自然语言请求转换为 shell 命令,无需任何嵌入、机器学习或大语言模型,使其在低资源设备上廉价、即时且安全。


为什么非大语言模型的终端助手很重要

传统的 AI 驱动的命令助手依赖于消耗大量 GPU 内存、产生 token 费用并引入延迟的大语言模型(LLMs)。TERMy 通过使用基于规则的解析器和轻量级数据集格式,消除了这些缺点,使 CPU 上的响应时间低于 1 秒,甚至在仅有 4 GB VRAM 的设备上也能运行。


核心设计约束

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

  1. 无嵌入 – 系统不存储向量表示。
  2. 无机器学习 – 推理是确定性的,而非概率性的。
  3. 无大语言模型 – 所有处理都在主机 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": "在文件 <||file||> 中写入 <||string||>。",
      "goal": "目录分配",
      "mode": "sync"
    }
  }],
  "permission": "ask",
  "thinking": ["好的,我被要求创建文件 <||file||>。"]
}

标签词汇表单独定义,例如:

{"<||vocab_create||>": ["创建", "制作", "生成", "打造", "锻造"]}

正则表达式用于提取类型化实体,如文件名。


通过权限门控实现安全

每个数据集条目都包含一个 permission 字段。默认情况下,破坏性命令标记为 "ask",在执行前会提示用户确认。这一简单规则显著降低了意外损坏的风险,同时保持系统完全确定性。


解析流程(≈ 1000 行代码)

TERMy 的核心由两个跨语言类组成——FlintParserFlintNPC——分别用 Python 和 JavaScript 实现。处理步骤如下:

  1. 噪声去除 – 剔除感叹词、感叹语和感谢词。
  2. 情感分析 – 轻量级的剔除后标记计数,仅用于标签,不用于命令生成。
  3. 精确匹配 – 直接查找输入短语。
  4. 模板匹配 – 带变量提取的模式匹配。
  5. 概率匹配 – 使用 IDF 加权的词袋模型和 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 强调对当前在大语言模型 shell 上消耗 token 的开发者的 token 节省优势。
  • mbil 建议采用混合模型,当 TERMy 对低置信度查询无法处理时,可回退至大语言模型,并自动生成新的数据集条目——作者承认这是未来工作方向。
  • dmos62 提出每日自我学习机制,将已执行命令转化为 NPC‑Forge 食谱,使系统在无需外部模型的情况下持续成长。
  • paguasmarsuperposition 均认为 TERMy 可作为“主模型”,将重复性任务从昂贵的大语言模型 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 的大语言模型调用。这展示了实用的工作流:确定性代理处理常规任务,而重型大语言模型则保留用于复杂、创造性的查询。


未来方向

  • 自我学习 – 每日分析已执行命令,自动生成新的数据集条目。
  • 混合置信度路由 – 将低置信度请求委托给大语言模型,然后将生成的命令摄入确定性数据集。
  • 更广泛的设备支持 – 移植到微控制器和物联网设备,实现真正无处不在的助手。
  • 社区数据集扩展 – 共享特定领域的 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 可以替代昂贵的大语言模型调用,用于日常终端自动化,实现即时、低资源的命令生成,同时通过显式权限门控保持安全。其开源数据集格式鼓励社区贡献,为轻量级对话代理的去中心化生态系统铺平道路。

Sources

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目