故障排查:"我的智能体变笨了"
有时 Hermes 好像比昨天迟钝了,或忘了你二十分钟前刚告诉它的事。这几乎从不神秘——通常有一个具体的、可检查的原因。按顺序过这份清单:步骤按各自成为答案的频率排序。
1. 检查会话实际在用哪个模型 {#1-check-which-model-the-session-is-actually-using}
症状: 回答变浅、代码质量下降、推理感觉不对——全面性地。
检查: 不带参数运行 /model 显示当前模型,或 /status 一屏看全会话的模型、提供商和 profile。
意味着: 模型切换就是能力切换,而且你很容易最终落在一个与你以为不同的模型上:
- 单纯
/model <name>切换默认是仅会话的(除非设了model.persist_switch_by_default: true),因此你当前的模型可能与config.yaml里的不一致。 - 从 dashboard 的 Models 页改主模型只对新会话生效——已打开的聊天继续用它启动时的模型。
- 若你为简单任务切到了更快的模型(技巧与最佳实践推荐的模式),记得在复杂推理工作前切回来。
若模型不对,/model <name> 在本会话修好;加 --global 把变更持久化到 config.yaml。注意会话中途切换会重置提示缓存,因此下一轮以全输入价格重读对话——在一个长会话上,直接用对的模型新开一次可能更便宜。
2. 检查上下文占用 {#2-check-context-usage}
症状: 会话开局不错,但响应变慢、被截断,或开始丢失早先细节。
检查: 运行 /usage 看 token 用量和上下文窗口状态,或 /context 可视化拆解窗口里被什么占着(系统提示、工具定义、技能、记忆、对话) vs 空余空间。
意味着: 长对话累积消息和工具输出,逼近上下文上限。当你在长会话中注意到退化时:
# 压缩对话(摘要历史,保留关键上下文)
/compress
# 或新开一个会话
/new
/compress 摘要对话历史,大幅降低 token 数同时保留关键上下文。/compress here [N] 逐字保留最近 N 轮交流、摘要其余部分,而聚焦主题(/compress focus <topic>)收窄全文摘要保留什么。
长会话中定期用 /compress,而非等出问题;并周期性 /usage 看你处在哪。
3. 核实检测到的上下文长度 {#3-verify-the-detected-context-length}
症状: 上下文问题异常早出现——第一次长对话就撞上限,或压缩远比模型标称窗口应有的早。
检查: 看 CLI 启动行——它显示检测到的上下文长度(例如 📊 Context limit: 128000 tokens)。会话中也可用 /usage 查。
意味着: Hermes 可能为你的模型自动检测错了上下文长度。显式设置:
# 在 ~/.hermes/config.yaml
model:
default: your-model-name
context_length: 131072 # 你模型的实际上下文窗口
或对自定义端点,在提供商条目上按模型设置:
providers:
my-server:
api: "http://localhost:11434/v1"
models:
qwen3.5:27b:
context_length: 64000
Ollama 用户:若你设了自定义 num_ctx,在 Hermes 里设匹配的上下文长度——Ollama 的 /api/show 报告模型的最大上下文,而非你配置的有效 num_ctx。在运行中的网关上,改 model.context_length 或任何 compression.* 键在下一条消息生效——无需重启。
自动检测如何工作及所有覆盖选项见上下文长度检测。
4. "我告诉过它什么,它忘了"——冻结的记忆快照 {#4-i-told-it-something-and-it-forgot--the-frozen-memory-snapshot}
症状: 你在本次会话中让 Hermes 记住某事,它确认已保存,但同一会话稍后它似乎不知道。
检查: 没坏——看时机。会话中途保存的记忆立即写盘,但系统提示要到下次会话才反映它。
意味着: 这是有文档记录的、有意的行为。记忆作为会话开始时的冻结快照注入系统提示,且该注入在会话中途从不改变——它为性能保留 LLM 的前缀缓存。智能体在会话中增删记忆条目时,变更立即持久化到磁盘,但只在下次会话开始时出现在系统提示里。工具响应总是显示实时状态,因此保存本身是确认且真实的。
冻结快照的实际含义:会话中"记住 X"意味着 X 保证在下次会话可用。在当前会话内,该事实仍存在于对话历史本身——智能体只有在那部分对话后来被压缩掉时才会忘掉它(见第 7 步)。
完整机制见持久记忆。
5. 记忆是有界且精选的——不是记录 {#5-memory-is-bounded-and-curated--not-a-transcript}
症状: Hermes 不记得上周某次会话的一个细节,尽管你们讨论了很久。
检查: 记忆容量和内容。系统提示的记忆头显示用量(例如 [67% — 1,474/2,200 chars]),hermes journey list 列出每条已存记忆条目和技能。
意味着: 持久记忆有意有界——MEMORY.md 2,200 字符(约 800 token),USER.md 1,375 字符(约 500 token)。它装的是精选关键事实,不是对话记录。值得存的是偏好、环境事实、惯例和纠正;原始讨论细节按设计不存那里。
对"我们上周讨论过 X 吗?"这类回忆,智能体有单独机制:session_search 查询所有历史会话(存于 SQLite,带全文搜索),能找到几周前讨论过的事,即使不在活动记忆里。直接问——"搜我们过去的会话里关于部署的讨论。"
你也可以直接帮忙:一次有成效的会话后说"下次记住这个",或当它接近容量时说"整理一下你的记忆",让智能体合并条目。见记忆与技能技巧和容量管理。
6. 检查技能和工具是否加载 {#6-check-that-skills-and-tools-are-loaded}
症状: Hermes 以前娴熟处理某个特定工作流,现在却生涩地处理,或说它做不了以前做过的事。
检查:
/skills——浏览已装技能(智能体依赖的某个技能可能被移除了)。/reload-skills——重新扫描~/.hermes/skills/找新装或移除的技能。/tools list——看可用工具;之前用/tools disable禁用的工具在本会话中一直不在智能体工具集里。/context all——按技能、按工具集的开销清单,兼作实际加载了什么的盘点。
意味着: 技能是智能体的程序性知识——多步工作流和工具专属指令。若某个技能缺失或工具集被裁剪(例如用 hermes chat -t "terminal" 启动会话以减轻提示负担),智能体在该会话里真的可用手段更少。用 /tools enable 重新启用工具,或按名显式调用技能(/github-pr-workflow)确认它加载了。
7. 压缩副作用 {#7-compression-side-effects}
症状: 长会话后(或刚跑完 /compress),Hermes 记得大意但丢了对话早前的精细细节。
检查: 压缩是否触发过——/usage 和 /context 在消息平台上显示压缩统计和上下文状态,手动 /compress 总会报告其结果。
意味着: 压缩用摘要替换较早的对话历史——这正是目的,且它必然用细节换余量。了解它的形状:
- 最近消息受保护:默认最后 20 条消息保持未压缩(
protect_last_n),开场交流被钉住(protect_first_n: 3),使原始目标保持可见。 - 压缩是非破坏性的:默认
compression.in_place: true下,会话保持一个持久 id,压缩前轮次被软归档——仍可经session_search搜索、可恢复,而非删除。 in_place: false(旧行为)下,每次压缩轮换到一个链接到旧会话的新会话——一个有标题的会话变成"my project" → "my project #2" → "my project #3"。若你按标题恢复,hermes -c "my project"自动选最近的变体。- 聚焦主题收窄全文摘要保留什么:
/compress focus auth-refactor保留那条线索的细节,代价是其余部分。
若被压缩掉的细节重要,让智能体去搜(session_search 能触达归档轮次),或把关键事实重新粘进对话。
完整设置参考见上下文压缩,有标题会话如何链式见压缩时自动谱系。
速查表 {#quick-reference}
| 症状 | 首条命令 | 可能原因 |
|---|---|---|
| 一切都显得能力下降 | /model | 会话落在与你以为不同的模型上 |
| 长会话退化 | /usage | 上下文压力——压缩或新开 |
| 限早期就撞上限 | CLI 启动行 / /usage | 自动检测的上下文长度错了 |
| 忘了本会话说过的话 | —(设计如此) | 冻结记忆快照——下次会话出现 |
| 忘了上周的讨论 | 让它 session_search | 记忆有界,只存精选事实 |
| 丢了某项特定能力 | /skills、/tools list | 本会话未加载技能或工具集 |
| 长会话后丢了旧细节 | /usage、/context | 压缩摘要了较早历史 |