Hermes Agent 内部机制研究
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工具可以使用六种技能操作create、patch、edit、delete、write_file和remove_file。Agent 默认对大多数更新使用patch通过只传入旧字符串和替换字符串来进行有针对性的更改这意味着只有更改的文本会出现在工具调用中而不是完整的技能内容。优先使用patch而不是edit既是正确性也是效率的决策因为完全重写可能会破坏已经正常工作的内容而补丁只修正更改的部分执行起来也更节省 Token。1.4 基于 FTS5 的会话搜索与 LLM 摘要每个会话都会被写入 SQLite 存档并使用FTS5进行索引因此 Agent 可以搜索过去的上下文而不是将整个旧会话加载到窗口中。检索到的结果在注入之前会经过 LLM 摘要处理因此只有与当前任务相关的内容才会被引入。这一层处理情景记忆即发生了什么以及何时发生它与处理程序性记忆的技能层如何做某事是刻意分开的。两者协同工作但回答不同的问题将它们保存在不同的存储中而不是混合在一起是一个贯穿完整内存系统结构的设计决策下一节将介绍这一点。2、多级内存系统将所有内容混合到一个内存存储中是大多数 Agent 内存系统随时间变得不可靠的原因因此 Hermes 将其分为四个不同的层每层都有特定的职责、特定的磁盘位置以及特定的读取时机。2.1 提示内存MEMORY.md和USER.md这是始终开启的层在每个会话开始时加载的上下文Agent 无需请求。两个文件都位于~/.hermes/memories/在第一条消息处理之前直接注入到系统提示中。两个文件的总字符数限制为 3,575这个限制故意设置得很紧以强制精选而非积累。Agent 通过内存工具管理它们有三种操作添加、替换或删除。一个重要细节在会话期间对MEMORY.md或USER.md的编辑只在下一个会话生效而不是在对话中间。2.2 会话搜索 SQLite FTS5这里需要理解的区别是 Agent 何时使用会话搜索还是提示内存。提示内存是始终开启的意味着它无需 Agent 决定加载就会自动加载。会话搜索是一个刻意的检索步骤当 Agent 确定过去的上下文与当前任务相关时它会针对 SQLite 存档运行查询。实际的边界是持久性。如果某事重要到需要在每次未来对话中都出现它应该放在MEMORY.md或USER.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工作在服务器上时选择 SSHHPC 集群选择 Singularity希望无服务器执行且在空闲期间成本几乎为零时选择 Modal 或 Daytona。5.2 容器加固与零遥测使用 Docker 运行时Hermes 默认应用只读根文件系统、丢弃 Linux 功能和命名空间隔离。这些是架构默认值不是可选设置因此 Agent 无法在其指定目录之外写入或提升权限。零遥测的工作方式相同。默认情况下没有任何内容离开你的机器不是作为隐私开关而是作为 Agent 操作方式的内在属性。6、技能与工具工具和技能都是 Hermes 扩展其能力的方式但它们在两个不同的层次上运行在深入了解之前有必要先弄清楚它们之间的区别。**工具。**是 Agent 可以调用的东西单独的能力如运行终端命令、搜索网页或生成图像。**技能。**是 Agent 知道如何使用这些工具做什么可复用的流程将工具调用链式组合成 Agent 已经弄清楚并记录下来的工作流。6.1 内置工具40 多个内置工具涵盖五个广泛类别执行工具处理终端命令和代码运行。网页工具涵盖搜索和浏览器自动化。媒体工具包括视觉、图像生成和文本转语音。协调工具处理子 Agent 委托和多模型推理让 Agent 可以启动隔离的子 Agent 进行并行工作流或将特定任务路由到更适合的模型。最后一类涵盖内存和规划工具这是 Agent 在会话期间以编程方式与其自己的内存层交互的方式。在模型方面Hermes 通过 Nous Portal 作为单一提供商端点连接到 400 多个模型Hugging Face 作为一级提供商得到支持具有完整的 HF 推理 API 集成、内置模型选择器和设置向导。它还支持 MCP 能力对于想要更进一步的开发者Hermes 暴露了四个插件钩子pre_llm_call、post_llm_call、on_session_start和on_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、为什么选择 NebiusNebius 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 和模型 IDexport NEBIUS_API_KEYyour_key_here hermes model # 选择自定义 OpenAI 兼容端点 # 基础 URLhttps://api.tokenfactory.nebius.com/v1/ # 模型NousResearch/Hermes-4-405BHermes-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 都是实现这一目标的直接路径无需自己管理基础设施。哪一个有意义完全取决于你实际想构建什么。原文链接Hermes Agent 内部机制研究 - 汇智网