Hermes Agent:跨会话记忆与自我进化技能详解
Hermes Agent是一个开源的AI代理框架,具有跨会话记忆、自我进化技能和离线优化能力。
如何阅读本文
本文分为两大部分:先理论,后实践。
时间紧张?可以直接跳到 快速上手 部分。其中的命令可以独立运行。
但理解理论会让你获得更大收益。了解技能如何自我进化、记忆如何构成、以及何时 GEPA 发挥作用,将决定你只是把 Hermes 当作一个带笔记的聊天机器人使用,还是把它当作一个能持续增值的工具。
接下来你将看到:
- Hermes Agent 到底是什么。 核心介绍,以及与 OpenClaw 的对比。
- 它是如何构建的。 一张图看懂架构。
- 在记忆之前:Agent 是谁? SOUL.md,身份层。
- 记忆系统。 三层记忆,三种速度。
- 自我进化的技能。 Agent 自创的操作手册,加上策展人(Curator)。
- GEPA。 离线技能优化。
- 快速上手。 安装、Telegram、第一个 Agent。
- 运行多个 Agent。 配置文件、三种人格、定时摘要。
- 根据你的需求自定义 Agent。
Hermes 是什么,以及它在架构上的独特之处
一句话概括:一个你用得越久就变得越好的 Agent。
其实现的关键在于,三个通常相互独立的能力被整合在同一个框架中:运行时技能学习、持久化多层记忆,以及一个可选的权重训练管道。目前没有其他开源 Agent 能同时提供这三项能力。
在开源生态系统中,与之最接近的是 OpenClaw。两者都是持久化的、适合消息平台的,但它们在架构上做出了相反的选择。
来自 Kilo 博客的一个清晰概括是:“Hermes 是在一个学习型 Agent 外面包装了一个网关。而 OpenClaw 是在一个消息网关外面包装了一个 Agent。”

它是如何构建的
在理解学习循环之前,你需要先了解 Hermes 的基本结构。
所有流程都通过 run_agent.py 脚本中的同一个 AIAgent 类进行。CLI、消息网关、批量运行器、IDE 集成:它们都是同一核心 Agent 的入口点。
这就是跨平台策略能够真正起效的原因。

核心循环是 ReAct 风格且同步的。构建系统提示、检查是否需要压缩、进行可中断的 API 调用、执行任何工具调用、然后再次循环。
一些稍后会用到的重要细节:
- Agent 可以在六个不同的位置运行命令:本地终端、Docker、SSH、Modal、Daytona 或 Singularity。同样的代码,只需更改配置文件即可。将执行环境从你的笔记本电脑迁移到云端 GPU 服务器,而无需改动其他任何东西。
- 它几乎可以兼容任何模型。一个翻译层将任何提供商的路由映射到三种 API 格式之一。这就是你可以用一条命令从 Claude 切换到 GPT,再切换到 Gemini,再切换到本地 Ollama,一切正常运行的原因。
- Agent 每个任务有 90 轮交互的硬性限制。如果没有这个限制,陷入循环的 Agent(重试失败的 API、重新读取同一个文件)会悄无声息地消耗你的额度。子 Agent 共享同一个预算,因此失控的委派链也无法绕过这个限制。
有了这些基础,我们可以进入更精彩的部分了。
在记忆之前:Agent 是谁?
在我们讨论记忆和自我进化的技能之前,有一个层位于两者之上:身份。
记忆是 Agent 所知道的。技能是它做事的方式。但两者都无法说明它出现时是谁。没有身份层,每个 Agent 给人的感觉就像戴着不同帽子的同一个 Agent。
Hermes 通过一个文件解决了这个问题:SOUL.md。
它位于 ~/.hermes/SOUL.md,并占据系统提示中的 1 号位,在其他任何内容加载之前。它定义了 Agent 的性格、语气、沟通风格和硬性限制。
SOUL.md 是手动编写且静态的。你一次性写好,随着时间的推移进行调整,它在每个项目和每个会话中都保持一致。如果文件缺失,Hermes 会回退到内置的默认身份。
为什么这对自我改进的故事很重要?因为接下来的一切(Agent 编写的记忆、创建的技能、整合知识的方式)都是通过这个身份视角进行的。
SOUL.md 是固定的框架。记忆和技能是其中的活动部件。
记忆系统:三层记忆,三种速度
Hermes 没有单一的“记忆”。它有三层,每一层都有不同的用途。

