1. 为什么你的 AI 总是“懂很多,却做不对”
很多人用 AI 工具时都有同一种挫败感:问它“怎么部署一个 Docker 容器”,它能给你讲得头头是道;但真让它动手,它就开始泛泛而谈,步骤跳来跳去,甚至把关键参数漏掉。问题不在于模型不够聪明,而在于它只掌握了“是什么”,没有掌握“怎么做”。
这就是记忆系统和技能系统的分水岭。记忆(比如 MEMORY.md)存的是事实,像“这个项目用 pnpm”“CI 走 GitHub Actions”;而技能(SKILL.md)存的是方法论,是“把这件事跑通的具体步骤”。记忆是被动的,技能是主动的、可复用的工作流。
这篇就聚焦 Skills 技能系统的落地配置。我会以 SKILL.md 为切入点,演示在 Hermes 这类 AI 工具里怎么定义技能文件、挂载技能目录,让模型按“怎么做”执行任务,而不是每次都从零推理。文末会给一条验证动作:新增技能后触发调用,确认 AI 是按技能步骤输出,而不是泛泛回答。适合已经在用 Hermes、想让 Agent 真正“会干活”的同学。
2. 前置准备:TaoToken 与 Hermes 的接入关系
在动手写 SKILL.md 之前,先把模型调用这条链路打通。Hermes 本身是执行框架,真正干活的还是背后的模型,所以你需要一个稳定的模型接入点。我这边用的是 TaoToken,它的 API 地址是https://taotoken.net/api,兼容常见的 OpenAI 风格调用方式,配置起来比较省事。
先拿到 API Key。打开控制台里的 API Keys 页面(https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=skills_apikey),新建一个 Key,复制出来。注意这个 Key 只在创建时完整显示一次,丢了就得重建。
拿到 Key 之后,在 Hermes 的模型配置里填两样东西:Base URL 填https://taotoken.net/api,API Key 填刚才复制的。如果你用的是环境变量方式,可以这样写:
export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_API_KEY="sk-你的TaoToken密钥"配好之后先别急着写技能,用一条最简单的请求确认模型通了:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "回复两个字:通了"}] }'返回里能看到"content": "通了"就说明链路没问题。这一步很关键,因为后面技能触发失败时,你得先排除是模型没通还是技能没挂上。如果你更习惯在网页里直接验证模型,也可以去模型对话页(https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=skills_chat)发一条消息试试,确认账号和模型都正常。
3. 可复制配置:SKILL.md 骨架与目录结构
技能系统的核心就是 SKILL.md 这个入口文件。它描述技能的用途、输入参数和执行步骤。Hermes 的技能按分类目录组织,一个技能目录下不只有 SKILL.md,还可以带附件。完整结构长这样:
~/.hermes/skills/ ├── mlops/ # 分类目录 │ ├── axolotl/ │ │ ├── SKILL.md # 主文件(必须) │ │ ├── references/ # 参考文档(可选) │ │ ├── templates/ # 输出模板(可选) │ │ └── scripts/ # 辅助脚本(可选) │ └── vllm/ │ └── SKILL.md ├── devops/ │ └── deploy-k8s/ │ ├── SKILL.md │ └── references/ └── .hub/ # Skills Hub 状态(自动生成) ├── lock.json └── audit.logreferences/ 放详细文档,templates/ 放输出模板,scripts/ 放辅助脚本。SKILL.md 是入口,负责把这几块串起来。下面是一个可以直接复制的骨架,我拿“Python 项目初始化”当例子:
--- name: python-project-init description: 初始化一个标准 Python 项目,包含虚拟环境、依赖管理和基础目录结构 trigger: - 初始化Python项目 - 新建Python工程 - python project init inputs: - name: project_name description: 项目名称 required: true - name: python_version description: Python 版本,默认 3.11 required: false steps: - 创建项目目录并进入 - 用 python -m venv 创建虚拟环境 - 生成 requirements.txt 和 .gitignore - 创建 src/ 与 tests/ 目录 - 输出初始化完成的结构树 --- # Python 项目初始化技能 ## 用途 把“新建一个 Python 项目”这件事标准化,避免每次手动建目录、漏掉 .gitignore。 ## 执行步骤 1. 执行 `mkdir -p {{project_name}} && cd {{project_name}}` 2. 执行 `python{{python_version}} -m venv .venv` 3. 写入 requirements.txt,内容为 `# 依赖列表` 4. 写入 .gitignore,忽略 `.venv/`、`__pycache__/`、`*.pyc` 5. 创建 `src/` 和 `tests/` 目录 6. 用 `tree -L 2` 输出结构,确认结果 ## 注意事项 - 如果目录已存在,先询问用户是否覆盖 - 虚拟环境激活命令按操作系统区分:Linux/macOS 用 `source .venv/bin/activate`这个骨架里,trigger决定什么时候自动触发,inputs定义参数,steps是模型要照着走的动作。{{project_name}}这种占位符会被实际参数替换。写完之后,把它放到~/.hermes/skills/devops/python-project-init/SKILL.md,目录名和name保持一致,方便管理。
挂载技能目录这一步,Hermes 默认读~/.hermes/skills/,一般不用额外配置。如果你用的是容器方式,记得把宿主机的技能目录挂进去,否则容器里看不到:
docker run -it \ -v ~/.hermes/skills:/root/.hermes/skills \ -e OPENAI_BASE_URL="https://taotoken.net/api" \ -e OPENAI_API_KEY="sk-你的TaoToken密钥" \ hermes:latest这样技能文件在宿主机改,容器里立刻生效,不用每次重建镜像。
4. 验证请求:新增技能后触发调用
技能写好了,得验证它真的被调用,而不是模型自己瞎编。先确认技能被识别:
/skills如果列表里出现了python-project-init,说明挂载成功。接下来触发它。在对话里输入:
帮我初始化一个 Python 项目,名字叫 demo-api重点观察模型的输出。如果技能生效,它会按 SKILL.md 里的步骤走:先建目录、再建虚拟环境、写 .gitignore、最后输出结构树。如果技能没生效,模型大概率会给你一段“你可以先安装 Python,然后创建虚拟环境……”的泛泛回答,步骤顺序也可能是乱的。
我实测下来,判断技能是否真正触发,看两个信号最准:一是输出里出现了 SKILL.md 中定义的固定动作(比如tree -L 2的结构树),二是步骤顺序和steps字段一致。只要这两点对上,就说明模型是在“按技能执行”,而不是自由发挥。
如果你想更严格一点,可以在 SKILL.md 里加一句“执行前先输出[skill: python-project-init]”,这样每次触发都能在日志里看到标记,排查起来更快。
5. 本篇常见错排查
技能系统踩坑主要集中在“没触发”和“触发了但跑错”两类。下面这几个是我遇到过的高频问题。
技能列表里没有我的技能。先检查目录层级。Hermes 要求~/.hermes/skills/<分类>/<技能名>/SKILL.md,如果你把 SKILL.md 直接放在skills/根目录下,它不会被识别。另外文件名必须是大写SKILL.md,小写skill.md在部分系统上会读不到。
技能识别了但对话里不触发。多半是trigger关键词没覆盖到你的说法。比如你写的是“初始化Python项目”,但用户说的是“帮我建个 Python 工程”,匹配不上就不会自动触发。解决办法是把常见同义说法都加进trigger,或者直接在对话里点名:“用 python-project-init 技能帮我建项目”。
触发了但步骤执行到一半报错。常见原因是技能依赖的 Python 包在容器里没装。如果你用的是--rm临时容器,每次退出容器就销毁,运行时环境不保留,技能文件虽然持久化在~/.hermes/skills/,但依赖包得重新装。频繁用技能的话,建议换成常驻容器,依赖装一次就能持续用。
模型没按步骤走,自己加戏。这通常是 SKILL.md 的steps写得太模糊。把每一步写成可执行的具体动作,而不是“配置好环境”这种抽象描述。步骤越具体,模型越不容易跑偏。
API 调用报 401 或超时。先确认OPENAI_BASE_URL是https://taotoken.net/api,Key 没有多余空格。如果 Key 是在控制台刚建的,注意复制完整。需要重新生成的话,去 API Keys 页面(https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=skills_apikey2)操作。接入细节和参数说明可以对照接入文档(https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=skills_doc)核对。
6. 把技能用起来:从单次调用到长期复用
技能系统真正的价值,是让成功的经验固化下来。你第一次手动跑通一个多步骤任务,让 Hermes 把它提炼成 SKILL.md,下次同类任务就能一键复用。Hermes 不会为每个简单操作都建技能,一般要满足几个条件才会自动生成:任务涉及超过 5 次工具调用、包含错误恢复或多步骤调试、或者本身是可复用的工作流(比如搭 CI 流水线、部署 Docker 容器)。
你也可以主动要求。比如刚完成一个多步骤任务后说:“把刚才这个操作流程保存成可复用的技能文件。”它会分析执行过程,提炼关键步骤和注意事项,生成对应的 SKILL.md。
如果你打算长期跑编码类任务或者搭 Agent 工作流,建议把模型调用也固定下来,用 Coding Plan(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=skills_plan)会比每次临时配 Key 省心。技能文件写好后,配合稳定的模型接入,Agent 才算真正从“会聊天”升级到“会干活”。
最后留一个实用习惯:每写完一个 SKILL.md,先手动触发一次,确认输出和steps对得上,再放进日常流程。技能库慢慢攒起来之后,你会发现很多重复劳动都能交给它,而且每次执行的结果是稳定的、可预期的。