Hermes 渗透工作台调优实战:Skill 索引、知识库触发与提示词
Hermes 渗透工作台调优实战:Skill 索引、知识库触发与提示词
日期:2026-08-25
作者视角:我是这套工具的使用者和搭建者,这篇文章记录我从"发现问题"到"想清楚机制"再到"定方案"的完整过程。涉及 Hermes 的 skill 加载机制、我的知识库为什么不被自动检索、RAG/索引/向量这些概念的辨析,以及最终的触发设计。
状态:讨论记录,未实施
一、我的问题:它总是"忘记"查我的知识库
我在用 Hermes 做渗透测试时,经常遇到一个困扰:我丢给它一个 URL,它就开始测了,但不会自动去查我积累的知识库,也不会自动去翻我的工具库。有时候明明扫出来是 Nacos,它却不会自动带上我知识库里 Nacos 相关的方法论。
一开始我以为是"工具/知识库缺一个检索索引"——给它们也建个目录不就行了?但越研究越发现,问题不在索引,在于触发。这篇文章把我搞清楚的整个过程记下来。
二、先搞懂:Hermes 到底怎么"按需加载"skill 的
研究下来,它的机制是这样的:
- 每次对话开始,系统把所有 skill 的名称 + 一句话描述注入到系统提示里,相当于给模型一份"目录页"。
- 收到消息后,模型把消息内容和这些描述做语义匹配,觉得相关就用
skill_view把完整 SKILL.md 拉进上下文,照着执行。 - 系统提示里有硬规则:skill 匹配或部分相关时必须加载,宁可多加载也不漏。
- 之所以不全文注入所有 skill:200+ 个 skill 全文塞进上下文,token 会爆炸,而且互相干扰。所以只注入描述、按需拉全文。
流程一句话:描述注入 → 语义匹配 → 强制加载 → 按经验执行。
所以它"自动加载 skill"不是因为它聪明,而是机制设计如此——目录在它眼前,匹配上了就必须去拿书。
用实测验证:.skills_prompt_snapshot.json 就是那份目录
我在 C:\Users\0xMouise\.hermes\.skills_prompt_snapshot.json 找到了这份索引的真实产物,结构如下:
{
"skills": [ 209 条 skill 卡片
{ "skill_name": "nacos-blackbox-testing",
"category": "pentest",
"description": "Nacos 配置中心黑盒测试——未授权端点矩阵... Use when 发现 Nacos 控制台/API 暴露(8848 或 /nacos/ 反代)...",
"platforms": [],
"conditions": { "requires_toolsets": [], ... } }
],
"category_descriptions": { 15 个分类的一句话描述 },
"manifest": { "pentest\\nacos-blackbox-testing\\SKILL.md": [修改时间, 文件大小], ... }
}
构建流程(会话启动/技能变更时,无人参与):
- 扫描
~/.hermes/skills/下所有分类目录 - 读每个
SKILL.md的 YAML frontmatter,抽出name/description/platforms/conditions——只读 frontmatter,不读正文 manifest记录每个文件的 [修改时间, 大小] 做增量缓存:文件没变不重新解析,变了才更新- 把 209 张卡片 + 15 个分类描述拼装成系统提示里的
## Skills (mandatory)段落
运行时匹配(每次对话):
- 目录页每轮都在眼前
- 我收到消息 → 把消息内容和 209 张卡片做语义匹配(LLM 推理,不是关键词 grep,也不是向量检索)
- 命中 → 调用
skill_view→ 从磁盘读取完整 SKILL.md(含正文)→ 按正文执行
两个实测确认的关键事实:
- 注入的只是"卡片"不是全文:209 个 skill 全文会 token 爆炸,所以只注入描述。
- 描述截断到前 ~57 字符:快照里很多描述结尾带
...(如ai-ml-security显示为"AI/ML security playbook. Use when assessing model supply ...")——匹配依据只有截断后的这几十个字符,触发词必须出现在前 57 字符内,否则正文写得再好,目录页上也看不到,等于没有这本书。
对比我的知识库:knowledge\ 下的 .md 文件没有任何一步在这个流程里——扫描器只扫 skills/,不扫 knowledge/;目录页里没有知识库条目,所以永远不会自动匹配、自动读取。
skill 数量与 token 成本(实测):卡片越多,每轮都在付钱
研究到这里我又追问了一个问题:skill 多了,描述注入的内容就多了,是不是浪费 token? 实测结论:是,而且是每轮固定开销。
skill 数量: 209
description 总字符: 12,140
卡片总字符(含格式): 19,775
全部注入字符: 21,729(+1,954 分类描述)
估算 token: ~1.1万 ~ 1.7万
关键事实:这是"每轮固定开销"。 系统提示每次请求都会完整发送,所以这 1 万+ token 不是一次性成本,而是每一轮对话都消耗。聊 100 轮 = 100 万 token 花在"重复读取 skill 目录"上。
skill 多的代价不只有 token:
| 代价 | 说明 |
|---|---|
| token 浪费 | 每轮 ~1.1-1.7 万 token,占系统提示相当比例 |
| 匹配噪声 | 卡片越多,语义匹配命中不相关 skill 的概率越高——该加载 Nacos 的结果把相近的也拉出来 |
| 互相干扰 | 描述雷同的 skill 可能被同时加载,正文互相冲突 |
| 注意力稀释 | 209 张卡片 + 工具定义 + 规则,真正相关的信号被淹没 |
机制上已有"条件注入"的口子,但我没配置:快照里每个 skill 卡片有 conditions 字段(requires_toolsets / fallback_for_toolsets 等),现在是全空数组 = 209 个 skill 无差别全量注入。Hermes 支持按 toolset 条件控制某些 skill 只在特定工具集下注入卡片,但我的 skill 都没配置这个字段。
应对三条线:
- 数量控制(治本):合并同主题 skill(中英文双份、同主题多份去重),删掉过时/不再用的 skill。209 个里很多是外部导入的通用 playbook,对渗透未必都需要。
- 描述精炼(治本):描述每多 1 个字符 = 每轮多 1 字符成本。前 57 字符放触发词,后面能短则短。
- 条件注入(治标但有效):给渗透类 skill 配置
requires_toolsets,让无关分类(email、productivity 等)在渗透会话里不注入卡片——省下的是整类整类的 token。
三、关键发现:我的知识库是"看不见的档案室"
这是整件事最核心的发现。Hermes 有三种"记忆"资源,地位完全不同:
| 机制 | 模型眼前有什么 | 是否自动匹配加载 |
|---|---|---|
| Skill | 名称 + 描述(含 Use when 触发词)全量注入 | ✅ 语义匹配命中 → 自动 skill_view |
| MEMORY | 全文注入,每轮都在 | ✅ 永远看得见 |
| Knowledge | 什么都不注入 | ❌ 完全不可见,除非主动去搜 |
结论:知识库不是 Hermes 的一等公民,它没有注册进加载机制。 模型眼前只有 skill 目录和 MEMORY,知识库是它"看不见的档案室"——它只有两种方式知道档案室存在:MEMORY 里的路径提示,或者加载了 pentest-experience-hub 这类导航 skill。
而这两条路都依赖模型主动发起检索动作。"主动"就意味着可能忘记。
上次渗透 Nacos 就是活例子:nacos-blackbox-testing 描述里有"Nacos",模型自动加载了,方法论齐全;但我知识库 框架漏洞\Nacos\Nacos弱口令.md 那个文件,它压根没想起来翻。而且说实话,就算翻了,知识库里 Nacos 也只有弱口令一个文件,价值远低于 skill——那次没检索,功能上没损失,但机制上确实是漏了,这个事实值得记住。
四、顺便把概念理清:RAG、检索索引、向量检索
讨论中我一度以为"这不就是 RAG 吗",后来才理清楚:
RAG 是什么
- 传统 RAG(检索增强生成):文档切块 → embedding 向量化 → 存向量库 → 每次生成前按相似度检索 → 把相关内容注入上下文。它有独立的检索器。
- Hermes 的 skill 机制:没有向量库、没有 embedding,模型本身就是检索器——靠语义理解匹配描述文本。
- 广义 RAG:从"生成前先从外部知识源取回相关内容"这个定义看,skill 加载、知识库检索都属于 RAG 家族的轻量实现。
我的知识库做不到"自动 RAG",是因为它缺了 RAG 最核心的检索索引——没有一行索引注入到模型眼前(连描述都没有),只有 MEMORY 里的路径提示。检索动作只能靠模型主动发起,所以永远是"半自动"。
检索索引 = 书本目录
预先建好"关键词 → 位置"对照表,查表定位,不用扫全书。局限是字面匹配:搜"密码"找不到写"凭据/口令"的文档。
向量检索 = 按意思找
把文字变成数字向量(embedding),意思相近的文字向量也相近,按"距离"找最近内容。一个更准确的类比:不是"根据意思推断目录页码",而是"这本书没有目录,但每页都有意思坐标,报个意思直接翻最接近的那几页"。
浏览器/搜索引擎属于哪一类
- 浏览器 Ctrl+F = 全文扫描(无索引,实时扫当前页)
- 搜索引擎 = 传统倒排索引(提前建表,关键词 → 文档列表)+ 少量向量辅助(BERT/MUM 做同义词/错字/多语言,主索引仍是关键词)
浏览器 Ctrl+F → 全文扫描(无索引)
搜索引擎 → 传统索引(倒排索引)+ 少量向量辅助
向量检索服务 → 纯语义匹配(意思对意思,无关键词表)
五、我的知识库该怎么搭:结论是别上向量库
| 方案 | 需要数据库? | 适合 | 成本 |
|---|---|---|---|
| 轻量索引(INDEX.md / index.json) | 不需要,一个 JSON 文件就是数据库 | 几十~几百个文件、关键词可枚举 | 零 |
| 完整 RAG(Chroma/FAISS + bge-small-zh/m3e) | 嵌入式向量库(FAISS/Chroma 只是本地目录,非独立服务);大规模才用 Qdrant/Milvus | 几千篇以上、检索词五花八门 | embedding 模型 + 向量库 + 检索逻辑 |
两个概念别搞混:传统索引存关键字 → 位置;向量索引存向量(数字数组),不存关键字。
对我这种渗透方法论知识库,别上完整 RAG。 检索词几乎全是可枚举的框架/漏洞名(Nacos、若依、ThinkPHP、SSRF、SQLi),关键词精确匹配就够了;全套 RAG 是纯负担。务实方案:index.json 索引 + 一个路由 skill 让模型读取,零部署零依赖。
六、回到核心:为什么丢个 URL 它不触发,以及怎么设计触发
能触发 Hermes 的四种信号(按可靠性排序)
| 信号源 | 原理 | 可靠性 |
|---|---|---|
| 系统提示硬规则 | 每轮注入,模型必须遵守 | 最高,确定性 |
| MEMORY 常驻规则 | 全文每轮注入,模型永远记得 | 高,确定性 |
| Skill 描述语义匹配 | 描述注入 → 模型判断命中 | 中,概率性 |
| 用户显式说"开测" | 直接指令 | 最高(但依赖人记得说) |
为什么一个 URL 触发不了它
拆开看:模型眼前 200 个 skill 描述,全是"Use when 做 X 测试"——都需要动作词。消息里只有一个 URL,没有动作意图,语义匹配时 URL 和所有描述的重叠度都很低,模型判断"没有 skill 直接相关"→ 什么都不加载。MEMORY 里的 Workflow Entry Points 写的是"需要检索经验时"的入口,不是"收到目标时"的入口。
一句话:URL 是数据,不是指令。触发靠"数据 + 动作意图"的组合,意图缺失,一切索引都是死文件。
触发链怎么设计:把"查索引"变成流程的强制第一步
别指望模型"灵光一现想起来查索引"——那是概率事件。正确做法是把"查索引"设计成流程的第一步,流程一触发,索引必查:
触发点(信号)
├─ MEMORY 规则:"用户丢出 URL/IP/域名且未说明用途 → 默认进入授权渗透流程"
├─ 入口 skill 描述拓宽:"Use when 收到测试目标(URL/IP/域名)"
└─ 用户一句话:"这个是授权目标,开测"
↓
流程启动(强制步骤,写死在 skill 里)
第 1 步:加载 onlytools-tool-index → 确定本机可用工具
第 2 步:加载 pentest-experience-hub → 按目标指纹检索知识库
第 3 步:按 web-pentest-methodology 走 侦察→指纹→验证
设计要点:"查索引"必须是 skill 里的编号步骤,不能是"建议"。比如 pentest-experience-hub 现在写"具体文件动态检索,不维护静态清单"——这就是给模型留自由度,自由度 = 可能忘记。改成"第 1 步固定 search_files 检索 X 目录",才是强制。
触发方案对比(讨论层面)
| 方案 | 触发强度 | 本质 | 代价 |
|---|---|---|---|
| 改 MEMORY:"丢 URL 默认=授权渗透目标" | 确定性高 | 把意图固化进常驻规则 | 可能误触发(只是让看个网页);MEMORY 空间 |
| 拓宽入口 skill 描述:"Use when 收到 URL/IP" | 概率中高 | 让 URL 单独就能命中导航 skill | 描述面宽 → 更多误加载 |
| 新建"目标入口编排 skill" | 高 | 一个 skill 串起 工具导航+知识库路由+流程 强制步骤 | 多一个 skill |
| 自定义工具/MCP"目标注册" | 确定性最高 | 丢 URL 时调用工具,工具内部自动查索引 | 要开发 |
模型为什么会"忘记"——本质是注意力稀释
模型"忘记",本质是注意力被稀释:200 个 skill 描述 + MEMORY + 用户消息,URL 只是一个小信号,淹没在噪声里。要做的是放大信号,不是祈祷模型记性好。放大手段按效果排序:
- 常驻规则(MEMORY 写死流程)——每轮都在,最可靠
- 流程强制(skill 里编号步骤,不许跳)——命中一次就全带上
- 描述拓宽(让 URL 单独命中)——治本但有噪声
- 用户习惯(丢 URL 时带一句"开测")——最省事但依赖人
落地实录:我实际怎么做的(2026-08-25 执行)
上面讨论的是"方案层",下面是真正执行后的样子——每一处都对应一个可验证的改动:
① MEMORY 触发约定(最硬的一条,已写入)
在 C:\Users\0xMouise\.hermes\memories\MEMORY.md 的 Workflow Entry Points 末尾新增:
- **触发约定**:用户丢出 URL/IP/域名且未说明用途时,默认视为授权渗透目标,
先加载 pentest-experience-hub + onlytools-tool-index,按 侦察→识别→验证 流程走;
如明确说"仅看网页/资料"则不走渗透流程。
要点:给了豁免分支("仅看网页/资料"就不走渗透)——既解决"忘了开测"又防"误触发"。
② 导航 skill 描述拓宽(让 URL 单独就能命中)
pentest-experience-hub 和 onlytools-tool-index 的 description 都从"Use when 授权安全测试需要..."扩成"Use when 收到 URL/IP/域名目标需要选工具/检索经验..."——URL 出现时这两个导航 skill 的描述匹配度立刻上升。
③ 知识库索引落地(index.json)
C:\Users\0xMouise\.hermes\knowledge\index.json 建好:8 大类 122 条索引,覆盖 164 个文件。每条含 keywords(框架名/别名/CVE/指纹词)+ path + files。检索实测 8 个典型场景全命中。
④ 工具库 tags 补全
E:\OnlyTools\config\tools.json 224 个工具全部补精准 tags(别名/用途/框架/漏洞类型)。实测:nacos、若依、shiro、sql注入、免杀、webshell 等场景全部命中。
⑤ 触发链最终形态(写进 skill 的强制第一步)
pentest-experience-hub 检索流程改为:
第 1 步:查 knowledge/index.json(★必做)
识别到框架/产品指纹/漏洞类型/工具需求 → 按 keywords 匹配 → 读对应 path
第 2 步:目录检索入口(index.json 未命中时降级)
按 框架漏洞/漏洞类型/攻击链/案例/检查清单 等目录手动搜
⑥ 效果自检(我拿真实对话验证过)
- 丢一个 URL 不带任何说明 → MEMORY 约定命中 → 自动进渗透流程(但方向不精准,会先问/先侦察)
- 丢 URL + "是授权目标" → 动作意图明确 → 导航 skill + 索引 + 工具全链路触发
- 丢 URL + "查一下这个框架的经验" → 直接命中 index.json 框架分类 → 读对应文件
- 丢 URL + "仅看网页" → 豁免分支生效,不走渗透
⑦ 同一套逻辑同步到了 opencode
C:\Users\0xMouise\.config\opencode\AGENTS.md 同步更新:
- 技能库大类速查改为新 9 大类(web/pentest/infra/recon/office/defense/research/web3/autonomous-ai-agents)
- Skill 调用纪律第 1 条加入"识别到框架/漏洞类型后先查 knowledge/index.json"
一句话总结落地经验:触发设计不是写一段话让模型"记得",而是把触发点(MEMORY/描述/索引/工具表)全部物理落盘,让模型每次都被同一套信号命中。
七、进阶:三类资源统一改造——"描述精准 + 关键字索引"的三级模型
我听完上面的讲解后总结出一套理解:不只是 skill 需要检索索引,每个 skill 的描述也要更精准;检索索引里要加入匹配关键字;我的工具和知识库也得按 skill 的方法来。 验证下来大部分对,但有一个关键认知要拧正——skill 不需要额外的检索索引,它已经有索引了(描述注入就是它的索引机制)。真正缺索引的是知识库和工具库。
三类资源地位与补法总表
| 资源 | 模型眼前有什么 | 缺什么 | 补法 |
|---|---|---|---|
| Skill | ✅ 名称+描述已注入(索引已在) | 描述不够精准,匹配不上 | 优化描述:触发词前置、写精准 |
| 工具库 | ❌ 只有 onlytools-tool-index 导航 skill(可能没被加载) |
工具表缺关键字;导航 skill 描述太窄 | 拓宽导航描述 + 工具索引表带关键字 |
| 知识库 | ❌ 完全不可见 | 没有任何索引 | 建 index.json(带关键字)+ 导航 skill 读取 |
核心原则:模型看不见的东西(工具、知识库),都必须有一个"看得见的入口"(导航 skill 描述)+ 一份"带关键字的索引"(index 文件)。模型看得见的东西(skill 描述),要精准、触发词前置。
1. Skill:不需要加索引,需要"描述精准"(最高杠杆)
- 系统提示里展示的是描述截断后的前 57 字符,所以触发词必须放在描述最前面,不能藏在后面。
- 精准 = 包含框架名/漏洞类型/场景词,让模型一眼就能匹配。
- 反面教材:描述写"蓝凌OA测试"远不如"Use when 目标出现 /data/ 路径、版权'蓝凌软件'、.do 结尾"——具体指纹就是最好的触发词。
2. 索引条目要带"匹配关键字"
index.json 每条条目应包含:框架名 + 别名 + 指纹词 + 路径 + 一句话摘要。示例:
{ "keywords": ["nacos", "配置中心", "8848", "derby", "jraft"],
"path": "SRC挖掘技巧/框架漏洞/Nacos/",
"summary": "未授权端点矩阵、Derby SQL 判定、RCE 门控" }
这样模型匹配到"8848"或"derby"都能命中,而不仅仅是"Nacos"三个字——关键字越多,命中面越宽,漏检越少。
3. 工具和知识库:只能用"降级版" skill 方法
Skill 的方法是"描述注入系统提示",但工具表和知识库文件不能全部注入(token 爆炸)。所以只能用降级方案:
Skill 的方法(完整版): 描述注入 → 语义匹配 → 直接加载
工具/知识库的方法(降级版):导航 skill 描述注入(能匹配到入口)
→ 模型读索引表 → 按关键字定位具体文件
- 工具库具体做法:
onlytools-tool-index描述拓宽为"Use when 收到 URL/IP/目标需要选工具" + 工具表(tools.json)每条带用途关键词(如"端口扫描 → nmap、masscan")。 - 知识库同样:
pentest-experience-hub描述拓宽 +index.json带关键字。
统一模型(一句话记住)
Skill 靠描述精准;工具和知识库靠"入口描述 + 关键字索引"。三者共同点:让"目录"带够触发词,模型才能命中。
八、落到渗透场景:什么东西放 Knowledge,什么东西做成 Skill
理清楚机制后,最该落地的问题就是:我既然用 Hermes 做渗透,哪些东西该放知识库、哪些该做成 skill? 我的判断标准一句话:
"下次遇到同类目标,我要照着做的步骤" → Skill
"我验证过的结论、踩过的坑、参考过的资料" → Knowledge
决策检查表(5 问,按顺序)
| # | 问题 | 答案决定 |
|---|---|---|
| 1 | 触发条件能写清楚吗?("Use when 发现 Nacos/8848") | 能 → 倾向 skill;模糊/一次性 → knowledge |
| 2 | 是"每次都要照着做的步骤"还是"仅供参考的背景"? | 步骤 → skill;背景 → knowledge |
| 3 | 内容量大吗?正文超过几千行? | 大 → knowledge(skill 正文不宜过长) |
| 4 | 需要目标出现时自动触发吗? | 需要 → skill;不需要 → knowledge |
| 5 | 复用频率高吗? | 高频 → skill;低频/偶发 → knowledge |
渗透场景具体分类
做成 Skill(操作手册,自动触发):
- 框架/产品测试流程:Nacos、若依、蓝凌、ThinkPHP、Gogs、Learun、勾股 OA……(我已有,方向对)
- 漏洞类型测试打法:SQLi、XSS、SSRF、XXE、SSTI、JWT、BOLA……(我已有)
- 通用流程:侦察、子域枚举、资产归属、报告交付
- 工具导航:onlytools-tool-index(唯一入口,不散落)
做成 Knowledge(经验库,主动检索):
- 历史目标案例:哪个单位什么系统、指纹特征、测试结论、时间线
- 踩坑记录:工具在某场景失效、WAF 绕过失败、误报教训
- 已确认指纹:某二开系统的特定标识(如"版权'蓝凌软件'+")
- 漏洞验证记录:复现细节、定级依据、修复建议
- 外部参考资料:语雀迁移的笔记、别人的文章
我的现状评估:大体正确,有一处值得梳理
| 我现有的 | 判断 |
|---|---|
pentest/ 分类下产品测试 skill(nacos/gogs/ruoyi…) |
✅ 方向对,是 skill |
web/ 分类下漏洞类型 skill(sql-injection、ssrf…) |
✅ 方向对,是 skill |
knowledge/渗透知识库/chains|cases|checklists|raw |
✅ 合理,全在 knowledge 侧 |
knowledge/SRC挖掘技巧/框架漏洞 |
⚠️ 偏方法论性质(框架怎么测),按标准应该 skill 化——但和我已有的框架 skill 高度重复,是需要合并/清理的点 |
最后那个 框架漏洞 目录就是典型"该 skill 化的东西还躺在 knowledge 里"——要么里面有 skill 没有的新内容(搬到 skill),要么是 skill 的旧版本(删掉/合并),避免两份。
别忘了 token 约束:Skill 要"少而精",Knowledge 可以"多而杂"
- Skill 是精装房:每多一个都占每轮 token,所以必须是精选——真正高频复用的操作手册,控制在几十个以内。
- Knowledge 是仓库:随便放,不占每轮成本,只在需要时检索。历史案例、踩坑、参考随便堆。
所以渗透场景的理想形态:~30-50 个精选 skill(框架 + 漏洞类型 + 流程 + 工具导航)+ 无限大的 knowledge 仓库(案例 + 踩坑 + 指纹 + 参考)。我现在的 209 个 skill 明显偏多,其中大量是外部导入的通用 playbook(email、productivity 之类),对渗透场景是纯 token 负担——按这个标准筛一遍,能砍掉一大半。
九、Skill 优化的起点:目录结构实测与优化顺序
决定从 skills 优化开始后,我先实测了自己的目录结构,确认了几件事:
skills/
├── INDEX.md / README.md ← 根目录只有这两个 md(不是 skill)
├── pentest/ ← 分类目录(30 个)
│ ├── nacos-blackbox-testing/SKILL.md ← skill 目录,标准形态
│ ├── redteam-pentest.zip ← 混进来的 zip(会被忽略)
│ └── ...
├── web/
│ └── sql-injection-testing/SKILL.md
└── ...
结论 1:分类目录嵌套对检索调用没有影响,而且有益。 扫描器是递归扫描(快照 manifest 路径都是 pentest\nacos-blackbox-testing\SKILL.md 这种三层结构),所以 分类/skill名/SKILL.md 完全正常。而且 skill 卡片里带 category 字段,系统提示里显示为 pentest: 前缀——分类名本身也是语义匹配线索,模型看到"这是 pentest 类的"更容易路由到渗透场景。
结论 2:唯一要注意的是 SKILL.md 必须放在独立子目录里(<名字>/SKILL.md),不要裸放在分类目录或根目录下,否则扫描器可能认不出 skill 名。
结论 3(发现的问题):核心分类缺 DESCRIPTION.md。 分类描述会注入系统提示帮助路由,但我只有 12 个分类有,pentest / web / network / recon / ops / host 这些核心分类全没有——等于少了一层"这是渗透类"的路由信号,这是优化时值得补的。
三个概念别混淆:分类描述 vs skill 描述 vs 检索索引
讨论中我把"在 web 目录下面加检索索引"说顺口了,需要拧精确——那不是检索索引,是分类描述。三个概念各司其职:
| 名称 | 位置 | 作用 | 类比 |
|---|---|---|---|
| 分类描述 DESCRIPTION.md | skills/web/DESCRIPTION.md |
楼层牌:告诉模型"web 这类是干嘛的",宽泛路由 | 楼层指示牌 |
| skill 描述 frontmatter description | skills/web/xxx/SKILL.md |
书名:精准触发词,决定是否加载 | 书脊书名 |
| 检索索引 index.json | knowledge/ 下 |
目录表:框架名 → 文件路径,按关键字定位知识库文件 | 图书馆目录卡 |
关键机制:分类描述不会附加到每个 skill 卡片上,它们是分开注入的。模型匹配时,分类描述帮它"优先考虑这个分类"(模糊场景下有用),但真正决定加载哪个 skill 的,还是每个 skill 自己的描述。
所以"web 目录下面加东西"该加什么:
skills/web/DESCRIPTION.md← 分类描述(楼层牌,加分项,一行即可):--- description: Web 安全测试与攻防:SQL 注入、XSS、SSRF、认证授权、API 安全等漏洞类型的测试方法论。 ---skills/web/*/SKILL.md的 frontmatter ← 精准触发词(书名,必需项)——写"Nacos/8848/SQLi"这种具体指纹,不要重复"渗透"二字(大词不精准,浪费 57 字符窗口)knowledge/index.json← 检索索引(目录表,最后做),跟 skills 目录无关
为什么 skill 描述里不要写"渗透":"渗透"是大词不精准——用户说"测一下这个站点",模型不会因为"渗透"两个字命中;它命中靠的是具体指纹。分类已经提供了渗透上下文,skill 里重复是浪费。
我的两个优化想法被验证后的结论
想法 1:skill 描述更精准 —— ✅ 完全正确,最高杠杆,就是"描述体检":触发词前 57 字符、带具体指纹,第一批要做。
想法 2:检索索引 + 匹配关键字,把一些 skills 放入知识库 —— ⚠️ 方向对,但有个概念要拧正:"把 skill 移入知识库" = 降级,有连锁影响:
| 动作 | 结果 | 代价 |
|---|---|---|
从 skills/ 移到 knowledge/ |
卡片从系统提示消失,不再自动触发 | 以后只能靠导航 skill(pentest-experience-hub)的索引检索到;导航索引没更新就彻底失联 |
保留在 skills/ 但合并/归档到 .archive/ |
卡片消失,文件还在 | 同上,.archive 里扫描器不管 |
| 直接删除 | 彻底移除 | 不可逆 |
所以"移入知识库"的正确姿势是成对操作:移动文件 + 同步更新 pentest-experience-hub 的索引条目(否则就是扔进黑洞)。分类依据不是"优化不动、低频的扔知识库",而是按第八部分的 5 问表:高频自动触发的留 skill,低频/参考性的才降级。
我的优化顺序(讨论层面,未实施)
- 先分类盘点:把 209 个 skill 分成「渗透核心 / 渗透边缘(可降级)/ 无关(email、productivity 等)/ 重复」四类
- 无关 + 重复 → 删/并/归档(先砍 token 大头)
- 渗透核心 → 描述体检(触发词前置 + 指纹化)
- 渗透边缘 → 降级到 knowledge + 更新导航索引
- 补分类 DESCRIPTION.md(pentest、web、network 各写一行路由描述)
- 最后才做知识库 index.json(承接降级内容)
十、我最终确定的方案(待实施)
- 方法论/操作步骤类知识 → skill 化(带 Use when 描述)——这是唯一能让模型"真·自动按需加载"的路;我已有的 nacos/gogs/ruoyi 等框架 skill 就是证据。
- 历史案例/验证结论类知识 → 保留 Knowledge + 建索引:
index.json(框架/产品名 + 别名 + 指纹词 → 文件路径 + 摘要),模型命中框架指纹后精准读取。 - Skill 描述全面体检:逐个检查现有 skill 描述,触发词是否在前 57 字符内、是否含具体指纹/别名,不达标的统一优化。
- 工具库改造:
onlytools-tool-index描述拓宽 + tools.json 每条补用途关键字。 - 触发设计(推荐 B+C 组合):
- MEMORY 写触发约定:"用户丢出 URL/IP/域名且未说明用途 → 默认视为授权渗透目标,先加载 pentest-experience-hub + onlytools-tool-index,按侦察→识别→验证流程走"。
- 把
onlytools-tool-index、pentest-experience-hub描述改为"Use when 收到任何 URL/域名/IP 目标",让 URL 单独即可命中导航。
- 判断标准一句话:"下次遇到同类目标要照着做的步骤"→ skill;"验证过的结论/踩过的坑"→ Knowledge + 索引。
十一、Skill 自动沉淀机制:增长的源头与开关
盘点时发现 skill 数量还在增长,追查后搞清楚了"自动沉淀"的机制——skill 是会自我繁殖的,必须理解它才能控制规模。
实测:agent 创建的 skill 有 52 个
.usage.json 显示 created_by: agent 的 skill 共 52 个,其中大量是同主题重复沉淀:
thinkphp 系列 ×3: thinkphp-application-testing / thinkphp-framework-testing / thinkphp-security-testing
wechat 系列 ×6: wechat-article-archival / batch-download / download / mp-archiving / mp-article-backup / mp-article-export
agent-harness ×3: agent-harness-exposure / -testing / ai-agent-harness-exposure
jiuyeqiao 系列 ×3、landray ×2、pentest-toolkit ×2 ...
每次对话后沉淀,同名主题反复创建,skill 只增不减。(已有 3 个被 curator 自动归档:bamboocloud/git-server/jiuyeqiao-employment,说明归档机制在工作,但挡不住新增。)
两个开关
| 开关 | 作用 | 我的状态 |
|---|---|---|
skills.write_approval: true |
模型在对话中创建/修改 skill 时需要用户批准才落盘——最关键的闸门 | ✅ 已开启 |
curator.enabled |
后台维护:归档闲置 skill、备份;不会创建新 skill,默认 consolidate: false(不自动合并) |
未显式配置(默认开) |
关键认知:curator 不造成增长,它反而是唯一的"自动减负"机制(只归档、不新建、可 pin 豁免),不建议关闭。
"关掉自动沉淀"的正确姿势
| 目标 | 做法 | 命令 |
|---|---|---|
| 模型不再未经同意创建 skill | 保持 write_approval: true(已生效) |
hermes config set skills.write_approval true |
| 彻底禁止对话中提议存 skill | 对话中明确说"不要沉淀" | — |
| 关掉后台归档(不推荐) | — | hermes config set curator.enabled false |
| 让现有 52 个 agent skill 不再膨胀 | 清理重复(thinkphp×3、wechat×6、agent-harness×3……)+ pin 真正要保留的 | hermes curator pin <name> |
结论:用治理替代全关
write_approval: true保持——每次沉淀都要用户点头,这是最重要的闸门。- curator 别关——它是唯一在帮忙"瘦身"的机制。
- 真正的负担不是未来增长,而是已沉淀 52 个里的重复(thinkphp×3、wechat×6 这些)——清掉这批重复,比关任何开关都实在。
十二、实战:我平时渗透时怎么用提示词(作者实操指南)
所有机制优化完之后,最实际的问题来了:我平时应该怎么组织提示词,才能让 Hermes 更好地匹配 skill、tools 和知识库?
核心原则:URL 是数据,意图靠我说
系统靠"数据 + 动作意图"组合匹配。我的一句话里带上动作词 + 目标类型 + 阶段,命中率最高。
❌ 只丢 URL: https://xxx.com
✅ 完整意图: https://xxx.com 是授权目标,做渗透测试,先侦察识别框架
提示词要素表(按重要度)
| 要素 | 作用 | 触发什么 |
|---|---|---|
| 动作词(渗透/测试/扫一下/验证) | 标记这是安全任务 | 触发约定 → pentest-experience-hub + onlytools-tool-index |
| 目标类型/指纹(Nacos/若依/ThinkPHP/8848) | 精准命中框架 skill | nacos-blackbox-testing、ruoyi-framework-testing 等 |
| 漏洞类型(SQL注入/SSRF/越权/验证码) | 命中漏洞 playbook | sql-injection-testing、ssrf-testing 等 |
| 阶段(侦察/指纹/漏扫/利用) | 选对工具 | onlytools-tool-index 对应分类 |
| 授权范围(只限此 URL) | 安全边界 | 不扩展资产 |
| 证据(标题/Server头/报错) | 辅助指纹判断 | 更精准路由 |
常用提示词模板(可直接复制)
1. 完整渗透启动(推荐)
https://xxx.com 是授权目标(范围只限此站点)。开始渗透:
先侦察识别框架指纹,查知识库相关经验,用本机工具,低影响验证。
→ 自动加载导航 skill + 查 index.json + 选工具
2. 指纹优先
https://xxx.com 帮我识别这是什么框架/产品,然后查知识库有没有相关经验
→ 命中框架 skill + index.json 框架漏洞分类
3. 单点测试(明确漏洞类型)
https://xxx.com 的登录接口验证码可以复用,测一下验证码逻辑
→ 命中 web/验证码相关 skill + 知识库功能点"验证码"
4. 知识库定向检索
查知识库:这个 [框架/漏洞类型] 之前有没有案例或踩坑记录
→ 触发 pentest-experience-hub → 查 index.json → 读对应文件
5. 工具定向
测 [URL] 需要 [子域枚举/指纹识别/目录爆破],用本机工具
→ 触发 onlytools-tool-index → tools.json tags 命中
最佳实践细则
- 一句话带全意图:URL + 授权 + 动作 + 类型,一次说清
- 指纹词用具体名称:说"Nacos"比说"配置中心"命中更准(但 index.json 里两者都有)
- 证据驱动:把已看到的报错/标题/状态码给 Hermes,匹配更准
- 分阶段下指令:先侦察→再利用,别一次让全做完
- 低影响声明:说"只读验证/低影响"我会收敛动作
反面写法(命中率低)
| 写法 | 问题 |
|---|---|
https://xxx.com(只有 URL) |
无意图,靠触发约定兜底但方向未知 |
帮我看看这个 |
太笼统,不知道是安全测试还是浏览 |
测一下那个网站的所有东西 |
无范围无类型,可能漏关键 skill |
| 一个消息丢 5 个不同目标的 URL | 范围混乱,违反单 URL 纪律 |
优化后的兜底能力
即使我只丢 URL,优化后的系统也会:
- MEMORY 触发约定 → 默认进渗透流程
- pentest-experience-hub 描述含"URL/IP" → 自动加载
- onlytools-tool-index 描述含"URL/IP" → 自动加载
但加上意图词会让方向更精准(是打框架、还是测接口、还是查案例)。
十三、一句话总结
我的工具索引和知识库路由早就存在,缺的不是索引,是触发点——把"URL 出现"映射到"渗透流程启动"。而要让模型稳定执行,靠的不是它记性好,而是把"查索引"写死成流程第一步的强制动作。Skill 靠描述精准,工具和知识库靠"入口描述 + 关键字索引"——让目录带够触发词,模型才能命中。

浙公网安备 33010602011771号