第一层:两个微小的 Markdown 文件
核心是两个存储在磁盘上的文件:
MEMORY.md(最多 2200 个字符)保存 Agent 关于你环境、项目约定、工具技巧和经验教训的笔记。USER.md(最多 1375 个字符)保存你的个人资料:姓名、沟通偏好、技能水平和需要避免的事情。
两者都在会话开始时作为冻结的快照注入系统提示。如果 Agent 在会话中途写入新的记忆条目,该更改会立即持久化到磁盘,但直到下次会话才会出现在系统提示中。
当记忆快满时(约 80% 容量,在系统提示头部以百分比显示),Agent 必须进行整合。
它会将相关条目合并为更密集、信息量更大的版本,以便只保留有用的信息。
第二层:全文会话搜索
每一次对话(CLI 和消息平台)都存储在带有全文搜索功能的 SQLite 中。Agent 可以搜索数周前过去的对话。
其中的权衡很明显:第一层始终在上下文内但容量极小。第二层有无限容量,但需要主动搜索加上 LLM 摘要。
关键事实存在于记忆中。其他所有内容可按需搜索。
第三层:外部记忆提供商(8 个插件)
为了更深入的持久化记忆,Hermes 提供了 8 个可插拔的提供者,它们与内置记忆并行运行(从不替代内置记忆)。一次只能激活一个。
当任何外部提供者激活时,Hermes 会在每一轮交互前自动预取相关记忆,在每次回复后同步对话轮次,并在会话结束时提取记忆。

自我进化的技能:Agent 编写自己的操作手册
记忆处理事实。技能处理流程。
技能是带有 YAML 前置元数据的 Markdown 文件,充当 Agent 的程序性记忆:不是它知道什么,而是它如何做事。
以下是技能的结构:
为了降低 Token 成本,技能使用渐进式披露:

- 等级 0:Agent 只看到名称和描述(整个目录约 3000 个 Token)
- 等级 1:当它实际需要某个技能时,才会加载完整的技能内容
- 等级 2:它可以深入到技能内的特定参考文件
自我改进循环
这是核心差异化因素。Agent 使用 skill_manage 工具自主创建自己的技能。技能创建会在以下情况触发:
- Agent 完成一个复杂任务(5 次以上工具调用)
- 它遇到错误或死胡同,并找到了可行的路径
- 用户纠正了它的方法
- 它发现了一个重要的工作流程
因此循环是这样工作的:Agent 遇到问题 -> 通过试错解决 -> 将成功的方法保存为 SKILL.md 文件 -> 下次遇到类似问题时,它加载技能并按照已验证的流程执行,而不是从头开始重新发现方法。
该工具支持六种操作:创建、补丁(针对性修复,推荐使用,因为 Token 效率高)、编辑(完整重写)、删除、write_file 和 remove_file。

策展人(The Curator):技能的垃圾回收
如果没有维护,Agent 创建的技能会堆积起来。最终你会得到几十个狭窄、重叠的操作手册,浪费 Token 并污染目录。
策展人是一个后台维护系统,负责处理这个问题。它通过不活动检查运行(不是 cron 守护进程):如果自上次运行以来已过去 7 天且 Agent 已空闲 2 小时以上,则一个后台分支的 Agent 会启动,拥有自己的提示缓存,并且永远不会触及活动会话。
它分两个阶段运行:
- 自动转换(确定性,无需 LLM):30 天未使用的技能变为陈旧。90 天未使用的技能会被归档。
- LLM 评审(最多 8 次迭代):一个分支的 Agent 调查所有 Agent 创建的技能,并逐个决定是保留、修补、合并还是归档。
两个重要限制:
- 策展人永远不会触及捆绑安装或从中心安装的技能。只处理 Agent 自创的技能。
- 它永远不会自动删除。最坏的情况是归档到
~/.hermes/skills/.archive/,可以通过一条命令恢复。
在每次策展人运行之前,Hermes 会为整个技能目录创建一个 tar.gz 快照。回滚只需一条命令,并且回滚本身也是可逆的。
你还可以使用 hermes curator pin <skill> 固定关键技能,以保护它们免于归档和删除。修补和编辑仍然会执行,因此 Agent 可以在不要求你先取消固定的情况下改进被固定的技能。

