Hermes Agent 内部机制研究

本文将深入解析Hermes Agent的学习循环、四层内存系统、网关、Agent 循环内部机制、终端后端、技能、工具、定时自动化、会话持久化,以及如何使用 Nebius Token Factory 大规模运行 Hermes Agent。

Hermes Agent 内部机制研究
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI工具导航 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

Hermes Agent 是由 Nous Research 开发的开源 AI Agent。与围绕多 Agent 编排构建的 OpenClaw 不同,Hermes 是一个单一 Agent,它运行的时间越长,能力就越强,不是通过配置更新,而是通过实际使用来进化。

大多数 Agent 只能回忆发生了什么,但 Hermes 更进一步:它会提取有效的方法,将其写成可复用的技能,并在下次遇到类似问题时加载使用。学习循环是自动运行的,而且由于内存架构具有缓存感知能力,它不会因为 Agent 学习更多内容而不断增加你的 Token 费用。

本文将深入解析学习循环、四层内存系统、网关、Agent 循环内部机制、终端后端、技能、工具、定时自动化、会话持久化,以及如何使用 Nebius Token Factory 大规模运行 Hermes Agent。

1、学习循环

像 OpenClaw 这样的 Agent 会在会话之间保持上下文,并通过中央枢纽进行路由,这对于简单用例很有效,但在存储发生了什么和存储什么方法有效之间存在一个差距。Hermes 正是围绕这个差距设计的,已完成的工作流会被转化为可复用的流程,Agent 下次可以直接遵循,无需重复相同的步骤。

这就是学习循环的作用:一个在每个会话下运行的闭环反馈系统,内存、技能和会话搜索都是同一个持续过程的输出。

这个循环有四个动态部分,每个部分在周期的不同时间点触发。让我们看看它们是如何连接的。

1.1 由 Agent 管理的内存与定期提醒

大多数 Agent 要么记录所有内容但无法检索有用的信息,要么什么都不记录,每次会话都从头开始。Hermes 通过让 Agent 自己决定什么值得保留来避免这两种情况,它通过一个称为"定期提醒"的机制来实现。

在会话期间的设定间隔,Agent 会收到一个内部系统级提示,要求它回顾发生的事情并评估是否有任何内容值得持久化到内存中。这会在没有用户输入的情况下触发,Agent 会扫描最近的活动,如果有任何内容跨越了在未来会话中有用的阈值,就会将其写入内存文件。

结果是内存保持精选状态,而不是变成每次交互的转储。

1.2 自主技能创建

当 Agent 完成任务时,它会检查所采取的路径是否值得记录。触发条件是具体的:五次或更多工具调用、从错误中恢复、用户纠正,或者奏效的非明显工作流。

如果检查通过,它会在 ~/.hermes/skills/ 中创建一个技能文件,不是日志条目,而是一个可复用的指令集,Agent 可以在未来的会话中遵循,无需重复原始步骤。

---
name: my-skill
description: Brief description of what this skill does
version: 1.0.0
platforms: [macos, linux] # Optional — restrict to specific OS platforms
metadata:
  hermes:
    tags: [python, automation]
    category: devops
    fallback_for_toolsets: [web] # Optional — conditional activation (see below)
    requires_toolsets: [terminal] # Optional — conditional activation (see below)
---

每个技能文件包含名称、简短描述、涉及的步骤,以及作为工作流一部分的任何工具调用或文件引用,其结构遵循 agentskills.io 开放标准,这使得技能可以在兼容的 Agent 之间移植。

1.3 技能自我改进

技能一旦写入就不会被冻结,Agent 会继续使用它们,在执行过程中找到更好的路径时进行更新。

通过 skill_manage 工具可以使用六种技能操作:

createpatcheditdeletewrite_fileremove_file

Agent 默认对大多数更新使用 patch,通过只传入旧字符串和替换字符串来进行有针对性的更改,这意味着只有更改的文本会出现在工具调用中,而不是完整的技能内容。

优先使用 patch 而不是 edit 既是正确性也是效率的决策,因为完全重写可能会破坏已经正常工作的内容,而补丁只修正更改的部分,执行起来也更节省 Token。

1.4 基于 FTS5 的会话搜索与 LLM 摘要

