为什么 8B 开源模型跑 Agent 总死循环?Hermes 三个硬核调参(2026)
2026 年,本地跑 Llama 3.1/3.2 8B、Qwen 2.5 7B 或 Hermes 3 8B 看起来很划算——直到 Agent 进入死循环:工具 JSON 格式错误、反复调用 terminal,或一直说「我现在去跑测试…」却从不真正调工具。GPU 往往没问题,真正失控的是采样 + 上下文 + 工具面。
Hermes Agent(NousResearch/hermes-agent,MIT)面向前沿模型设计,但同样支持 OpenRouter、Ollama 及国内常见的 OpenAI 兼容推理框架。本文说明小模型在 Agent 场景为何容易崩,并给出三个硬核调参加七步实操,帮助在 16–24 GB 显存 的 Mac 或 Linux 上稳定长跑任务。
config.yaml 里的用户级 temperature 仍未完全开放(#17565),请同时在 Ollama/推理服务端设采样,并配合下文 reasoning 与工具强制项。为什么 8B 在函数调用上容易「翻车」
小尺寸 Instruct 模型多按单轮对话训练,而不是五十轮工具轨迹。Agent 循环会放大三类弱点:
| 弱点 | Hermes 中的表现 | 为何烧 token |
|---|---|---|
| 结构化输出漂移 | 工具 JSON 夹带废话、键名错误或纯文本「假调用」 | 解析重试;模型反复重读整段线程 |
| 注意力稀释 | 早期 HTML/日志 把原始目标挤出窗口 | 忘记停止条件,重复同一计划 |
| 高熵采样 | 用不同措辞重复同一方案 | curl/grep 仅改微小参数 |
可引用定义:在 Hermes 中,「工具调用」指运行时解析并执行的结构化消息;8B 若输出叙述性文字而非该结构,循环无法推进,上下文会被重复计划塞满。
大模型靠体量自愈;8B 必须收窄工具菜单、压低 reasoning 开销、 aggressively 做上下文卫生。请配合 轨迹压缩,避免中段膨胀放大死循环。统一内存规划可参考 Apple Mac mini 规格。
架构:Hermes 每轮实际发送什么
| 层级 | 路径 / 命令 | 对小模型的影响 |
|---|---|---|
| 模型端点 | hermes model → config.yaml model: | context_length 设错会过早压缩或溢出 |
| 工具面 | hermes tools / agent.disabled_toolsets | 工具越少,prompt 里 JSON schema 越少 |
| Skills | ~/.hermes/skills/、hermes chat -s a,b | 每个 skill 增加指令;8B 建议最多 2 个 |
| 强制调用 | agent.tool_use_enforcement | 推动 Llama/Qwen 真调工具 而非口述 |
| Reasoning | agent.reasoning_effort + /reasoning | 默认 medium 在部分路由会加隐藏「思考」token |
| 上下文卫生 | compression.*、tool_output.* | 在巨型 stdout 填满窗口前截断 |
Hermes 内部对部分模型有固定 temperature 契约。本地请在推理服务端设采样(Ollama PARAMETER temperature 0.2、llama.cpp --temp 0.2),在 YAML 暴露 temperature 之前,以 reasoning 与 tool 配置为主(#17565)。
三个比单纯调温更重要的设置
调参 1 — 关掉隐藏 reasoning(reasoning_effort: none)
默认 reasoning 为 medium,对 Opus 级有用,却常让本地 8B 膨胀:
agent:
reasoning_effort: none # or minimal for light planning
display:
show_reasoning: false
/reasoning
/reasoning none
典型症状缓解:长时间空白「思考」后出现畸形工具 JSON。
调参 2 — 强制真实工具调用(tool_use_enforcement)
8B 版 Llama/Qwen 爱「口述操作」。Hermes 可注入强制提示:
agent:
tool_use_enforcement: true
provider_routing:
require_parameters: true
默认 "auto" 仅对 GPT/Gemini 族开启——本地 8B 默认关闭,需手动打开。路由见 provider routing。
调参 3 — 技能节食:两 skill、最小 toolset
Skill 虽渐进披露,索引 alone 约 3k token;可选 MCP 目录还会再加。
8B 启动示例:
hermes chat --toolsets "terminal,file" \
-s github-pr-workflow,plan \
-m "qwen/qwen-2.5-7b-instruct"
- 预加载≤2 个 skill(
-s a,b),其余按需手动加载 - 全局禁用重型 toolset(见下方片段)
- 8B 机器不要装齐
optional-mcps/——每个 MCP 增加 schema 与失败面(MCP Mac 指南)
agent:
disabled_toolsets:
- web
- browser
- image_gen
- moa
- memory
可选:创建 profile 时清空 skill:
hermes profile create local-8b --no-skills
显存档位:Mac / 单卡 Linux 怎么选
同样是「8B」,Q4 与 Q8 量化、是否挂浏览器 MCP、网关是否常开,对稳定性的影响往往大于模型名字本身。
| 硬件 | 模型示例 | Hermes 配置 | 稳定工具轮次(经验值) |
|---|---|---|---|
| 16 GB 统一内存(Mac mini M4) | Qwen2.5-7B Q4 + 8k 上下文 | terminal,file + 1 个 skill | 6–12 次后建议手动 /compress |
| 24 GB(M4 Pro 等) | Llama-3.1-8B Q5 + 16k | 2 个 skill + compression.threshold: 0.40 | 约 12–20 次 |
| 32 GB+ 或独显 12 GB+ | 8B Q6 + 32k | 最多再加 1 个 MCP | 可尝试更长重构任务 |
若 X 则 Y:连续两次 JSON 工具调用失败 → 减到 1 个 skill 并减半 tool_output.max_bytes。若已开 enforcement + 低温采样仍循环,该任务更适合 14B+ 或云端只做规划。
三种常见死循环与对策
- 解析循环 — JSON 非法反复重试。对策:enforcement、减工具、推理端降温。
- 空转计划 — 只复述计划不调工具。对策:
reasoning_effort: none,提示词写明最多 N 次工具。 - 日志循环 — 反复读巨大 stdout。对策:压低
tool_output、40% 触发压缩、终端先head。
七步实操:Hermes 上稳定跑 8B Agent
第 1 步 — 安装并设真实上下文长度
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
source ~/.zshrc
hermes doctor
将 model.context_length 设为本地真实上限(如 8192 或 16384),勿填营销上的 128k:
model:
context_length: 16384
前置:Hermes Mac 安装指南。
第 2 步 — 指向本地端点
hermes model
hermes chat -q "Reply OK only" -m "your-local-model-id"
第 3 步 — 在 config.yaml 应用三项调参
agent:
reasoning_effort: none
tool_use_enforcement: true
disabled_toolsets:
- web
- browser
- image_gen
- memory
compression:
enabled: true
threshold: 0.40
tool_output:
max_bytes: 20000
max_lines: 500
file_read_max_chars: 30000
阈值宜低于默认——小窗口填满很快。
第 4 步 — 服务端采样(在 YAML 暴露 temperature 前)
在 Ollama Modelfile 或 API 使用低 temperature 与适中 top_p:
PARAMETER temperature 0.2
PARAMETER top_p 0.9
Hermes 仍可能有 per-model 覆盖;服务端低熵有助于减少 JSON 幻觉。
第 5 步 — 用两个 skill 跑有界工具任务
hermes chat --toolsets "terminal,file" \
-s plan \
-m "your-local-model-id"
Task: list top 5 largest files in ./src, write paths to /tmp/top5.txt.
Rules: max 8 tool calls; if stuck, stop and report blocker.
观察状态栏上下文百分比;自动压缩前若变橙可手动 /compress。
第 6 步 — 用 /usage 与 /stop 早发现循环
/usage
/stop
若相同参数的工具调用重复三次,应中止并收窄 prompt——8B 很少能无人干预自行纠正。
第 7 步 — 可选:常开 Mac mini 跑 gateway
24/7 自动化可把 gateway 放在不睡眠的机器上;8B 推理仍在 GPU,gateway 吃 CPU。循环稳定后再看 定时 Discord 日报——定时任务会放大失控开销。
排错
每次工具调用都 JSON 解析失败
现象:Failed to parse tool call 或工具名出现在正文里。
处理:开启 tool_use_enforcement: true;toolset 缩至 terminal,file;降低服务端 temperature;换面向工具微调的量化(如 Qwen2.5-Instruct)。避免在 prompt 里要求并行多工具。
无限「我将要…」却不调工具
现象:模型描述步骤;TUI 无终端图标。
处理:同上,并在 SOUL.md 写明:「必须调用工具,禁止承诺未来操作。」skill 减至 1 个;确认非 reasoning_effort: high。
16K 模型第 4 轮就上下文爆满
现象:上下文条变红;回答混乱。
处理:compression.threshold: 0.35、减小 tool_output.max_bytes、禁用 web/browser,并养成 轨迹压缩 习惯(大段粘贴前先 /compress)。
常见问题
reasoning_effort: none 与 tool_use_enforcement。关注 #17565。compression.* 与 /compress 控制在线窗口——8B 主机建议两者并用。