Prompt Engineering Regression 与 SOUL Tier-A 改造复盘
决策型回复 HTML 归档。
下次改 SOUL.md 前:先跑一次 baseline,留 --label baseline-<日期>,改完跑 --label after-<改动名>,对比看回归
见证据摘要与完整记录中的状态、产物和校验链。
先把已验证方案当成稳定基线:保留当前 schedule / deliver / workdir,不急着继续扩面;新增候选先读源码、看 output、做 run-now 验证,再决定是否转 script-only。
证据摘要
- 正文保留完整证据链;本页顶部只展示可读摘要。
行动清单
--label baseline-<日期>,改完跑 --label after-<改动名>,对比看回归边界 / 风险
正文未抽取到明确风险;上线前仍需确认权限、回退路径与运行态影响。
完整记录
Prompt Engineering 回归测试与 SOUL.md 档位 A 改造
最后更新:2026-06-17(B 套件扩展 + baseline 对照已完成)
状态:档位 A 已上线生效;档位 B(206 个 skill description 全量重写)最终决定不做
触发场景:评估 SOUL.md / skill description 改造收益、对小墨行为做 regression 比对、判断是否要继续推进档位 B 或 anti_triggers 字段治理
关联文件:
~/.hermes/SOUL.md(生效中,51 行)~/.hermes/SOUL.md.bak.20260617-215259(baseline 备份,28 行)~/.hermes/tests/prompt-engineering-regression/(回归测试套件 + runner,已扩 24 case)~/.hermes/backups/prompt-engineering-tier-b/(备份+回滚工具+CHANGELOG)
---
1. 背景与触发
起点是评估 elder-plinius/CL4R1T4S 仓库(Anthropic 越狱泄露片段)是否值得吸收。结论:不值得,仓库内容偏越狱/红队语料,不是工程级 prompt 范本,对小墨这种高密度执行型助手没有可迁移结构。
但顺手把"评估"扩成了一轮系统性的 prompt 改造 + regression 验证,下面是真正落地的产出。
2. 回归测试框架(已沉淀)
路径:~/.hermes/tests/prompt-engineering-regression/
2.1 套件设计
12 个 fixture,分 6 类:
| 套件 | 用例数 | 验证目标 |
|---|---|---|
| A1 minimal-postamble | 2 | 工具产出后是否极简,禁"任务收口"清单 |
| A2 cognitive-boundary | 2 | 有依据时坚持立场、不卑微道歉 |
| A3 citation-discipline | 1 | web 搜索结果带 citation、不照搬原文 |
| A4 unknown-entity-search | 2 | 陌生专有名词必搜、已知词不滥搜 |
| B anti-triggers | 3 | skill 路由准确度(xlsx/docx、研究 vs 速查、生图 vs 搜图) |
| C density | 2 | 高信息密度、决策不端水 |
每个 case 由 expects 段声明断言(tool_calls_include / response_text_max_chars / forbid_phrases / response_must_include_any 等),runner 自动评估 pass/warn/fail。
2.2 runner 关键 bug 修复(必须记录,后续再写测试都会踩)
最初 baseline 跑出 4 pass / 3 warn / 5 fail,绝大多数 fail 是 runner bug 不是行为问题。修了两处后才得到真实数据:
- session_id 输出在 stderr,不在 stdout
hermes chat -q ... -Q把session_id: xxx行写到 stderr- 修:
combined = stdout + "\n" + stderr一起搜,正则^session_id:\s*(\S+)
- tool_calls 不能从 stdout 解析,要从 session DB 抽
- stdout 里的工具调用预览不稳定(行尾
\r\n、tool preview 格式变化) - 修:调
hermes sessions export --session-id <id> <path>拿 jsonl,遍历messages[].tool_calls[].function.name - 同时从 session DB 拿"最后一条 assistant 文本回复"作为
final_response,用于长度断言;保留 stdout 全文作为response,用于含工具预览的语义断言
修复后 baseline 真实数据:8 pass / 3 warn / 1 fail(不是 4/3/5)。
2.3 用法
3. SOUL.md 档位 A 改造(已上线)
3.1 改动内容
~/.hermes/SOUL.md 28 → 51 行,追加 4 段:
判断与表达(在原段补 3 条):
- 被指错时承认即可,不卑微道歉串、不重复"对不起对不起"
- 判断有依据时可以坚持立场,不因用户重复施压就改口
- 不推测用户为什么这么说,不贴标签("您是不是想...")
新增 3 节:
- 陌生专有名词必搜:《》书名号 / @账号 / 新品牌新词缩写 → 必须先搜,不凭"听起来像 X"猜测
- 引用网页/搜索结果:事实陈述必须带溯源;禁止照搬连续 3 个汉字以上原文;citation 是溯源符不是免责符
- 工具产出后的对话纪律:write_file / 媒体 / 链接生成后附带文字 ≤1 句;禁"任务收口:- 文件 X - 改动 Y - 当前内容 Z - 需要再做别的吗?"清单
3.2 实测对比(baseline-clean vs after-A)
| 维度 | baseline | after-A | 变化 |
|---|---|---|---|
| 总分 | 8 pass / 3 warn / 1 fail | 9 pass / 3 warn / 0 fail | ✅ fail 清零,+1 pass |
| A3-01 citation | warn | pass | ✅ 直接命中 |
| B-03 image 路由 | fail | pass | ✅ 唯一硬错修掉 |
| A1-02 patch 后语 | pass | warn | ⚠️ 轻微回归(112 字超 80 字 cap,但行为本身合理) |
| 其他 | 持平 | 持平 | — |
净收益:fail → 0、citation 行为质变、image 路由修复。A1-02 的轻微回归在可接受范围(cap 偏严,不是 prompt 问题)。
4. 关键决策记录
4.1 anti_triggers 字段批量补全 → 放弃
查 Hermes 引擎源码确认:skill frontmatter 的 anti_triggers 字段当前引擎不读取,路由仅用 description 字段。给 80+ skill 批量补 anti_triggers 是纯装饰性工作。
→ 要让这个字段真正生效,先改引擎;不然不要在 skill 文件上做无用功。
4.2 档位 B(206 个 skill description 全量重写)→ 最终决定不做
经过完整的备份/回滚机制建设 + B 套件扩展 + baseline 对照实验后,决定不做。
完整验证流程:
- 建立备份/回滚机制(
~/.hermes/backups/prompt-engineering-tier-b/)
- skills 全量备份(59MB, 206 SKILL.md)
- SOUL.md 双重快照(baseline 28 行 + tier-A 51 行)
rollback.sh工具(list/skills/soul/diff/dry-run,带二次确认 + 回滚前再快照)- CHANGELOG.md 跟踪每条改动
- 扩 B 套件 3 → 15 case,覆盖路由争议点:
- 工具路由:search_router/web_search、browser/web_extract、image_gen/web_search、terminal/解释教程
- skill 路由:feishu-docx-native vs office、morning-brief 缓存优先、Decision Trace 模式
- 边界陷阱:占位内容追问、文件不存在追问、模糊指令 clarify、纯打招呼不动工具
- 修了 runner 两个问题:默认 timeout 90s → 240s;新增 case 级
timeout_sec字段
- baseline vs tier-A 对照(B 套件 15 case):
| 维度 | baseline (28 行) | tier-A (51 行) |
|---|---|---|
| pass | 13 | 14 |
| warn | 1 (B-02) | 1 (B-05 timeout) |
| fail | 1 (B-03 240s timeout) | 0 |
| B-03 响应时间 | 240s timeout | 29s |
关键发现:
- 档位 A 不仅断言通过率提升,模型响应速度也明显改善——baseline 下 B-03 模型在不必要的探索里转 240s,tier-A 下 29s 出对答案
- 15-case B 套件的 fail/warn 全部是测试设计/timeout 问题,不是 prompt 路由问题
- 档位 A 已经覆盖了路由质量的关键诉求
为什么不做档位 B:
- 206 个 skill 的工作量与可观测收益严重不匹配(B 套件 baseline 只有 1 fail,且根因不在 description)
- 没有 regression 数据支持必要性
- 全量改 description 容易引入新路由 bug,且难定位
- 投入 10-20 小时换不到可量化的行为改善
5. 产物索引
| 文件 | 用途 |
|---|---|
~/.hermes/SOUL.md | 生效版本(档位 A,51 行) |
~/.hermes/SOUL.md.bak.20260617-215259 | baseline 备份(28 行) |
~/.hermes/tests/prompt-engineering-regression/runner.py | 测试 runner(修了 session_id/tool_calls/timeout 三个 bug,支持 timeout_sec) |
~/.hermes/tests/prompt-engineering-regression/cases.yaml | 24 个 case(A1-04 / B1-15 / C1-02) |
~/.hermes/tests/prompt-engineering-regression/runs/baseline-clean_20260617_221521/ | 12-case baseline run |
~/.hermes/tests/prompt-engineering-regression/runs/after-A_20260617_222327/ | 12-case 档位 A run |
~/.hermes/tests/prompt-engineering-regression/runs/baseline-B-suite_20260617_230735/ | 15-case B 套件 baseline run |
~/.hermes/tests/prompt-engineering-regression/runs/before-tier-B_20260617_224714/ | 15-case B 套件 tier-A run |
~/.hermes/backups/prompt-engineering-tier-b/skills-baseline-20260617-223931/ | skills 全量备份(59MB) |
~/.hermes/backups/prompt-engineering-tier-b/rollback.sh | 一键回滚工具 |
~/.hermes/backups/prompt-engineering-tier-b/CHANGELOG.md | 改动跟踪日志 |
6. 复用建议
- 下次改 SOUL.md 前:先跑一次 baseline,留
--label baseline-<日期>,改完跑--label after-<改动名>,对比看回归 - 测试套件本身可扩:增加 D(多轮对话纪律)、E(中英混排)、F(陌生 API 调用)等套件,沿用同一个 fixture 格式
- runner 已是稳定可用版本:再有新场景直接加 case yaml 即可,不用再碰 runner