每个会话都会被写入 SQLite 存档,并使用 FTS5 进行索引,因此 Agent 可以搜索过去的上下文,而不是将整个旧会话加载到窗口中。检索到的结果在注入之前会经过 LLM 摘要处理,因此只有与当前任务相关的内容才会被引入。

这一层处理情景记忆,即发生了什么以及何时发生,它与处理程序性记忆的技能层(如何做某事)是刻意分开的。两者协同工作但回答不同的问题,将它们保存在不同的存储中而不是混合在一起,是一个贯穿完整内存系统结构的设计决策,下一节将介绍这一点。

2、多级内存系统

将所有内容混合到一个内存存储中是大多数 Agent 内存系统随时间变得不可靠的原因,因此 Hermes 将其分为四个不同的层,每层都有特定的职责、特定的磁盘位置,以及特定的读取时机。

2.1 提示内存 MEMORY.mdUSER.md

这是始终开启的层,在每个会话开始时加载的上下文,Agent 无需请求。两个文件都位于 ~/.hermes/memories/,在第一条消息处理之前直接注入到系统提示中。

两个文件的总字符数限制为 3,575,这个限制故意设置得很紧,以强制精选而非积累。Agent 通过内存工具管理它们,有三种操作:添加、替换或删除。

一个重要细节:在会话期间对 MEMORY.mdUSER.md 的编辑只在下一个会话生效,而不是在对话中间。

2.2 会话搜索 SQLite + FTS5

这里需要理解的区别是 Agent 何时使用会话搜索还是提示内存。

  • 提示内存是始终开启的,意味着它无需 Agent 决定加载就会自动加载。
  • 会话搜索是一个刻意的检索步骤;当 Agent 确定过去的上下文与当前任务相关时,它会针对 SQLite 存档运行查询。

实际的边界是持久性。如果某事重要到需要在每次未来对话中都出现,它应该放在 MEMORY.mdUSER.md 中。如果它只在特定主题再次出现时才有用,它会保留在会话存档中,可以按需检索。Agent 在定期提醒期间做出这个判断,决定一条信息属于哪个层,而不是默认将所有内容放在一个地方。

2.3 技能程序性记忆

我们在第1节看到了技能的创建方面,所以这里的重点是如何存储它们以及 Agent 如何在不超出 Token 预算的情况下加载它们。

所有技能都作为单独的 Markdown 文件保留在 ~/.hermes/skills/ 中。全新安装时,仓库中的捆绑技能会被复制到这个目录,Agent 创建的任何技能或从技能中心安装的技能都会添加在其中。加载策略遵循渐进式披露模式:默认情况下,系统提示只包含技能名称和简短摘要,只有当 Agent 确定它与当前任务相关时,才会加载技能的完整内容。

这使得无论存在多少技能,Token 使用量都保持平稳。拥有 200 个技能的 Agent 与拥有 40 个技能的 Agent 的上下文成本大致相同,因为详细内容只在实际需要时才会进入上下文。

2.4 Honcho 层用户建模

到目前为止的三个层都需要 Agent 主动写下某些内容。第四层的工作方式不同,它不是等待显式写入,而是在会话之间被动地构建你的画像,跟踪偏好、沟通风格和领域知识随时间的变化。这就是 Honcho,一个位于其他层之上的可选用户建模层。

它使用辩证建模方法,在 12 个身份层中同时建模你和 Agent 之间的关系。

图片来源

它是可选的,对于大多数特定任务或自动化设置,其他三层已经足够。当你将 Hermes 用作日常个人助手,并希望响应感觉与你实际工作方式相匹配时,它的价值就体现出来了。

接下来介绍的网关使得所有四层可以在不同平台之间访问,而不会在切换时丢失上下文。

3、网关

学习循环和内存系统只有在 Agent 在需要时可访问时才有用,这就是网关的作用。它是一个持久的后台服务,让 Hermes 在你配对的每个平台上保持运行和连接,因此 Agent 不是你需要时才启动的东西,而是始终在线并等待的东西。

3.1 平台适配器与会话路由