GEPA:通过执行踪迹离线进化技能
接下来的内容非常有趣。
Agent 内部的学习循环(技能创建 + 策展人)有一个已知的弱点:
- Agent 倾向于自我表扬。它几乎总是认为自己表现良好,即使事实并非如此。社区反馈已经证实了这一点。
- 同一个自动生成技能的系统也可能用更差的版本覆盖手动自定义的内容。
这就是 GEPA 的用武之地。
GEPA(遗传-帕累托提示进化)并非内置于 Hermes 运行时中。它位于一个配套的代码仓库(NousResearch/hermes-agent-self-evolution)中,作为一个离线优化管道运行。它以 ICLR 2026 Oral 论文 的形式发表,采用 MIT 许可。
核心理念:不再询问 Agent“你做得好吗?”,GEPA 读取执行踪迹来理解失败的原因,然后通过进化搜索提出有针对性的改进方案。
管道流程:
- 从 Hermes 仓库读取当前技能
- 生成评估数据集(通过 Claude Opus 生成的合成测试用例、来自 SQLite 的真实会话历史,或人工策划的黄金数据集)
- 运行 GEPA 优化器:读取执行踪迹 -> 理解失败点 -> 生成候选变体
- 使用 LLM 作为裁判,通过评分标准(而非二元的通过/失败)对候选方案进行评估
- 应用约束门:完整的测试套件必须 100% 通过,技能保持在 15KB 以下,缓存兼容性得以保留,语义目的不发生偏离
- 最佳变体作为 Pull Request 提交到 Hermes 仓库。永远不会直接提交。
不需要 GPU。所有操作都通过 API 调用完成。成本:每次优化运行约 2-10 美元。
这在开始时可以跳过,但当你在使用微调(RL/GRPO)遇到瓶颈且不想投入时间和金钱时,它非常有效。更多详情请查看此仓库 →

我最近写了一篇关于 GEPA 的文章。在进行完整的微调或基于 RL 的微调之前,这是一个值得尝试的绝佳替代方案。

Akshay 🚀
@akshay_pachaar
· 5月1日

文章
如何在不触碰模型权重的情况下击败 GRPO
伯克利的一个团队以 35 倍更少的采样次数和零 GPU 训练,将 GRPO 性能提升了 10 个百分点,并揭示了大多数团队在提示优化上仍然走入歧途的原因。你花了两周时间微调一个 8B 模型……
好的,总结一下:
SOUL.md 设定了身份。运行时循环捕获经验。策展人保持技能库的整洁。GEPA 确保库中的内容确实有效。
以上就是完整的理论部分。现在,我们让它在你自己的机器上运行起来。
快速上手
支持 Linux、macOS 或 WSL2。安装程序自带 Python 3.11+。对于基于 API 的使用方式,8GB 内存即可。
一行安装命令:
curl -fsSL https://hermes-install.nousresearch.com | sh
运行设置向导。它会引导你配置提供商、API 密钥、模型和工具:
hermes setup
在终端中开始聊天:
hermes run "帮我写一个 React 按钮组件"
将其连接到 Telegram:
hermes gateway connect --platform telegram
如果你希望从手机(而非终端)与 Agent 对话,请将其指向一个 Telegram 机器人。
从 @BotFather 获取机器人Token(运行 /newbot),然后从 @userinfobot 获取你的 Telegram 用户 ID。
这样就完成了。你现在拥有一个可运行的 Agent 了:

