Hermes 渗透工作台调优实战:Skill 索引、知识库触发与提示词

Hermes 渗透工作台调优实战:Skill 索引、知识库触发与提示词

日期:2026-08-25
作者视角:我是这套工具的使用者和搭建者,这篇文章记录我从"发现问题"到"想清楚机制"再到"定方案"的完整过程。涉及 Hermes 的 skill 加载机制、我的知识库为什么不被自动检索、RAG/索引/向量这些概念的辨析,以及最终的触发设计。
状态:讨论记录,未实施


一、我的问题:它总是"忘记"查我的知识库

我在用 Hermes 做渗透测试时,经常遇到一个困扰:我丢给它一个 URL,它就开始测了,但不会自动去查我积累的知识库,也不会自动去翻我的工具库。有时候明明扫出来是 Nacos,它却不会自动带上我知识库里 Nacos 相关的方法论。

一开始我以为是"工具/知识库缺一个检索索引"——给它们也建个目录不就行了?但越研究越发现,问题不在索引,在于触发。这篇文章把我搞清楚的整个过程记下来。

二、先搞懂:Hermes 到底怎么"按需加载"skill 的

研究下来,它的机制是这样的:

  1. 每次对话开始,系统把所有 skill 的名称 + 一句话描述注入到系统提示里,相当于给模型一份"目录页"。
  2. 收到消息后,模型把消息内容和这些描述做语义匹配,觉得相关就用 skill_view 把完整 SKILL.md 拉进上下文,照着执行。
  3. 系统提示里有硬规则:skill 匹配或部分相关时必须加载,宁可多加载也不漏
  4. 之所以不全文注入所有 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": [修改时间, 文件大小], ... }
}

构建流程(会话启动/技能变更时,无人参与)

  1. 扫描 ~/.hermes/skills/ 下所有分类目录
  2. 读每个 SKILL.md 的 YAML frontmatter,抽出 name / description / platforms / conditions——只读 frontmatter,不读正文
  3. manifest 记录每个文件的 [修改时间, 大小] 做增量缓存:文件没变不重新解析,变了才更新
  4. 把 209 张卡片 + 15 个分类描述拼装成系统提示里的 ## Skills (mandatory) 段落

运行时匹配(每次对话)

  1. 目录页每轮都在眼前
  2. 我收到消息 → 把消息内容和 209 张卡片做语义匹配(LLM 推理,不是关键词 grep,也不是向量检索)
  3. 命中 → 调用 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 都没配置这个字段。

应对三条线

  1. 数量控制(治本):合并同主题 skill(中英文双份、同主题多份去重),删掉过时/不再用的 skill。209 个里很多是外部导入的通用 playbook,对渗透未必都需要。
  2. 描述精炼(治本):描述每多 1 个字符 = 每轮多 1 字符成本。前 57 字符放触发词,后面能短则短。
  3. 条件注入(治标但有效):给渗透类 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 只是一个小信号,淹没在噪声里。要做的是放大信号,不是祈祷模型记性好。放大手段按效果排序:

  1. 常驻规则(MEMORY 写死流程)——每轮都在,最可靠
  2. 流程强制(skill 里编号步骤,不许跳)——命中一次就全带上
  3. 描述拓宽(让 URL 单独命中)——治本但有噪声
  4. 用户习惯(丢 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-hubonlytools-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,低频/参考性的才降级

我的优化顺序(讨论层面,未实施)

  1. 先分类盘点:把 209 个 skill 分成「渗透核心 / 渗透边缘(可降级)/ 无关(email、productivity 等)/ 重复」四类
  2. 无关 + 重复 → 删/并/归档(先砍 token 大头)
  3. 渗透核心 → 描述体检(触发词前置 + 指纹化)
  4. 渗透边缘 → 降级到 knowledge + 更新导航索引
  5. 补分类 DESCRIPTION.md(pentest、web、network 各写一行路由描述)
  6. 最后才做知识库 index.json(承接降级内容)

十、我最终确定的方案(待实施)

  1. 方法论/操作步骤类知识 → skill 化(带 Use when 描述)——这是唯一能让模型"真·自动按需加载"的路;我已有的 nacos/gogs/ruoyi 等框架 skill 就是证据。
  2. 历史案例/验证结论类知识 → 保留 Knowledge + 建索引index.json(框架/产品名 + 别名 + 指纹词 → 文件路径 + 摘要),模型命中框架指纹后精准读取。
  3. Skill 描述全面体检:逐个检查现有 skill 描述,触发词是否在前 57 字符内、是否含具体指纹/别名,不达标的统一优化。
  4. 工具库改造onlytools-tool-index 描述拓宽 + tools.json 每条补用途关键字。
  5. 触发设计(推荐 B+C 组合)
    • MEMORY 写触发约定:"用户丢出 URL/IP/域名且未说明用途 → 默认视为授权渗透目标,先加载 pentest-experience-hub + onlytools-tool-index,按侦察→识别→验证流程走"。
    • onlytools-tool-indexpentest-experience-hub 描述改为"Use when 收到任何 URL/域名/IP 目标",让 URL 单独即可命中导航。
  6. 判断标准一句话:"下次遇到同类目标要照着做的步骤"→ 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>

结论:用治理替代全关

  1. write_approval: true 保持——每次沉淀都要用户点头,这是最重要的闸门。
  2. curator 别关——它是唯一在帮忙"瘦身"的机制。
  3. 真正的负担不是未来增长,而是已沉淀 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 命中

最佳实践细则

  1. 一句话带全意图:URL + 授权 + 动作 + 类型,一次说清
  2. 指纹词用具体名称:说"Nacos"比说"配置中心"命中更准(但 index.json 里两者都有)
  3. 证据驱动:把已看到的报错/标题/状态码给 Hermes,匹配更准
  4. 分阶段下指令:先侦察→再利用,别一次让全做完
  5. 低影响声明:说"只读验证/低影响"我会收敛动作

反面写法(命中率低)

写法 问题
https://xxx.com(只有 URL) 无意图,靠触发约定兜底但方向未知
帮我看看这个 太笼统,不知道是安全测试还是浏览
测一下那个网站的所有东西 无范围无类型,可能漏关键 skill
一个消息丢 5 个不同目标的 URL 范围混乱,违反单 URL 纪律

优化后的兜底能力

即使我只丢 URL,优化后的系统也会:

  1. MEMORY 触发约定 → 默认进渗透流程
  2. pentest-experience-hub 描述含"URL/IP" → 自动加载
  3. onlytools-tool-index 描述含"URL/IP" → 自动加载

加上意图词会让方向更精准(是打框架、还是测接口、还是查案例)。

十三、一句话总结

我的工具索引和知识库路由早就存在,缺的不是索引,是触发点——把"URL 出现"映射到"渗透流程启动"。而要让模型稳定执行,靠的不是它记性好,而是把"查索引"写死成流程第一步的强制动作。Skill 靠描述精准,工具和知识库靠"入口描述 + 关键字索引"——让目录带够触发词,模型才能命中。

posted @ 2026-08-25 17:08  0xMouise  阅读(55)  评论(0)    收藏  举报