Hermes 可以连接到 CLI、Telegram、Discord、Slack、WhatsApp、Signal 和 Email,每个平台都有自己的适配器,但都汇入共享的会话路由层。在 Telegram 上开始的对话可以在终端中继续,因为会话绑定的是 ID,而不是平台。

Telegram 更进一步,推出了项目对话功能,其中私密聊天主题让你可以在单个聊天中运行隔离的工作流,每个主题都有自己的技能绑定和会话上下文。

gateway/ 目录处理五件事:消息传递、会话路由、交付、配对和定时触发。

  • 配对是将新平台与你的 Agent 实例关联的方式,
  • 定时触发是在正确时间触发定时自动化并将其路由回正确平台的方式。

整个系统作为系统服务运行,使用 hermes gateway 启动,这意味着即使关闭终端后它也会在后台继续运行。

3.2 与其他 Agent 架构相比的优势

在 OpenClaw 中,网关只处理交付,这就是它的职责终点。技能创建、内存写入和定时自动化输出都通过不连接到网关本身的单独机制进行。

在 Hermes 中,网关是同一个循环的一部分。传入的消息可以触发技能创建,定时自动化通过相同的网关层写回输出,跨平台连续性之所以有效,是因为会话路由是接入系统的,而不是单独附加的。

网关处理外部通信,内存系统处理上下文持久化,接下来需要理解的是单个回合内部发生了什么,从消息到达的那一刻到响应发出的那一刻。

4、Agent 循环

到达 Hermes 的每条消息,无论是来自 CLI、Telegram 还是任何其他连接的平台,都会经过相同的同步编排引擎,该引擎在 run_agent.py 中实现。这是内存、技能、工具和网关都在定义的序列中会合并执行的地方。

4.1 回合生命周期

当消息到达时,Agent 会生成一个任务 ID,并加载缓存的系统提示或从内存层、技能索引和任何相关上下文文件构建一个新的提示。在 API 调用发出之前,会运行预检压缩检查,确认对话历史没有接近上下文限制。

如果模型返回工具调用,Agent 会执行它们,追加结果,然后循环返回进行另一个 API 调用。一旦模型返回最终文本,会话就会持久化到 SQLite,响应通过网关发出。

4.2 压缩作为整合

当预检检查标记出长对话时,会在达到任何硬上下文限制之前触发一个哨兵。辅助模型扫描完整对话,将值得保留的内容提取到内存中(在 3,575 字符限制内),并摘要中间回合而不是丢弃它们。

Lineage,将摘要回合连接回原始对话的引用链,会保留在 SQLite 中,因此 Agent 即使在压缩事件后也可以追溯早期上下文。

4.3 提示缓存

Hermes 从稳定的来源构建其系统提示,因此前缀在每个回合之间保持一致,大多数 API 提供商会缓存它,减少后续回合的延迟和成本。有三件事会破坏该缓存:在会话中途切换模型、更改内存文件或更改上下文文件。其中任何一个都会强制完全重新处理,这就是为什么你在生产中使用的提供商很重要。

如果该提供商在会话中途宕机,Agent 循环不会停滞。你可以在 config.yaml 中配置一个有序的推理提供商列表,Hermes 会自动切换到下一个,而不会中断回合生命周期。会话继续,上下文保持完整,故障永远不会暴露给用户。

5、终端后端

网关处理通信,但终端后端决定了实际工作在哪里进行。Hermes 为你提供六种选项,因此 Agent 在实际需要工作的地方运行。

5.1 六种后端

后端涵盖完整的部署场景:

  • Local 直接在你的机器上运行,
  • Docker 添加容器层进行隔离,无需离开你的环境,
  • SSH 让 Agent 完全在远程服务器上执行,当工作涉及那里的文件、数据库或服务时很有用。
  • Daytona 和 Modal 都是无服务器的,意味着执行环境在空闲时休眠,需要时重新启动,如果你持续运行 Hermes 但使用不均匀,这对成本影响很大。
  • Singularity 适用于 Docker 不可用或不允许的 HPC 和研究环境。

它们之间的实际选择取决于你在做什么:个人使用时选择 Local,隔离不是问题时;当你希望 Agent 与主机系统隔离时选择 Docker;工作在服务器上时选择 SSH;HPC 集群选择 Singularity;希望无服务器执行且在空闲期间成本几乎为零时选择 Modal 或 Daytona。