~/.hermes/ 目录下有什么
安装完成后,你的主目录会多出一个新文件夹。
了解其布局很重要,因为你使用 Hermes 所做的每一件事都会涉及到这些路径之一。
| 路径 | 用途 |
|---|---|
~/.hermes/config.yaml |
主配置文件 |
~/.hermes/.env |
密钥环境文件 |
~/.hermes/SOUL.md |
Agent 身份定义 |
~/.hermes/skills/ |
技能目录 |
~/.hermes/state.db |
会话搜索数据库 |
~/.hermes/profiles/ |
备用 Agent 配置文件 |
~/.hermes/sessions/ |
日志和回放数据 |
有几个文件值得仔细了解。
config.yaml是所有非秘密信息的真实来源。模型选择、终端后端、工具启用、MCP 服务器都存放在这里。使用hermes config edit编辑,或使用hermes config set <key> <value>逐个设置值。.env保存你的密钥。API 密钥、机器人Token、密码。Hermes 会自动将类似密钥的值路由到这里。SOUL.md是系统提示中的 1 号位,位于所有其他内容之前。身份层,前面已经介绍过。skills/是整个学习循环的所在地。Agent 创建的每个技能,以及你安装的所有技能,都存放在这里。state.db是支持会话搜索的 SQLite 数据库。采用 WAL 模式,FTS5 索引。这就是“我们三周前讨论了什么?”能够起效的原因。
你大部分时间不需要手动编辑这些内容。但了解布局有助于理解其余所有内容。
添加新技能
Hermes 维护着自己的官方 技能中心,拥有 687 个技能,涵盖 18 个类别。具体分类如下:
- 87 个内置技能,随 Agent 一起提供
- 79 个可选技能,可按需启用
- 16 个来自 Anthropic(前端设计、pdf、pptx、docx、mcp-builder 等)
- 505 个来自 LobeHub(更广泛的社区贡献)

你也可以将任何 GitHub 仓库添加为自定义 tap:
hermes tap add my-team-skills https://github.com/my-org/hermes-skills
这就是在团队中共享技能或维护你自己的私有技能库的方法。
从 1 个 Agent 扩展到 10 个 Agent
一个 Agent 就很好用。多个专门化的 Agent 才是 Hermes 真正的亮点所在。
Hermes 为此提供了一个一等公民特性,称为 profiles(配置文件)。每个 profile 是一个完全隔离的 Hermes 实例,拥有自己的配置、记忆、技能、会话和 SOUL.md。默认情况下,它们之间不共享任何内容。
我们将设置三个:一个设计师、一个程序员和一个研究员。
创建一个团队
hermes profile create designer --clone
hermes profile create programmer --clone
hermes profile create researcher --clone
--clone会复制你默认 profile 的 config.yaml 和 .env 作为起点。

为每个 Agent 配置独立的 Telegram 机器人
每个 profile 需要从 BotFather 那里获得一个独立的机器人。Telegram 只允许每个Token建立一个连接,因此共享Token会导致问题。
使用 BotFather 运行 /newbot 三次,保存三个Token。然后为每个 profile 运行一次网关向导:
hermes gateway connect --platform telegram --profile designer
hermes gateway connect --platform telegram --profile programmer
hermes gateway connect --platform telegram --profile researcher
设置过程与普通 Agent 完全相同,你可以在 BotFather 中再次创建机器人,并将它们连接到各自的 Agent。
通过 SOUL.md 为每个 Agent 赋予个性
这是 Agent 之间真正变得不同的关键。编辑每个 profile 的 SOUL.md。
设计师的 ~/.hermes/profiles/designer/SOUL.md 文件:

