我的 Hermes Agent 每次会话都在变聪明:完整架构解析
Dami-Defi (@DamiDefi)
2026-06-06
D
原文
---
title: "我的 Hermes Agent 每次会话都在变聪明:完整架构解析"
author: "Dami-Defi (@DamiDefi)"
source_url: "https://x.com/DamiDefi/status/2063216842970112330"
published_at: "2026-06-06T11:10:02.000Z"
fetched_at: "2026-06-07T02:38:21Z"
updated_at: "2026-06-07T02:38:21Z"
language: "zh"
review_status: "draft"
---

# 我的 Hermes Agent 每次会话都在变聪明:完整架构解析
配置好 Hermes 程序员 Agent 三周后,它仅用 22 秒就解决了一个我第一次遇到时花了 20 分钟才解决的问题。
不是因为模型变强了。而是因为 Agent 在第一次解决这个问题时就写了一个 skill 文件,把成功的方法以纯 markdown 的形式存了起来,当同样的模式再次出现时自动检索了出来。修复方案本来就在那里,Agent 不需要重新发现它——它记住了。
这就是 Hermes 赖以构建的复利效应。也是它在架构上与当前开源 Agent 领域的其他方案真正不同的地方。
大多数 AI Agent 都很聪明,但没有一个在学习。Hermes 是唯一将运行时 skill 创建、持久化多层记忆和离线 skill 优化流水线整合在单一框架中的开源 Agent。连 OpenClaw 都没能同时做到这三点。正是这种组合,让你在第三个月运行的 Agent 比第一天安装的更加强大——而你不需要修改任何配置。
这篇文章就是完整的架构解析:每一层做什么、为什么重要,以及如何搭建一个 24/7 运行的三 Agent 配置。
### 所有其他 Agent 都面临的核心问题
每个 AI Agent 会话结束时都会以同一种方式失败。
你关闭对话窗口,Agent 刚刚摸索出的所有东西就消失了:它花了十分钟才弄清楚的修复方案、你纠正了两次的项目约定、最后终于奏效的那一串精确步骤——全都没了。下一回合,你得从头解释一遍。
这不是模型智能的问题,而是架构的问题:Agent 没有把学到的东西写下来、之后又能读回去的机制。
Hermes 通过三个在不同时间尺度上运作的复利机制来解决这个问题。
### 让 Hermes 实现复利的三层架构
**第一层:运行时 skill 创建。** 当 Agent 解决了一个复杂问题时,它会写一个 skill 文件来记录这个成功的方法。下次遇到类似问题时,它会加载这个 skill,沿着已经验证的路径走,而不是重新从第一性原理推导。Agent 运行得越久,skill 库就越丰富。
**第二层:持久化多层记忆。** 三个记忆层以不同速度运作:快速的上下文层保存关键事实,可搜索的 SQLite 数据库存储完整会话历史,可选的外部 provider 提供更深入的持久化。每一层都有特定职责,而且都不会在会话关闭时被重置。
**第三层:GEPA。** 一个离线 skill 优化流水线,读取 Agent 的执行轨迹,识别哪些 skill 在失效,并通过演化搜索提出改进方案。不需要 GPU,不需要微调,每次优化运行大约 2 到 10 美元。这是大多数人跳过的一层,却是能带来最大质量跃升的一层。
第一层每次会话都活跃。第二层需要几周的积累。第三层是当你想在不触碰模型权重的前提下推高能力上限时才会用到的东西。
没有其他的开源 Agent 同时具备这三层。这是你在安装任何东西之前都值得理解的架构主张。
在动手之前,还有两个架构细节值得了解。
每个任务有 90 轮的硬上限,子 Agent 共享同一个预算。这个上限之所以存在,是因为如果 Agent 卡住后不断重试失败的 API 调用,它就会在你不知道的情况下默默耗尽 API 额度。如果你在执行任务时触碰到这个上限,正确的做法是把任务拆分成更小的单元,而不是对抗这个上限。这不是 bug,而是让自主 Agent 能够安全通宵运行的护栏。
Agent 还可以在六种不同的执行环境中运行:本地终端、Docker、SSH、Modal、Daytona 或 Singularity。代码在六种环境中完全相同,唯一变化的是一个配置值。如果你想把执行从笔记本迁移到远程服务器或云 GPU,只需修改 config.yaml 中的一行即可,其他什么都不用动。
### 在记忆之上:谁是这个 Agent?
记忆和 skill 层处理的是 Agent 知道什么以及如何做。但它们回答不了一个问题:它是谁?
没有身份层的 Agent 千篇一律:同样的分析语气,同样的保守模式,同样倾向于过度解释简单的东西。SOUL.md 改变的就是这一点。
这个文件位于 ~/.hermes/SOUL.md,它会加载到系统提示的第一位——在记忆之前、在 skill 之前、在一切之前。它定义了人格、沟通风格、硬边界,以及所有 Agent 知识所经过的过滤透镜。
它是手工编写且静态的:你写一次,它就在所有项目、所有会话中保持一致。
**SOUL.md 模板**
> *# Soul你是 [角色]。[一句核心运行原则]。[你的沟通方式:简洁还是详尽、直接还是探索、观点鲜明还是中立]。[你采取行动前总是做什么]。[你在任何情况下都不做什么]。[你面对错误时的态度:标出不确定、提出质疑、还是直接交付?]*
这个文件的精确程度,决定了 Agent 像一个通用助手还是一个有独特观点的专家之间的差距。模糊的 SOUL.md 产生模糊的 Agent,精确的 SOUL.md 产生在每次会话中性格一致的 Agent。
### 三层记忆系统
Hermes 没有单一的记忆,它有三个为不同任务设计的层。
**第一层:磁盘上的两个 markdown 文件。**
MEMORY.md(2,200 字符上限)保存 Agent 需要了解的关于你环境的一切:项目约定、工具怪癖、过去会话的教训、需要避免的做法。USER.md(1,375 字符上限)保存你的个人档案:姓名、沟通偏好、技能水平、你偏好的信息传递方式。
两者都会在会话开始时以冻结快照的形式注入到系统提示中。当记忆接近 80% 容量时,Agent 会自动合并,将相关信息压缩成更紧凑的版本,只有真正有用的信息才能存活下来。低价值的记录被剪除,高信号的信息保留。
**第二层:全文会话搜索。**
每次对话都被存储在带 FTS5 全文搜索的 SQLite 中。Agent 可以按需搜索数周前的会话。当你问它上周四在做什么时,它在搜索真实的会话数据,而不是编造一个看似合理的答案。
这是一个刻意的权衡:第一层始终在上下文中但容量很小。第二层实际上深度无限,但需要主动搜索和总结步骤。关键事实放在第一层。其他所有内容在变得相关时都可以通过搜索获取。
**第三层:外部记忆 provider。**
八个可插拔的 provider 可以将持久化延伸到内置系统之外。同时只能有一个激活。当外部 provider 激活时,Hermes 会在每轮之前预取相关记忆,在每次响应后同步对话轮次,并在会话结束时提取记忆。所有这一切都是自动发生的,无需你配置单独的检索调用。
### 自我进化 Skill:Agent 自己写操作手册
记忆处理事实,skill 处理流程。
Skill 是一个 markdown 文件,将一个经过验证的特定问题类型的方法打包封装起来。当 Agent 成功完成一件非平凡的事情时,它会创建一个 skill 文件来记录什么有效。下次出现同样的模式时,它加载这个 skill 并沿着验证过的路径走,而不是再次从第一性原理推导。
文件结构是有意保持最小化的:
**SKILL.md 格式**
> *---* *name: [skill-name]* *description: [一到两句话描述何时激活这个 skill]* *version: 1.0.0* *author: agent* *---## Procedure* *[成功方法的编号步骤]## Pitfalls* *[如果你跳过步骤或犯特定错误会出现什么问题]## Verification* *[如何确认这个方法有效]*
Skill 创建会在以下情况自动触发:Agent 完成了需要五个或更多工具调用的任务时、遇到错误并找到了通过它们的正确路径时、你纠正了它的方法时,或者发现了一个足够不明显、值得记录的流程时。
这就是我开头提到的 22 秒解决方案背后的机制。Agent 第一次遇到那个问题时,用试错的方式解决了它,然后把成功路径存成了一个 skill。第二次,它加载了这个 skill 并直接沿着路径走了下来。
**渐进式披露防止 token 成本失控。**
Agent 默认只能看到 skill 的名称和描述——完整目录大约 3000 个 token。它只在真正需要时才加载某个 skill 的完整内容,也可以在需要更深入上下文时钻取 skill 内的特定参考文件。目录保持可搜索,而不需要在每轮对话中把全部内容加载到上下文中。
### Curator:Skill 的垃圾回收器
没有维护的话,skill 会堆积起来。狭隘、重叠的操作手册会不断积累,直到目录变成噪音而非信号。Curator 会自动处理这个问题。
它不会按固定时间表运行,而是基于空闲检查触发:如果距离上次运行已过了七天且 Agent 已空闲两小时以上,一个后台 fork 的 Agent 进程会启动审查,而不会触碰你的当前会话。
Curator 分两个阶段运作。首先是不需要模型调用的自动转换:30 天未使用的 skill 变为 stale,90 天未使用的 skill 被归档。其次是对所有 Agent 编写的 skill 进行 LLM 审查,fork 的 Agent 对每个 skill 决定是保留、打补丁、合并还是归档。每次运行最多八轮审查迭代。
两个重要约束:Curator 永远不会触碰 bundled 或从 hub 安装的 skill,只处理你 Agent 自己创建的那些。而且它永远不会自动删除,最坏的结果也只是归档到 ~/.hermes/skills/.archive/,一条命令即可恢复。
在每次 Curator 运行之前,Hermes 都会将整个 skills 目录快照为 tar.gz 存档。回滚只需要一条命令,而且回滚本身也是可逆的。
如果你有不想被归档的 skill,可以固定它们:
**Setup**
> *hermes curator pin [skill-name]*
固定的 skill 仍然可以被更新和改进,pin 只是防止它们被归档或删除。
### Skill Hub:687 个你今天就能安装的 Skill
大多数新 Hermes 用户最容易错过的一点,是他们不必等 Agent 从经验中自己建立 skill。
Hermes 维护着一个官方的 Skill Hub,包含 687 个跨 18 个类别的预建 skill。87 个在安装时打包,79 个可选 skill 按需获取,16 个直接来自 Anthropic(包括 frontend-design、pdf、pptx、docx 和 mcp-builder),505 个来自 LobeHub——更广泛的社区贡献层。
在第一天,在 Agent 为你解决任何问题之前,你就可以安装生产级的 skill 库,这些库封装了原本需要数周使用才能培养出来的流程。
**Setup**
> *hermes skills list — 浏览完整目录* *hermes skills install [skill-name] — 安装某个特定 skill* *hermes skills tap add yourname/your-skills-repo — 将任何 GitHub 仓库添加为自定义源* *hermes skills install yourname/your-skills-repo/[skill-name] — 从你的自定义 tap 安装*
tap 系统让你可以在团队中共享 skill,或者维护一个不在公共 hub 中的私人收藏。写一次 skill,就能用一个命令安装到所有 Agent profile 上。
### GEPA:大多数人跳过的一层
GEPA 全称 Genetic-Pareto Prompt Evolution。它不是 Hermes 运行时的一部分,而是存在于一个配套仓库中,作为一个离线优化流水线运作。已作为 ICLR 2026 Oral 论文发表,采用 MIT 许可。
它解决的问题是:运行时学习循环有一个已知弱点——Agent 是自己表现的有偏评估者,它倾向于自我庆功,即使在输出不理想时也会评为成功。社区的实际使用已经证实了这一点。同样的系统能创建 skill,也可能用更差的版本覆盖你精心调整的自定义设置。
GEPA 绕过这个自我评估问题的方式是读取执行轨迹,而不是问 Agent 它认为自己表现如何。它识别哪些方法实际失败了,通过演化搜索生成候选改进方案,并使用带有评分标准的 LLM-as-judge 进行评分,而非简单的通过/失败二分。
流程如下:
1. 从 Hermes 仓库读取当前 skill
2. 从合成测试用例、SQLite 中的真实会话历史或人工策划的黄金示例生成评估数据集
3. 运行优化器:读取执行轨迹,识别失败点,生成候选 skill 变体
4. 按评分标准对候选方案评分
5. 应用约束门控:完整测试套件必须 100% 通过,skill 文件必须保持在 15KB 以下,语义目的不得漂移
6. 最佳变体作为针对 Hermes 仓库的 pull request 发出——永远不会直接 commit。
成本:每次优化运行 2 到 10 美元,不需要 GPU,所有东西都是通过 API 调用完成的。
这是你在微调之前应该去的地方。大多数团队在使用 agent skill 达到性能上限时,第一反应就是 RL 或 GRPO。GEPA 应该是首先考虑的步骤。它通过 prompt 空间搜索而非权重空间搜索来提高 skill 质量。对于那些瓶颈在于 skill 设计而非模型能力的场景,它能以一小部分成本带来显著收益。
### 三 Agent 配置
一个 Agent 有用。三个拥有独立记忆和 SOUL.md 文件的专业化 Agent,才是让架构真正有趣的地方。
Hermes 将它们称为 profile。每个 profile 是一个完全隔离的实例,拥有独立的配置、记忆、skill、会话和身份。默认情况下它们不共享任何东西。
**创建三个 profile:**
**Setup**
> *hermes profile create programmer --clone* *hermes profile create researcher --clone* *hermes profile create designer --clone*
`--clone` 标志会将你默认 profile 的配置和环境复制为起点。
**给每个 profile 独立的 Telegram bot。** Telegram 每个 token 只允许一个连接,在 BotFather 运行 /newbot 三次,保存三个 token,然后每个 profile 运行一次 gateway 设置:
**Setup**
> *hermes -p programmer gateway setup* *hermes -p researcher gateway setup* *hermes -p designer gateway setup*
**程序员 Agent**
这个 Agent 最有价值的地方在于它将代码执行委托给 Claude Code,而不是直接在 Hermes 终端中写代码。Hermes 负责编排:理解问题、规划方法、调用 Claude Code 执行文件编辑和命令、读取结果、决定下一步。Claude Code 在你的真实代码库中完成实际工作。
如果你有 Claude Max 订阅,这不需要额外费用——Claude Code 会自动使用 Max 凭证。
**程序员的 SOUL.md**
> *# Soul你是我的 staff engineer,简洁、直接、务实。你在写新代码之前会先读现有代码。你写最小幅度的改动来解决问题。你喜欢标准库而非依赖,乏味的技术而非花哨的技术,显式而非巧妙。声明完成前:检查解决方案是否已经存在于代码库中。检查是否有测试。检查如果失败会破坏什么。运行测试。*
在会话中用一条 prompt 激活 Claude Code 委托:
**Prompt**
> *我有 Claude Max 订阅。你是我的日常编码任务的 staff engineer。底层对所有执行都使用 Claude Code:文件读取、写入、测试、git、命令。相应地配置好自己,准备好时确认。*
程序员 Agent 会自动安装 claude-code 委托 skill,验证 claude 在 PATH 上,并从下一条消息开始通过它路由所有代码执行。
**研究员 Agent**
这个 Agent 按计划运行每日摘要,不需要手动触发,每天早上都会将结构化的简报投送到 Telegram。
**研究员的 SOUL.md**
> *# Soul你是我的 AI、机器学习和加密货币市场的深度研究员。你的主要工作是每日 Telegram 简报,总结自昨天以来的变化。覆盖四个流:GitHub 热门仓库、实验室和大厂公告、值得关注的新研究论文、以及 X 和 Hacker News 上的社交信号。以新的东西领先,而非众所周知的常识。每条声明都要引用 URL。信号稀薄时标记出来。激进地跨流使用 delegate_task。永远不要将有争议的声明说成已定论。永远不要编造引用。*
在研究员会话中设置每日 cron 任务:
**Cron Instruction**
> *每个工作日早七点,准备一份过去 24 小时 AI 和加密货币领域新动态的深度简报。按顺序覆盖:1. 有意义 AI 或加密应用的热门 GitHub 仓库 2. Anthropic、OpenAI、Google、Meta、Nous 等实验室和大厂的公告 3. 过去 24 小时发布或新讨论的研究论文 4. X 和 Hacker News 上的社交信号:构建者们在回应什么。以变化领先。每条声明都引用来源。控制在 600 词以内。投送到 Telegram。将此设置为从明天开始的循环 cron 任务。*
**将 cron 任务链接为用于多阶段流水线的链**
cron 任务可以使用 context_from 标志相互喂送数据。一个任务的输出变成下一个任务的输入,这让 cron 从调度工具变成了自动化流水线。
实际例子:一个研究收集任务早上 6 点运行,在四个数据流上收集原材料;一个综合任务 6:30 运行,将原始收集作为输入,产出精炼的摘要。收集任务做广度,综合任务做深度,两者都不需要同时做两种工作。
**Setup**
> *In the researcher profile, after setting up the collection cron:* */cron add "6:30am weekdays" "Synthesise the research collection from the 6am run into a 600-word digest. Deliver to Telegram." --context_from [collection_job_id]*
综合任务接收收集任务产出的所有内容。这个流水线每个工作日的早上从收集到交付全自动运行,不需要任何手动步骤。
**设计师 Agent**
当设计师 Agent 能够用你特定的风格而非通用 AI 输出生成视觉内容时,它才真正有用。机制是:喂给它参考设计、让它学习,然后让它写一个编码风格模式的 skill 文件。Agent 会构建自己的风格指纹,并将其嵌入到每次未来的生成中。
**设计师的 SOUL.md**
> *# Soul你是我的视觉设计师。你创建的图表和插图能清晰地解释技术概念。想想清晰的线条和有标注的结构,而非打磨过的营销图形。每个视觉都应该让人一眼就能理解一个复杂的概念。你以概念领先,选择服务于它的视觉隐喻,然后确定下来。当视觉可能弊大于利时,直接说出来。*
要教给它你的视觉风格,粘贴参考图片并发送这个 prompt:
**Prompt**
> *仔细研究这些参考插图。注意调色板、线条粗细、细节程度、构图结构和重复出现的视觉主题。创建一个名为 "my-design-style" 的 skill,要求:1. 用纯文本记录风格指纹 2. 包含一个 Python 脚本,接收文本描述,并通过 OpenRouter 使用 Gemini 图像生成 API 以完全相同的风格生成新图片 3. 从环境变量读取 OPENROUTER_API_KEY 使用 skill_manage 创建它。在确认完成前,先用示例 prompt 测试脚本。*
设计师会写好 skill,生成 Python 脚本,保存到设计师 profile 的 skills 目录并验证能运行。从那时起,每次图像生成请求都会自动加载这个风格 skill。
### 改变日常操作的 Slash 命令
大多数文档讲的是 Hermes 能做什么,很少有资源讲一旦运行起来后如何有效操作它。三个 slash 命令在实际操作中带来最大的差异。
**/background** 在隔离的后台会话中运行任务,不打断你当前的对话。你正在和程序员 Agent 对话,同时想让研究员 Agent 去拉一篇论文,直接发送后台命令给 researcher profile,当前会话继续不中断,结果准备好后再返回。多个线程同时运行而不会互相干扰。
**Setup**
> */background [任务描述] — 在隔离中运行任务,永远不打断活跃对话*
**/goal** 为会话设置一个持久的北极星。Agent 给出的每个回复都会对照它来评估,每个工具调用在执行前都会检查它。没有 /goal 的长期会话会漂移,有了它,Agent 每次回复后都会回到既定目标,并在某事将它拉偏时标记出来。
**Setup**
> */goal [这次会话你想完成什么] — Agent 衡量每个行动是否与此对齐*
**/steer** 在任务中途重定向 Agent,不停止它当前的执行。如果程序员 Agent 正在进行重构,你想添加一个约束但不想打断流程,/steer 会注入新方向而不需要重启 Agent,Agent 在下一个循环中整合它。
**Setup**
> */steer [新方向或约束] — 重定向而不中断当前执行*
### 完整文件系统
安装后,一切都位于 ~/.hermes/。值得了解这个布局,因为每次交互都会触及其中一条路径。
**Setup**
> *~/.hermes/* *├── config.yaml — 模型、工具、MCP servers,所有非密钥配置* *├── .env — API 密钥和密钥* *├── SOUL.md — 身份层,系统提示第一位* *├── memories/* *│ ├── MEMORY.md — 持久化 Agent 事实(2,200 字符上限)* *│ └── USER.md — 你的个人档案(1,375 字符上限)* *├── skills/ — 所有 skills:bundled、hub 安装、Agent 创建的* *├── sessions/ — 逐平台的会话元数据* *├── state.db — 带 FTS5 的 SQLite,完整会话历史* *├── cron/* *│ ├── jobs.json — 计划任务* *│ └── output/ — cron 运行输出* *└── logs/ — agent.log、gateway.log、errors.log*
最重要的三个文件:SOUL.md,因为它支配着 Agent 的所有输出,无论它知道什么。state.db,因为它是让过去会话搜索真正工作的东西。skills/,因为整个复利机制就住在这里。
### 如何安装
Linux、macOS 或 WSL2。Python 3.11 或更高。8GB 内存对基于 API 的使用就足够了。
**Setup**
> *curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash* *source ~/.bashrc*
运行设置向导,它会引导你完成 provider、API 密钥、模型和工具的配置:
**Setup**
> *hermes setup*
在终端中启动:
**Setup**
> *hermes*
连接 Telegram:在 @BotFather 用 /newbot 获取 bot token,在 @userinfobot 获取你的用户 ID,然后将两者添加到 config.yaml 中。Agent 立即可以从手机访问。
**模型切换与成本管理**
Hermes 通过一个统一转换层路由任何模型 provider。从 Claude 切换到 GPT 到 Gemini 到本地 Ollama 模型,只需要一条命令,其他什么都不变。
**Setup**
> *hermes model — 列出所有可用模型和当前活跃模型* *hermes -p researcher model set gemini-flash — 将 researcher profile 切换到 Gemini Flash* *hermes -p programmer model set claude-opus-4-7 — 让 programmer 保持在 Opus 上*
对于三个 24/7 运行的 Agent,这对成本很重要。在 Gemini Flash 上运行每日摘要的研究员只花使用 Opus 的一小部分。处理复杂多文件重构的程序员值得 Opus 的成本。进行图像生成调用的设计师通过 OpenRouter 路由多模态模型。将每个 Agent 路由到能以最低成本产生可接受输出的模型。由于转换层的存在,切换模型时不需要重写任何 prompt。
### 什么在复利、何时复利
第一周,skill 库还很薄。Agent 创建了第一批文件,但还没有足够的历史让模式显得重要。
到第三周,情况变了。第一周创建的 skill 已经在指导第三周的会话。研究员的摘要在利用三周保存的会话上下文。程序员在命中缓存的解决方案,而不是重新发现方法。
到第二个月,这个 Agent 和一个全新的 Claude 会话之间的能力差距变得可见且可测量。不是因为模型变了,而是因为记忆是真实的、skill 是挣来的、curator 已经剪除了没能经住考验的操作手册。
这才是一个 AI Agent 中复利的真实样子。不是发布时就有的能力,而是在最初六十天里悄悄建立、然后不会停止建设的系统。
大多数人关闭他们的 Agent 会话,然后失去他们刚刚构建的一切。这个架构的设计初衷是让每个会话都为下一个会话添砖加瓦。
值得运行的 Agent,是那些随着你的成长而变得更聪明的家伙。
关注 @damidefi 以获得每日 Claude AI 工具、加密货币分析和通往 10 万粉丝的完整旅程。收藏这篇文章,分享给一个还在运行那种会话一结束就忘光一切的 AI Agent 的人。