5.2 容器加固与零遥测

使用 Docker 运行时,Hermes 默认应用只读根文件系统、丢弃 Linux 功能和命名空间隔离。这些是架构默认值,不是可选设置,因此 Agent 无法在其指定目录之外写入或提升权限。

零遥测的工作方式相同。默认情况下没有任何内容离开你的机器,不是作为隐私开关,而是作为 Agent 操作方式的内在属性。

6、技能与工具

工具和技能都是 Hermes 扩展其能力的方式,但它们在两个不同的层次上运行,在深入了解之前,有必要先弄清楚它们之间的区别。

  1. 工具。是 Agent 可以调用的东西,单独的能力,如运行终端命令、搜索网页或生成图像。
  2. 技能。是 Agent 知道如何使用这些工具做什么,可复用的流程,将工具调用链式组合成 Agent 已经弄清楚并记录下来的工作流。

6.1 内置工具

40 多个内置工具涵盖五个广泛类别:

  1. 执行工具 处理终端命令和代码运行。
  2. 网页工具 涵盖搜索和浏览器自动化。
  3. 媒体工具 包括视觉、图像生成和文本转语音。
  4. 协调工具 处理子 Agent 委托和多模型推理,让 Agent 可以启动隔离的子 Agent 进行并行工作流,或将特定任务路由到更适合的模型。
  5. 最后一类涵盖内存和规划工具,这是 Agent 在会话期间以编程方式与其自己的内存层交互的方式。

在模型方面,Hermes 通过 Nous Portal 作为单一提供商端点连接到 400 多个模型,Hugging Face 作为一级提供商得到支持,具有完整的 HF 推理 API 集成、内置模型选择器和设置向导。

它还支持 MCP 能力,对于想要更进一步的开发者,Hermes 暴露了四个插件钩子:pre_llm_callpost_llm_callon_session_starton_session_end。这些让你可以在 Hermes 之上构建,在 Agent 循环的特定点添加自定义逻辑,而无需分叉代码库或接触任何内部内容。

6.2 技能系统

Hermes 附带 40 多个捆绑技能,涵盖 MLOps、GitHub 工作流、研究和生产力任务等领域。这些会在全新安装时复制到 ~/.hermes/skills/,以及 Agent 自主创建的任何技能或你从技能中心安装的技能。

~/.hermes/skills/ # 单一事实来源
├── mlops/ # 类别目录
│   ├── axolotl/
│   │   ├── SKILL.md # 主要说明(必需)
│   │   ├── references/ # 附加文档
│   │   ├── templates/ # 输出格式
│   │   ├── scripts/ # 可从技能调用的辅助脚本
│   │   └── assets/ # 补充文件
│   └── vllm/
│       └── SKILL.md
├── devops/
│   └── deploy-k8s/ # Agent 创建的技能
│       ├── SKILL.md
│       └── references/
├── .hub/ # 技能中心状态
│   ├── lock.json
│   ├── quarantine/
│   └── audit.log
└── .bundled_manifest # 跟踪已播种的捆绑技能

存储格式遵循 agentskills.io 开放标准,因此技能可以在兼容的 Agent 之间移植,无需任何转换步骤即可共享。默认只加载名称和摘要,完整内容按需加载。

7、定时自动化

Hermes 将重复任务作为一等 Agent 任务处理,不是恰好调用 AI 的 shell 脚本或 cron 作业。当你安排消息时,Hermes 会解析指令,将作业存储在 cron/ 目录中,网关的定时触发处理其余部分。

当预定时间到达时,Agent 循环会运行任务,具有对内存和技能的完全访问权限,然后通过网关将输出发送到你指定的任何地方。这与任何交互式会话的管道相同,只是由时钟触发而不是消息触发。

8、会话持久化

到目前为止涵盖的所有内容,学习循环、内存层、网关路由、Agent 循环和定时自动化,都依赖于状态在单个会话之外存活。这种持久性来自由 hermes_state.py 管理的 SQLite 数据库,一个可移植的基于文件的存储,没有外部服务器依赖。

