Hermes Agent 记忆优化:从 76% 爆满到 17% 的扩容与清理实录

背景

Hermes Agent 有两个持久化记忆存储,在每次对话的开头注入到系统提示里,帮 AI 跨会话保持上下文:

存储类型默认限制用途
Memory(个人笔记)2,200 字符环境事实、项目约定、工具技巧
User Profile(用户画像)1,375 字符用户偏好、身份信息、沟通风格

随着日常使用,记忆条目不可避免地膨胀,很快撞到天花板。

问题发现

有次顺手看了眼 memory 状态 ——12 条记忆,1,672 / 2,200 字符,76%

更麻烦的是,里面有大量纯配置类信息:Stalwart 邮箱的 SMTP 参数、Firecrawl 配置、火山引擎 API Key 等等。这些东西本来就在 config.yaml.env 里存着,在 memory 里又放了一份,纯属浪费。

弯路:尝试 holographic 插件

最初的想法是借助外部工具。holographic 是一个号称能「扩展 AI 上下文记忆」的 Python 包。于是装了试试:

Terminal window
pip install holographic

结果很惨烈。holographic 版本太老(0.0.1),安装时把 Hermes Agent 0.14.0 的核心依赖全部降级:

  • pydantic 2.13.4 → 1.10.26
  • requests 2.33.0 → 2.28.2
  • rich 14.3.3 → 13.0.1
  • click 8.3.2 → 1.8.8
  • cryptography 46.0.7 → 39.0.2

Hermes 本身和 firecrawl-py、mcp 等工具全部罢工。立刻 pip uninstall 回滚。

教训:不要往 Hermes 的 venv 里装第三方包,依赖冲突的风险远大于收益。

正解:它本来就是配置项

回滚后换个思路。直接在 Hermes 安装目录里搜:

Terminal window
grep -r "memory_char_limit\|2200" /usr/local/lib/hermes-agent/

hermes_cli/config.py 找到了默认值:

"memory_char_limit": 2200, # ~800 tokens at 2.75 chars/token

又在 agent/agent_init.py 里确认了 config.yaml 可以覆盖它:

memory_char_limit=mem_config.get("memory_char_limit", 2200),

也就是说,根本不需要任何插件 ——memory_char_limit 本身就是 config.yaml 的可配置项,只是很少人知道。

扩容

一行命令:

Terminal window
hermes config set memory.memory_char_limit 8000
hermes config set memory.user_char_limit 4000
配置项默认值新值增幅
memory_char_limit2,2008,0003.6x
user_char_limit1,3754,0002.9x

扩容后同样的 1,360 字符只占 17%。但空间多了不等于可以乱塞,关键在于清理。

清理:配置不入记忆

扩容治标,关键还要治本。memory 里不应该存 API Key、端口号、SMTP 参数这类纯配置 —— 它们在 config.yaml / .env 里已经有了。

清理掉三条:

删除的条目原来放哪
Stalwart 邮箱配置(SMTP 465 / IMAP 993).env 中已有
Firecrawl / Browserless 配置config.yaml 中已有
火山引擎文生图(Key + Prompt 模板)config.yaml 中已有

再看一眼前后对比:

清理前: 12 条 / 1,672 字符 / 76% 🟡
扩容前: 8 条 / 1,360 字符 / 61%(旧限制)
扩容后: 8 条 / 1,360 字符 / 17%(新限制)🟢

什么该放 Memory

这次优化沉淀出一个判断标准:

应该存不应该存
用户行为偏好(「本地执行,别 SSH」)API Key、密码、端口号
项目约定(「文档放 /root/archives/」)服务安装 / 配置参数
环境事实(「两台 NUC9 的 IP」).env / config.yaml 里能查到的任何值
工具技巧 / 经验教训版本号、commit SHA
跨会话有用的稳定事实临时任务状态

一句话:memory 存的是「事实」和「偏好」,不是「配置」。配置放配置文件。

如果把大量配置类数据塞进 memory,不仅浪费空间,更重要的是 —— 配置改了还得记得同步改 memory,迟早不一致。从根源上分开,才是最省心的做法。

技术要点

  1. Hermes 的 memory 限制路径:memory.memory_char_limitmemory.user_char_limit
  2. 修改命令:hermes config set memory.memory_char_limit 8000
  3. 修改后 /reset 或新会话生效
  4. 不要往 Hermes 的 venv 装包 —— 依赖冲突恢复麻烦
  5. Memory 质量比数量重要 —— 定期清理配置类冗余条目