Skip to content

命令(Slash Commands)

上下文视角:命令是用户侧的上下文注入快捷方式——将预定义 prompt 模板一键送入上下文。

上一节讲了 MCP 如何让 Agent 获得外部能力。能力有了,怎么高效触发?

输入 /review,Agent 不聊 review 的哲学,直接执行一套预定义的 review 动作。输入 /commit,它不问你要不要 commit,直接读 diff、生成消息、提交。

这就是 Slash Command:一个以 / 开头的快捷方式,背后是一段预先写好的 prompt 模板。你触发它,Agent 展开模板,塞进发给 LLM 的请求里。LLM 根本不知道你按了什么——它看到的只是一段结构化的指令。

>_ SLASH COMMANDS // GAMEPLAY 1. TRIGGER I need a fix! > /fix_bug Short alias for complex intent 2. EXPANSION /fix_bug Template Context Shell FULL PROMPT <system>...</system> <file>...</file> 3. INJECTION AI AGENT Prompt used once & discarded TASK DONE
>_ SLASH COMMANDS // GAMEPLAY 1. TRIGGER I need a fix! > /fix_bug Short alias for complex intent 2. EXPANSION /fix_bug Template Context Shell FULL PROMPT <system>...</system> <file>...</file> 3. INJECTION AI AGENT Prompt used once & discarded TASK DONE

命令展开的过程

当你执行 /review 时,Agent 读取关联的模板:

1. 对比当前分支与主干分支,找出所有被修改的文件。
2. 对每个变更文件,检查代码风格违规、潜在 bug 和可改进之处。
3. 生成简短报告,用项目符号列表总结每个文件的关键问题和建议。

Agent 将这段文本——连同它找到的文件变更——一起塞进请求:

json
// → REQUEST(agent → LLM API)
{
  "system": "你是一个资深代码评审员...",
  "messages": [
    {
      "role": "user",
      "content": "请遵循以下步骤进行代码评审:\n1. 对比当前分支与主干分支...\n2. 检查代码风格违规...\n\n变更文件 `index.js` 内容如下:\n// ... 文件内容 ..."
    }
  ]
}

LLM 并不知道你输入了 /review。它看到的只是一个非常具体的、结构化的指令。对它来说,这和用户手动输入一大段文字没有区别。

可内嵌内容

命令不只是纯文本。一个设计良好的命令可以打包多种元素:

  • 纯文本 Prompt:指令和问题。
  • 执行 Shell 命令/commit 可能先执行 git statusgit diff --staged,把结果注入上下文。
  • 读取文件/test [文件名] 读取测试文件和被测文件,然后要求 LLM 做思维实验。
  • 组合动作/publish 依次执行 lint、test、build、bump version。

与系统指令的区别

特性系统指令 (System Instructions)命令 (Slash Commands)
存在感默认存在,每轮请求自动包含按需触发,用户手动 / 触发时注入
作用域全局,影响 Agent 的每一次响应注入一次,留在当前对话中
角色Agent 的行为准则一次具体的任务清单
示例"你是一个 Python 专家,代码要符合 PEP8 规范"/test

系统指令定义 Agent "默认怎么做",命令定义"这次做什么"。两者冲突时——比如系统指令要求"谨慎操作",而 /force-push 要求"强制覆盖"——LLM 收到矛盾信号,行为变得不可预测。

什么该写成 command

能写成 command,不代表值得写。一个实用门槛是:你重复做了三次以上、步骤固定、每次都清楚自己想触发这件事。

最典型的候选是工作流检查点。代码评审前,你每次都要看 diff、跑 lint、确认测试通过。核心步骤相对固定,执行时机明确——你知道自己想做,只是不想每次手动输入一遍。团队常把 /review 写成 command,理由通常就在这里:它不依赖工具是否内置,只表达一套稳定的触发动作。

另一类候选是语境切换。从调试模式切到文档写作,或从功能开发切到性能排查,这些切换本身就是认知负担。一个 /debug-mode/doc-mode 让 agent 知道当前任务的性质,也让你自己明确"现在换了模式"这个动作。

command 的核心价值在于显式调用。你主动触发,agent 才执行;有些工具也允许模型调用 command,但这不等于所有 command 都该开放给模型。涉及 deploy、migrate、force push 的动作,不应允许模型自动调用。你按下那个 / 的时候,应该是在主动承担这次操作。

和 skill 的边界:skill 更像可被 agent 按需拿起的能力包;command 更像用户主动按下的按钮。不同工具的实现方式不同——有的把 command 和 skill 放在同一个体系里,通过配置控制触发方式(比如 Claude Code 新版通过 frontmatter 区分 invoke 模式),所以边界不再只看文件夹名字,而要看触发权交给谁。如果一套工作流需要"我来决定什么时候做",它不应允许模型自动调用;如果是"让 agent 在合适时机自己带上这套规则",可以允许模型自动加载。

和 hook 的边界:hook 不需要你触发,事件发生时自动执行。不要用 command 替代 hook 能做的事——不要写 /start-logging 这种命令,该用 hook 在 session 启动时自动挂载日志逻辑。显式调用适合"我来决定时机"的场景,事件触发适合"只要事件发生就执行"的场景。

本节小结

  • 上下文流动:用户输入 /command → Agent 展开为 prompt → 注入 messages → LLM 消费并响应。命令注入的内容留在当前对话中,不跨会话持久化。
  • 风险:命令可能与系统指令冲突。另外,包含危险操作的命令(如 /deploy/force-push)应该有确认机制——不是所有快捷方式都应该"一键到底"。
  • 可审计性:Agent 日志应记录哪个命令触发了后续动作。出了问题,能追溯到源头的命令定义是排查关键。

下一节看 Skills——命令由用户手动触发,全文直接展开;Skills 由 LLM 按需加载,启动时先以元数据形式存在。