1. 记忆粒度与归属:为什么你的 Hermes Agent 记了一堆却用不上
Hermes Agent 是一个可本地部署、支持多 profile 的 AI Agent 运行框架,它能读写文件、调用技能、执行多步任务,适合想把 Agent 真正用进日常交付流程的人。但很多人第一次配记忆就翻车:要么记忆文件里只有一句「用户喜欢表格」,Agent 交付时表格格式换了三种;要么把用户画像、项目背景、历史决策全塞进去,每次会话光读记忆就吃掉一大截上下文,成本涨了,重点反而被淹没。
问题的根子不在「写多写少」,而在两个更底层的东西:粒度和归属。粒度是每条记忆写多细——是一句话偏好,还是带字段规范的结构化条目;归属是这条内容该放哪一层——是放进身份文件 SOUL,还是放进记忆文件 MEMORY。我实测下来,把行为纪律写进记忆,触发率只有 1-2/3;同样的句子写进 SOUL,3/3 全触发。这不是玄学,是 Agent 对「我是谁」和「我知道什么」的处理方式不同。
这篇是 Hermes Agent 调教实录第三篇,聚焦记忆系统的粒度划分与归属策略,给出可直接复制的 SOUL 配置骨架、config.toml/settings.json 级配置片段,以及三步验证动作。你跟着做完,能在自己的 Agent 上复现「粗粒度起步、纪律进身份、沉淀要限量」这套分层原则。适合已经在跑 Hermes Agent、但记忆越写越乱的人;如果你还没配过记忆,也能从零跟下来。
2. 前置:TaoToken 接入与 Hermes Agent 环境准备
Hermes Agent 本身不绑定模型供应商,它通过 OpenAI 兼容接口调用后端模型。我这次实验用的是 TaoToken 提供的 API 通道,原因是它同时支持对话模型和编码类模型,切换模型只改一个 base_url 和 model 名,不用动 Agent 主体逻辑。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,直接填进配置即可)。
你需要先拿到一个 API Key。进控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,然后在 API Keys 页面生成密钥:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。Key 只在创建时完整显示一次,复制后存进环境变量,别硬编码进配置文件。
环境变量这样设(Linux/macOS):
export TAOTOKEN_API_KEY="sk-你的密钥" export TAOTOKEN_BASE_URL="https://taotoken.net/api"Windows PowerShell:
$env:TAOTOKEN_API_KEY="sk-你的密钥" $env:TAOTOKEN_BASE_URL="https://taotoken.net/api"Hermes Agent 的 profile 目录结构大致是这样,后面所有配置都落在这里:
~/.hermes/ profiles/ default/ config.toml # 运行参数、模型接入 settings.json # 记忆/技能开关、路径 SOUL.md # 身份层:纪律、自我要求 MEMORY.md # 记忆层:偏好、环境事实、约定 skills/ # 技能目录如果你还没装 Hermes Agent,先按官方文档把 CLI 跑起来,确认hermes --version有输出再继续。模型接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的 base_url 和鉴权说明。
3. 可复制配置:SOUL 骨架 + config.toml + settings.json
这一节是全文核心,给你三份可直接抄的配置。先讲分层原则,再给文件内容。
分层原则一句话:行为纪律进 SOUL,参考信息进 MEMORY。纪律是「我必须这样做」,比如「任务匹配技能时先加载技能再动手」「写完自测」;信息是「我知道这些」,比如「用户偏好表格化」「输入在 inputs/ 目录」。Agent 对 SOUL 的服从是身份级的,对 MEMORY 的引用是参考级的,混放就会导致纪律被当建议。
3.1 SOUL.md 配置骨架
SOUL 只放纪律,条目控制在 5-8 条,每条一句话,动词开头。下面是我实测触发率最高的骨架:
# 身份:Hermes 交付型 Agent ## 行为纪律(必须执行) - 任务匹配技能时,先加载技能再动手,不允许跳过技能检查。 - 任何交付物写完后,先自测一遍再汇报,自测不通过不交付。 - 具体数据必须标注来源,来源不明时明确写「来源待确认」。 - 输出文件只写入 outputs/,绝不写回 inputs/。 - 汇报与沉淀分离:沉淀写进记忆,汇报照常完整输出。 ## 自我要求 - 我是交付型 Agent,宁可少做一步,不做未验证的一步。 - 遇到不确定的环境事实,标注「(推断)」,不当作事实使用。注意最后一条「自我要求」——它专门用来压制自主沉淀时把猜测当事实的毛病。实测里 Agent 会把「输出文件是框架预建的占位文件」这种误解写进记忆,加了这条之后,同类猜测会被标注成推断。
3.2 config.toml 模型接入片段
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "deepseek-v4-flash" temperature = 0.3 max_tokens = 4096 [agent] profile = "default" max_turns = 20 memory_enabled = true soul_enabled = true [memory] # 记忆文件路径 path = "~/.hermes/profiles/default/MEMORY.md" # 每轮沉淀上限,防止接力链成本膨胀 max_entries_per_turn = 3 # 只沉淀验证过的事实 require_verified_facts = truemax_entries_per_turn = 3是关键参数。不设限时,Agent 每轮沉淀 8-9 条,接力几轮后上下文成本能到基线的 2.49 倍。限到 1-3 条,成本可控,质量反而更聚焦。
3.3 settings.json 记忆与技能开关
{ "memory": { "enabled": true, "layer": "memory", "auto_sediment": true, "sediment_limit": 3, "cleanup_interval_turns": 10, "guess_marker": "(推断)" }, "soul": { "enabled": true, "layer": "identity", "strict_mode": true }, "skills": { "preload_on_match": true, "check_before_task": true } }strict_mode: true让 SOUL 里的纪律以强约束方式注入系统提示,这是触发率从 1-2/3 提到 3/3 的开关。cleanup_interval_turns: 10每 10 轮清理一次过期记忆条目,防止接力链无限膨胀。
3.4 MEMORY.md 粗粒度起步模板
记忆从 5 条起步,别一上来就写 10 条结构化。实测粗粒度成本只有基线的 0.8 倍,细结构化成本 1.24 倍但达标率只高不到 4 个点。
# 用户偏好 - 用户偏好表格化呈现、中文标题。 - 具体数据必须标注来源。 # 环境事实 - 本环境任务输入在 inputs/ 目录,产物写入 outputs/。 - 清洗类任务按:去重、规整、脱敏三步执行。 # 项目约定 - 交付文档统一用 Markdown,代码块标注语言。这三段就是最小可用记忆。等你发现某类任务反复因为细节缺失返工,再往对应段落补条目,按需细化。
4. 三步验证:确认粒度与归属真的生效
配完不算完,得验证。下面三步是我每次改完记忆配置都会跑的,能直接看出纪律触发和沉淀质量。
4.1 第一步:验证纪律触发率
构造一个必然匹配技能的任务,看 Agent 是否先加载技能。在 profile 目录下执行:
hermes run --profile default \ --task "清洗 inputs/raw.csv,去重后输出到 outputs/clean.csv" \ --trace--trace会打印每轮的技能检查记录。看输出里有没有skill_check: triggered这一行。如果连续三次任务都出现,说明 SOUL 里的纪律生效了。我实测把这条纪律放 MEMORY 时,三次里只有一到两次触发;放 SOUL 加strict_mode后,三次全触发。
4.2 第二步:验证沉淀限量与猜测标注
跑一个多轮接力任务,观察每轮沉淀条数和是否有「(推断)」标注:
hermes run --profile default \ --task "分三轮处理 inputs/ 下的三个文件,每轮结束后沉淀经验" \ --trace --memory-dump--memory-dump会在每轮结束打印新增记忆条目。正常表现是:每轮新增 1-3 条,超过 3 条被截断;出现环境猜测时带「(推断)」后缀。如果看到某轮新增 8 条以上,检查max_entries_per_turn是否生效;如果猜测没标注,检查 SOUL 里那条「自我要求」是否写进去了。
4.3 第三步:验证成本与达标率
对比开记忆和关记忆两轮同任务的 token 消耗:
# 开记忆 hermes run --profile default --task "生成季度数据报告" --stats # 关记忆(临时) hermes run --profile default --task "生成季度数据报告" --no-memory --stats--stats输出总 token 和轮数。粗粒度记忆的正常表现是 token 比无记忆低 10%-20%,因为减少了探索返工。如果开记忆反而贵很多,多半是记忆条目太细或沉淀没限量,回到 3.4 节精简。
5. 本篇常见错排查
配记忆踩的坑比较集中,列几个我遇到过的,对照排查。
纪律写进 MEMORY,触发弱。现象是技能检查时有时无。原因是记忆层被 Agent 当参考信息,不是硬约束。修复:把纪律条目从 MEMORY.md 移到 SOUL.md,并在 settings.json 里开strict_mode。
记忆写太细,成本涨收益低。现象是 token 到基线的 1.2 倍以上,达标率没明显提升。修复:默认粗粒度,只对高度依赖具体规范的任务(字段规范、行业术语)补细节条目。
任务后沉淀不限量,接力成本爆炸。现象是多轮任务越跑越贵,第三轮 token 是首轮的两三倍。修复:config.toml 里设max_entries_per_turn = 3,settings.json 里设cleanup_interval_turns,定期清理过期条目。
猜测被当事实沉淀。现象是记忆里出现「输出文件是框架预建的」这类没验证过的环境描述,后续轮次当真使用。修复:SOUL 里加「不确定的环境事实标注(推断)」,config.toml 里开require_verified_facts = true。
沉淀把汇报挤没了。现象是 Agent 说「结果已在上方输出」,最终回复极简。原因是沉淀和汇报混在一起。修复:SOUL 里明确「沉淀与汇报分离」,沉淀进记忆,汇报照常完整。
多项目共用 Agent,环境事实串味。现象是 A 项目的目录约定被用到 B 项目。修复:环境事实只写通用的,项目约定放项目级约束文件,别写进全局 MEMORY。
6. 继续往下:模型切换、编码计划与文档入口
记忆配好之后,下一步通常是换模型做对比,或者把 Agent 接进长期编码流程。这两条路我都走过,给你分流入口。
想验证不同模型对同一套记忆配置的反应,用模型对话页快速试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。同一个 SOUL 骨架,换 deepseek-v4-flash 和别的模型跑,触发率会有差异,值得实测。
如果你要把 Hermes Agent 长期用于编码或 Agent 流水线,看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合需要稳定调用、多轮接力的场景,配合本篇的沉淀限量策略,成本能压住。
接入细节和参数说明都在文档里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。ClaudeCodeAnthropic 相关配置单独有一页:https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite ,需要接 Anthropic 系模型的从这进。
最后留一句实操经验:改完 SOUL 或 MEMORY 后,别急着跑长任务,先用 4.1 节那条单任务命令验证纪律触发,确认skill_check: triggered出现了再往下走。记忆配置的调试成本,远低于跑废一轮长任务的成本。