程序员的 ~/.hermes/profiles/programmer/SOUL.md 文件:
研究员的 ~/.hermes/profiles/researcher/SOUL.md 文件:
自定义程序员:将执行路由到 Claude Code
如果程序员不仅仅自己编写代码,而是将执行委托给 Claude Code CLI,那会更有趣。Hermes 负责编排。Claude Code 负责文件编辑、运行命令、管理 git。Hermes 读取结果并决定下一步做什么。
这也是我如何在我自己的 Claude Max 订阅之上运行它的方式。无需单独的 API 密钥。Claude Code 会自动使用 Max 的凭证。
启动一个会话并发送这个单一的激活提示:
我已经订阅了 Claude Max。你是我的员工工程师,帮助我处理日常编码任务,在后台你使用 Claude Code 进行所有执行。请相应地进行设置。
程序员将自行安装 autonomous-ai-agents/claude-code 技能,验证 claude 是否在 PATH 中,并开始将其用于代码执行。从下一条消息开始,任何与编码相关的内容(读取文件、编写代码、运行测试、提交、推送)都会通过底层的 Claude Code 进行。
有两件事值得了解:
- 在激活之前,请确保 claude 在你的 PATH 中。运行
which claude应该显示一个真实的二进制路径。 - Claude Code 既有打印模式(一次性、快速、无 TUI),也有交互模式(完整的 tmux 会话)。程序员会根据任务自行选择。你不需要为此操心。
自定义设计师:教会它你的视觉风格
当设计师能够生成你个人风格的图像,而非通用的 AI 输出时,它才会真正变得有用。模式是:提供参考设计,让它研究,要求它创建一个能生成相同风格新图像的技能。
这是自我改进循环被用作设置机制的例子。你不是手动编写技能,而是向 Agent 展示好的示例,并要求它自行编码出模式。
启动一个与设计师的会话,粘贴你的参考图片(CLI 中拖放,或 Telegram 中附件)。然后发送这个提示:
设计师将研究参考资料,编写 SKILL.md,生成 Python 脚本,将其保存到 ~/.hermes/profiles/designer/skills/my-design-style/,并验证脚本可以运行。
如果你之抢跑过 hermes setup 并选择了 OpenRouter 作为提供商,由于使用了 --clone,密钥已经在设计师 profile 的 .env 中了。如果没有,请添加一次:
hermes config set NANOBANANA_API_KEY your_key --profile designer
从那时起,要求设计师制作新的插图就会触发该技能。它会根据你的风格特征编写提示,通过 OpenRouter 调用 Nano Banana,并保存输出结果。
同样的模式适用于任何需要特定风格的输出。提供参考内容,让 Agent 构建一个能重现该模式的技能。比如:新闻简报引言、X 平台帖子、代码审查评论,任何需要一致性的场景。
定时任务:用通俗英语设置 Cron
研究员的 SOUL.md 表示它负责每日 Telegram 摘要。这意味着有一个任务需要按照自己的计划运行,而不需要你记得去询问。这就是 Hermes cron 的作用。
Hermes 自带一个内置调度器。网关守护进程每 60 秒 tick 一次,在隔离的 Agent 会话中运行任何到期的任务,并将输出发送到你指定的任何消息平台。任务在重启后依然存在。它们位于 ~/.hermes/cron/jobs.json,输出位于 ~/.hermes/cron/output/。

有趣的部分在于:你不需要编写 cron 表达式。你用英语描述你想要什么,Hermes 会将其转换。
连接研究员的每日摘要
打开一个与研究员的会话,发送这个提示:
研究员使用其 cronjob 工具创建任务,交付目标默认为当前聊天(此处为 Telegram),然后调度器就会接管。验证任务是否已创建:
hermes cron list --profile researcher
你应该能看到该任务及其下一次计划运行时间。明天早上 8 点,你的 Telegram 会收到摘要。无需进一步操作。
其他有用的模式
cron 语法非常灵活。几个值得了解的变化:
- 一次性延迟。
/cron add 30m "提醒我检查构建"在 30 分钟后运行一次。 - 重复间隔。
/cron add "every 2h" "检查服务器状态"每两小时运行一次。 - 标准 cron 表达式。
/cron add "0 9 * * 1-5" "..."用于精确控制。此处表示工作日上午 9 点。 - 附加技能。
/cron add "every 1h" "总结新 feed 条目" --skill blogwatcher在运行提示之前加载一个技能。
你还可以链式执行任务。一个 cron 的输出通过 context_from 标记成为下一个 cron 的输入。这对于多阶段自动化非常有用,例如想要一个研究步骤为写作步骤提供素材。
到此结束。
感谢你的阅读。请在评论中告诉我,你希望我接下来介绍什么。
如果你更喜欢通过视频学习,我将在几天后于 YouTube 和 X 平台上发布完整的 Hermes Agent 操作指南。
敬请期待!
再见! :)
- 原文链接: x.com/akshay_pachaar/sta...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~