每个回合后,Agent 会将对话、工具调用和结果写入数据库,通过 FTS5 索引以便按需检索。

原始转录本转到 JSONL 文件,cron 定义单独存放在磁盘上,WAL 模式允许在单写入者的情况下进行并发读取,这在多个会话并行运行时保持可靠性。

这就是端到端的架构。以上所有内容在本地运行都很好,但如果你想运行 Hermes-4-405B 而不需要自己管理基础设施,那就是 Nebius Token Factory 的用武之地。

让我们看看它是如何工作的。

9、为什么选择 Nebius?

Nebius Token Factory 是一个专门为模型推理构建的推理平台,具有强大的开源模型,如 Qwen 3.5、Nemotron Super 和 GLM-5,可作为托管端点使用。

对于 Hermes Agent,你可以运行来自 Nous Research 的相同模型 Hermes-4-405B,或从 Nebius 选择其他模型,无需自己管理 GPU 配置、负载均衡或冷启动。

它不仅仅是一个托管端点,推理层周围的功能才是其价值所在。Nebius 会记录你的聊天完成,你可以直接将这些数据导入 Data Lab,从你实际的 Hermes 会话中构建微调数据集。从那里,你可以在 Token Factory 上进行微调,并将检查点部署为你自己的自定义端点。如果你的 Hermes 设置处理特定领域,支持、研究或编码,你最终会得到一个根据你实际使用方式微调的模型,而不是通用的基础模型。

它还内置了可观测性。你可以监控会话中的请求量、延迟和 Token 使用量,当 Hermes 运行定时自动化或为多个用户服务多个任务时,这很重要,你需要知道什么时候变慢或出问题了。

9.1 配置 Hermes 使用 Hermes-4-405B

配置只需要几行代码。设置你的 API 密钥,然后运行 hermes model 打开模型配置,选择自定义 OpenAI 兼容端点,并设置基础 URL 和模型 ID:

export NEBIUS_API_KEY=your_key_here
hermes model
# 选择:自定义 OpenAI 兼容端点
# 基础 URL:<https://api.tokenfactory.nebius.com/v1/>
# 模型:NousResearch/Hermes-4-405B

Hermes-4-405B 具有 128K 上下文窗口,足以进行长会话而不会过早触发压缩,因为预检检查在哨兵触发前有更大的工作空间。

9.2 何时选择 Nebius(何时不选)

自己运行 405B 模型意味着管理 GPU 配置、推理工作负载之间的负载均衡,以及空闲会话的冷启动行为。Nebius 上的托管端点从你的端移除了所有这些。

也就是说,托管端点并不总是正确的选择。如果你将 Hermes 作为个人助手在本地运行,指向一个较小的本地模型效果很好,成本也更低。

Nebius Token Factory 适合 Hermes Agent 设置的多个点。如果你仍在评估任何模型是否适合你的工作流,Nebius playground 让你在承诺之前测试和比较模型。一旦准备就绪,它也涵盖生产方面:并发会话、定时自动化的保证正常运行时间,以及无需自己配置 GPU 的托管基础设施。

10、结束语

以上就是完整的架构。对于从单条消息开始的东西来说,有很多活动部件,但每个部件都有其存在的理由:Agent 应该专门在你的工作上变得更好,而不仅仅是总体上更擅长工作。优先使用 patch 而不是 edit、四层内存、提示缓存策略,这些决策中的每一个都是为了让它随着时间的推移保持准确和低成本运行,而不仅仅是开箱即用。

这不是一个为快速任务而启动的轻量级设置。它是你运行和维护的基础设施,如果你的用例狭窄且短暂,这种开销会感觉像是过度设计。

但如果你正在构建想要每天使用的东西,跨平台,处理重复和演变的任务,Hermes 是值得的。OpenClaw 为你提供跨多个 Agent 的模块化和编排,而 Hermes 为你提供一个随时间获得上下文的单一 Agent,无论你仍在测试它还是将其作为服务运行给多个用户,Nebius Token Factory 都是实现这一目标的直接路径,无需自己管理基础设施。哪一个有意义完全取决于你实际想构建什么。


原文链接:Inside Hermes Agent: How a Self-Improving AI Agent Actually Works

汇智网翻译整理,转载请标明出处