问题
Qwen3.5-9B 是个很有礼貌的模型。这在对话场景是优点,在 Agent 场景是灾难:
「我检查了文件,需要修改吗?」
「可以执行这个命令吗?」
「检测到问题,是否修复?」
每步都要问用户,Agent 就失去了自动化的意义。
尝试过的方案
方案一:改 tool_use_enforcement
配置文件里的 tool_use_enforcement 参数。Hermes 代码只识别这几个值:
TOOL_USE_ENFORCEMENT_VALUES = ['true', 'always', 'yes', 'on']
设成 force 没用,代码不认识。改回 true 后好了点,但模型还是太谨慎。
方案二:在配置文件加 system prompt
system_prompt: "你是一个直接执行的助手,不要询问用户确认……"
效果有限。配置文件的 system_prompt 优先级低于内置的 TOOL_USE_ENFORCEMENT_GUIDANCE 区域。
真正有效的方案
在 prompt_builder.py 中找到 TOOL_USE_ENFORCEMENT_GUIDANCE 区域,在末尾追加中文指令。
这个区域是直接写入最终 system prompt 的,覆写不掉。
追加的 5 条指令:
=== 中文执行规范(Chinese Execution Rules)===
1. 直接执行:接到任务立即开始,不要询问用户确认
2. 自动处理失败:工具调用失败后自动尝试其他方案,不要问用户怎么办
3. 非关键操作全程自动:信息搜集、文件读写、状态检查等,全部自动完成
4. 关键操作仍汇报:只有涉及数据删除、付费、对外发送消息时才告知用户
5. 失败记录:所有失败记录到日志,继续下一任务
效果立竿见影。
为什么中文指令更有效
对比英文配置和中文自然语言指令:
| 方式 | 示例 | 效果 |
|---|---|---|
| 英文配置项 | tool_use_enforcement: true | 模型可能忽略 |
| 中文指令 | 「不要询问用户确认」 | 模型直接遵守 |
原因:
- 否定指令更强:「不要做 X」比「请自动做 Y」更有力
- 母语优先:中文模型对中文指令的理解力强于英文
- 尾部优先:system prompt 末尾的内容模型更容易记住和执行
- 具体场景:给出失败处理方案,模型不会卡在「失败了怎么办」
指令设计原则
从这 5 条指令总结出通用原则:
1. 用否定句而非肯定句
❌ 「请自动完成任务」
✅ 「不要询问用户确认」
否定句是封闭式的——模型知道不可做什么,边界清晰。肯定句是开放式的,模型不知道做到什么程度算「自动」。
2. 给失败路径
❌ 「自动处理所有操作」
✅ 「工具调用失败后自动尝试其他方案」
模型最怕的不是执行,是执行失败后不知道怎么办。给明确的后退路径,模型才敢放手做。
3. 划清边界
❌ 「全自动执行」
✅ 「关键操作仍汇报:只有涉及数据删除、付费、对外发送消息时才告知用户」
模型需要知道哪些事可以自己做,哪些事必须汇报。边界清晰,行为就稳定。
4. 可验证
每条指令都应该能通过观察模型行为来验证是否生效。如果模型还在问,说明指令不够清晰。
修改位置
文件路径:~/.hermes/hermes-agent/agent/prompt_builder.py
找到 TOOL_USE_ENFORCEMENT_GUIDANCE 变量(约第 256 行),在其字符串末尾追加中文指令。
修改后重启 Hermes 生效。
效果对比
| 维度 | 修改前 | 修改后 |
|---|---|---|
| 是否主动执行 | ❌ 每步要问 | ✅ 直接开始 |
| 失败处理 | ❌ 问怎么办 | ✅ 自动换方案 |
| 信息搜集 | ❌ 查一步问一步 | ✅ 全部自动完成 |
| 外部操作 | ❌ 不问就发消息 | ✅ 关键操作才汇报 |
| 容错率 | ❌ 卡住就死循环 | ✅ 失败记录继续 |
注意事项
- 指令放在英文配置之后。这样尾部指令更容易被模型执行。
- 每条指令独立一行。不要写成段落,模型逐行解析比段落效果好。
- 定期更新。随着使用发现模型新的不当行为,追加对应指令。
- 不是所有模型都吃这一套。Qwen3.5-9B 对中文指令响应很好,但其他模型可能不同。