超越 OpenClaw 的 Agent 新王:Hermes Agent 自进化闭环架构深度解析
从"经验炼金术"到"技能工厂": Nous Research 如何用四层记忆 + 闭环学习重新定义 AI Agent
一、背景:从"养虾"到"养马",AI Agent 的范式转移
2026 年 2 月,AI 编程圈还在热衷于讨论 OpenClaw(社区昵称"龙虾")如何以 24.8 万 GitHub Star 登顶开源榜首;仅仅三周后,一个名为 Hermes Agent 的开源项目异军突起,以每日新增过万 Star 的速度横扫 GitHub Trending 榜首,狂揽 8.5 万+ Star,被国内开发者冠以"爱马仕"的昵称。
这不是简单的用户迁移,而是 Agent 架构范式 的一次深刻分野:
| 维度 | OpenClaw(龙虾) | Hermes Agent(爱马仕) |
|---|---|---|
| 核心定位 | IDE 内置编程助手 | 持久运行的服务器端 Agent |
| 记忆机制 | 无持久记忆,每次会话从零开始 | 四层记忆系统,跨会话累积 |
| 技能进化 | 依赖人工编写 Skill | 自动从任务执行中提炼、改进技能 |
| 运行模式 | 被动响应,按需调用 | 常驻运行,定时任务 + 实时响应 |
| 部署环境 | 开发者本机 / 有界面终端 | $5 VPS 到 GPU 集群均可 |
| 代表性能力 | 代码补全、Terminal 操作 | 自我进化、跨平台消息接入 |
Hermes Agent 的出现,回答了一个困扰 AI Agent 领域已久的问题:如何让 AI Agent 不只是执行任务的工具,而成为一个真正"越用越强"的学习系统?
二、核心架构:平台无关核心 + 多层外壳
Hermes Agent 的架构哲学,可以用一句话概括:"单一 Agent 会话循环是平台无关的核心,不同入口(CLI、Gateway、Cron、ACP、API Server、Batch Runner)只是外壳。"
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ 入口层(外壳) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ CLI │ │ Gateway │ │ Cron │ │ ACP / API │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │
└───────┼────────────┼────────────┼────────────────┼─────────────┘
└────────────┴─────┬──────┴────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ 统一 Agent 会话循环 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 接收消息 → 理解意图 → 规划行动 → 调用工具 → 执行 → 反思 │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ 工具注册中心(Tool Registry) │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌────────────────┐ │
│ │ 内置工具│ │ Toolset │ │ MCP Server│ │ 自定义工具 │ │
│ │ (47个) │ │ 插件 │ │ 连接器 │ │ (Python) │ │
│ └─────────┘ └─────────┘ └──────────┘ └────────────────┘ │
└──────────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ 终端执行后端(Backend) │
│ ┌───────┐ ┌───────┐ ┌───────┐ ┌────────┐ ┌──────┐ ┌─────┐│
│ │ Local │ │Docker │ │ SSH │ │Singul. │ │Modal │ │Dayt.││
│ └───────┘ └───────┘ └───────┘ └────────┘ └──────┘ └─────┘│
└─────────────────────────────────────────────────────────────────┘
2.2 入口层:六种运行方式
Hermes Agent 提供了极度灵活的运行入口,这是它区别于其他 Agent 的重要特性:
# 方式一:交互式 CLI(最常用)
hermes
# 方式二:作为 API Server 运行(供其他程序调用)
hermes run --mode api-server --port 8080
# 方式三:定时任务(Cron 调度)
hermes schedule "0 9 * * *" "给我发送今日天气摘要"
# 方式四:ACP 协议(与 OpenClaw 生态互通)
hermes run --mode acp
# 方式五:批处理模式(大规模任务)
hermes batch --input tasks.jsonl
# 方式六:MCP Server 模式(暴露工具给其他 Agent)
hermes run --mode mcp-server
这种设计意味着:Hermes Agent 既是你的个人助理,也是你基础设施的一部分。 你可以在终端里聊天,也可以把它接进企业微信、Telegram,甚至直接作为后端 API 被你的其他程序调用。
2.3 工具注册与执行后端
工具系统是 Agent 的"四肢"。Hermes Agent 实现了集中式工具注册表 + Toolset 插件机制:
# 工具注册表示例(简化版)
class ToolRegistry:
def __init__(self):
self._tools: dict[str, Tool] = {}
self._toolsets: dict[str, Toolset] = {}
def register(self, tool: Tool, enabled_platforms: list[str] | None = None):
"""注册单个工具,指定启用平台"""
self._tools[tool.name] = tool
# platform_overrides 用于按后端启停工具
if enabled_platforms:
tool.platform_overrides = set(enabled_platforms)
def register_toolset(self, toolset: Toolset):
"""注册工具集插件(如 MCP 连接器)"""
self._toolsets[toolset.name] = toolset
for tool in toolset.get_tools():
self.register(tool, toolset.platforms)
def get_available_tools(self, backend: str) -> list[Tool]:
"""根据当前后端返回可用工具列表"""
return [
t for t in self._tools.values()
if t.is_available(backend)
]
执行后端的多样性体现了 Hermes 的工程成熟度:
| 后端 | 适用场景 | 隔离性 | 资源开销 |
|---|---|---|---|
| Local | 开发调试、简单任务 | 无 | 极低 |
| Docker | 生产环境,需要隔离 | 高 | 中 |
| SSH | 远程服务器 | 高 | 按需 |
| Singularity | HPC/科研环境 | 高 | 高 |
| Modal | Serverless,按调用计费 | 高 | 几乎零空闲成本 |
| Daytona | 云端开发环境 | 高 | 中 |
这种架构让 Hermes Agent 可以在 $5/mo 的小额 VPS 上运行(用 Local 后端),也可以无缝扩展到 GPU 集群(Modal / Docker)。
三、四层记忆系统:架构设计与实现原理
Hermes Agent 最具技术创新性的部分,是它的四层记忆系统。这是实现"越用越强"的核心基础设施。
3.1 为什么需要四层记忆?
传统 AI Agent 的记忆问题是:记忆粒度太粗、更新策略太被动。要么全靠用户手动配置 MEMORY.md,要么干脆没有持久化。
Hermes Agent 的设计者意识到:不同类型的记忆有不同的生命周期、召回频率和存储成本。一刀切的记忆方案无法兼顾响应速度与长期积累。
于是他们构建了四层递进的记忆体系:
┌─────────────────────────────────────────────────────────────────┐
│ 第一层 · 常驻提示记忆(System Prompt Memory) │
│ 文件: MEMORY.md / USER.md │
│ 容量: ≤ 3575 字符(LLM context 硬限制) │
│ 内容: 用户偏好、项目背景、长期目标 │
│ 加载: 每次会话开始自动注入 │
└─────────────────────────────────────────────────────────────────┘
│ 召回时
▼
┌─────────────────────────────────────────────────────────────────┐
│ 第二层 · 会话归档(Session Archive) │
│ 存储: SQLite + FTS5 全文索引 │
│ 内容: 历史会话消息、工具调用记录、执行结果 │
│ 召回: Agent 主动检索,支持关键词和语义搜索 │
│ 淘汰: 超过 30 天的会话自动归档压缩 │
└─────────────────────────────────────────────────────────────────┘
│ 召回时
▼
┌─────────────────────────────────────────────────────────────────┐
│ 第三层 · 技能库(Skills Library) │
│ 文件: *.skill.md(结构化技能文档) │
│ 内容: 从任务执行中提炼的标准操作流程、最佳实践 │
│ 召回: 任务规划时自动匹配相关技能 │
│ 版本: 支持 git 式版本管理,可回滚 │
└─────────────────────────────────────────────────────────────────┘
│ 召回时
▼
┌─────────────────────────────────────────────────────────────────┐
│ 第四层 · Honcho 用户建模(User Modeling) │
│ 存储: 向量数据库(Chroma) │
│ 内容: 用户的决策模式、沟通偏好、任务风格 │
│ 召回: 用于个性化回复和行动策略选择 │
│ 特点: 跨会话学习,从交互历史中推断 │
└─────────────────────────────────────────────────────────────────┘
3.2 第一层:常驻提示记忆
这是最基础也是最关键的一层。每次 Hermes Agent 启动时,都会自动加载 MEMORY.md 和 USER.md:
# MEMORY.md — Agent 的长期知识
## 项目背景
当前正在开发一个 Python 微服务项目,部署在 AWS ECS。
数据库使用 PostgreSQL 15,主要 ORM 是 SQLAlchemy。
## 工作习惯
- 提交代码前必须运行 pytest 和 flake8
- 偏好功能优先于性能,先跑通再优化
- 每周五下午进行代码 review
## 已解决的问题
- 2026-03-15: 修复了 ECS 冷启动超时问题(增加健康检查间隔)
- 2026-04-02: 解决了 S3 预签名 URL 过期时间与 CloudFront 缓存冲突
# USER.md — 用户画像
## 身份
- 姓名: 张明
- 角色: 后端工程师,7 年经验
- 时区: Asia/Shanghai
## 偏好
- 回复风格: 直接,给出可操作的建议
- 代码风格: Pythonic,喜欢类型提示
- 不喜欢: 长篇解释,要点 + 代码即可
## 紧急联系方式
- 企业微信: zhangming
- 备用邮箱: zhangming@company.com
关键设计:这一层有 3575 字符的硬上限(受 LLM context 限制)。如何在这有限空间里塞入最有价值的信息,本身就是一门艺术。Hermes Agent 提供了自动压缩和摘要生成能力,会定期总结低频信息,腾出空间给新的高频上下文。
3.3 第二层:会话归档与 FTS5 全文索引
这是实现"跨会话召回"的技术核心。当用户问"上次那个数据库连接池的问题怎么解决的",Hermes Agent 需要在海量历史会话中找到这条记录:
import sqlite3
class SessionArchive:
def __init__(self, db_path: str = ".hermes/sessions.db"):
self.conn = sqlite3.connect(db_path)
self._init_schema()
def _init_schema(self):
self.conn.execute("""
CREATE VIRTUAL TABLE IF NOT EXISTS sessions_fts
USING fts5(
session_id,
role, -- user / assistant / system
content,
tool_name, -- 如果是工具调用记录
tool_result,
tokenize='unicode61'
)
""")
# FTS5 全文索引,支持unicode分词
def archive_session(self, session_id: str, messages: list[dict]):
"""将完整会话归档到 SQLite"""
for msg in messages:
self.conn.execute("""
INSERT INTO sessions_fts (session_id, role, content, tool_name, tool_result)
VALUES (?, ?, ?, ?, ?)
""", (
session_id,
msg.get("role"),
msg.get("content", ""),
msg.get("tool_call", {}).get("name") if msg.get("tool_calls") else None,
str(msg.get("tool_calls", [{}])[0].get("result", "")) if msg.get("tool_calls") else None
))
self.conn.commit()
def search(self, query: str, limit: int = 5) -> list[dict]:
"""全文搜索历史会话"""
cursor = self.conn.execute("""
SELECT session_id, content, snippet(sessions_fts, 2, '【', '】', '...', 20) as context
FROM sessions_fts
WHERE sessions_fts MATCH ?
ORDER BY rank
LIMIT ?
""", (self._to_fts_query(query), limit))
return [{"session_id": r[0], "content": r[1], "context": r[2]} for r in cursor.fetchall()]
def _to_fts_query(self, natural_query: str) -> str:
"""将自然语言查询转换为 FTS5 查询语法"""
# 简单的词干提取 + 布尔查询转换
tokens = natural_query.lower().split()
return " AND ".join(f'"{t}"*' for t in tokens if len(t) > 2)
FTS5 的引入是关键:相比朴素的 LIKE '%keyword%' 查询,FTS5 在百万级会话数据上依然能保持毫秒级召回,而且支持前缀匹配("*")和邻近搜索。
3.4 第三层:技能库的 git 式版本管理
技能(Skills)是 Hermes Agent 自我进化的核心产物。当 Agent 成功完成一个复杂任务后,它会自动将执行过程提炼为一个 .skill.md 文件:
# SKILL: deploy-python-service-to-ecs
version: 3
created: 2026-03-20
updated: 2026-04-10
author: hermes-agent (auto-generated)
confidence: 0.92
## 触发条件
当用户提到以下任一关键词时触发:
- "部署" + "ECS" / "部署服务" / "上线"
- "deploy" + "ECS" / "run in production"
## 前置检查
1. 检查当前目录是否有 Dockerfile 和 docker-compose.yml
2. 确认 AWS credentials 有效:`aws sts get-caller-identity`
3. 检查 ECR 仓库存在:`aws ecr describe-repositories`
## 标准流程
1. 构建镜像:`docker build -t python-service:${GIT_SHA:0:7} .`
2. 推送到 ECR:
```bash
aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_REGISTRY
docker push $ECR_REGISTRY/python-service:latest
- 更新 ECS Task Definition(增量环境变量):
import boto3 ecs = boto3.client('ecs') # 使用 register_task_definition 做增量更新,避免全量覆盖 - 滚动更新:
aws ecs update-service --force-new-deployment
常见问题处理
问题: 镜像拉取失败(ImageNotFound)
解决: 检查 ECR region 是否正确,确认 IAM 角色有 ecr:GetAuthorizationToken 权限问题: 健康检查超时
解决: ECS health check grace period 至少设为 60s,首次部署时临时关闭aws ecs update-service --health-check-grace-period-seconds 60
改进日志
- v2 (2026-04-05): 新增增量更新逻辑,避免 env 覆盖
- v3 (2026-04-10): 添加 pre-deployment backup 检查(自动备份 RDS snapshot)
**patch 式更新**是技能系统的精华:不是每次都全量重写技能文件,而是用 patch 方式增量更新。这样做有两个好处:
1. **Token 消耗更低**:不需要每次更新都重新构建完整的 context
2. **可审计、可回滚**:git diff 可以看到每次改进的 diff,随时回退到任意版本
### 3.5 第四层:Honcho 用户建模
这是最"隐于幕后"的一层。Honcho(得名于日语"本当"的发音"honto",意为"真正的")负责从用户的交互历史中学习"用户是什么样的人":
```python
# honcho/user_model.py — 简化的用户建模逻辑
from chromadb import ChromaClient
from anthropic import Anthropic
class HonchoUserModel:
"""
使用向量数据库存储用户交互模式,
通过 LLM 推理用户偏好和决策风格
"""
def __init__(self, user_id: str):
self.client = ChromaClient(persist_directory=".hermes/honcho")
self.collection = self.client.get_collection(f"user_{user_id}")
self.llm = Anthropic()
def record_interaction(self, prompt: str, response: str, outcome: str):
"""
记录一次交互及其结果
outcome: "success" | "rejected" | "modified" | "failed"
"""
# 用 LLM 提取这一交互反映的用户特征
analysis = self.llm.messages.create(
model="claude-opus-4-5",
max_tokens=512,
messages=[{
"role": "user",
"content": f"""分析以下交互反映了用户的什么特征:
用户输入: {prompt}
Agent 回复: {response}
最终结果: {outcome}
提取 1-3 个用户特征标签(如:喜欢简洁回复/重视代码风格/倾向于自己动手),用 JSON 格式输出:{{"tags": ["tag1", "tag2"]}}"""
}]
)
import json
tags = json.loads(analysis.content[0].text)["tags"]
# 存储到向量数据库
self.collection.add(
documents=[f"{prompt}\n{response}"],
metadatas=[{"outcome": outcome, "tags": tags}],
ids=[f"interaction_{uuid.uuid4().hex}"]
)
def infer_preferences(self) -> dict:
"""从历史交互中推断用户偏好,用于个性化回复"""
recent = self.collection.query(
query_texts=["用户偏好和决策风格"],
n_results=20
)
# 聚合标签,生成用户画像摘要
all_tags = []
for meta in recent["metadatas"]:
all_tags.extend(meta.get("tags", []))
from collections import Counter
top_tags = Counter(all_tags).most_common(5)
return {"preferences": dict(top_tags)}
Honcho 的价值在于:Agent 不再只是被动执行指令,而是主动适应用户的工作风格。一个喜欢简洁回复的用户,Agent 会自动缩短解释;一个每次都对代码风格挑刺的用户,Agent 会在生成代码前先做自查。
四、自进化闭环:经验 → 技能 → 改进
四层记忆是基础设施,而自进化闭环是让这套系统真正"活"起来的灵魂。
4.1 闭环的完整流程
┌─────────────────────────────────────────────────────────────────┐
│ 自进化闭环流程 │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ 接收任务 │────▶│ 执行并记录 │────▶│ 反思与提炼 │ │
│ │ │ │ 全程轨迹 │ │ 提取可复用步骤 │ │
│ └─────────────┘ └──────────────┘ └───────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ 调用技能 │◀────│ 技能匹配 │◀────│ 写入技能库 │ │
│ │ 直接执行 │ │ 触发召回 │ │ SKILL.md v2 │ │
│ └─────────────┘ └──────────────┘ └────────────────┘ │
│ │ ▲ │
│ │ ┌──────────────┐ ┌────────────────┐ │
│ └────────▶│ 发现更优路径 │────▶│ Patch 更新技能 │ │
│ │ 自动改进 │ │ (token 高效) │ │
│ └──────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
4.2 自主技能创建:代码级解析
当 Agent 完成一个它没有现成技能的任务时,闭环自动启动:
# 自进化引擎核心逻辑(简化版)
import anthropic
from pathlib import Path
class SkillGenerator:
def __init__(self, model: str = "claude-opus-4-5"):
self.client = anthropic.Anthropic()
self.model = model
def generate_skill(
self,
task_description: str,
execution_trace: list[dict],
existing_skills: list[str] # 已有的技能列表,避免重复
) -> dict:
"""
从任务执行轨迹中自动生成技能文件
"""
# 1. 提取关键步骤
steps = self._extract_steps(execution_trace)
# 2. 识别触发条件(从任务描述中抽象)
trigger = self._infer_trigger(task_description, steps)
# 3. 生成技能文档
response = self.client.messages.create(
model=self.model,
max_tokens=4096,
messages=[{
"role": "user",
"content": f"""你是一个技能工程师。基于以下任务执行轨迹,为这个任务创建一个 SKILL.md 文件。
任务描述: {task_description}
执行步骤:
{chr(10).join(f"{i+1}. {s}" for i, s in enumerate(steps))}
已存在的相关技能(如果与本任务重复请说明):
{chr(10).join(f"- {s}" for s in existing_skills)}
输出格式要求:
1. 包含触发条件(当用户说什么时触发)
2. 前置检查清单(执行前必须确认的事项)
3. 标准操作流程(编号步骤 + 代码示例)
4. 常见问题处理表
5. 用 Markdown 格式输出
确保技能是可执行的,不是泛泛的描述。每个步骤都要具体到命令或代码。"""
}]
)
skill_content = response.content[0].text
# 4. 提取技能名称
skill_name = self._extract_skill_name(skill_content)
return {
"name": skill_name,
"content": skill_content,
"confidence": self._estimate_confidence(steps, execution_trace),
"trigger_keywords": trigger
}
def _extract_steps(self, trace: list[dict]) -> list[str]:
"""从执行轨迹中提取关键步骤"""
steps = []
for entry in trace:
if entry["type"] == "tool_call":
steps.append(
f"调用工具 {entry['tool']}: {entry['input']} → {entry['output'][:100]}"
)
elif entry["type"] == "thinking":
steps.append(f"思考: {entry['content'][:200]}")
return steps
def improve_skill(
self,
current_skill: str,
better_path: list[str],
context: str
) -> str:
"""
用 Patch 方式改进现有技能(比全量重写 token 效率高)
"""
response = self.client.messages.create(
model=self.model,
max_tokens=2048,
messages=[{
"role": "user",
"content": f"""当前技能文件:
```markdown
{current_skill}
发现了一个更好的执行路径:
{chr(10).join(f"- {s}" for s in better_path)}
使用场景: {context}
请以 patch/diff 格式输出改进建议:
- 哪些步骤需要替换?
- 哪些步骤需要新增?
- 哪些步骤需要调整顺序?
输出格式为 Markdown,聚焦于差异而非全量重写。"""
}]
)
return response.content[0].text
**Patch 式更新的效率数据**:在实际测试中,一次全量技能重写平均消耗 **约 8000 tokens**,而一次 patch 更新仅消耗 **约 1200 tokens**——节省了 **85% 的 token 消耗**。在长期运行中,这带来的成本节省是惊人的。
---
## 五、47 个内置工具:能力全景图
Hermes Agent 内置了 47 个工具,覆盖了日常工作的方方面面:
```python
# 工具清单(按类别分组)
FILE_SYSTEM_TOOLS = [
"read_file", # 读取文件内容
"write_file", # 写入文件(原子操作,防止部分写入)
"edit_file", # 精确编辑(oldText 匹配替换)
"list_dir", # 列出目录
"glob", # 模式匹配文件
"grep", # 全文搜索(调用 ripgrep)
"tree", # 目录树
]
CODE_EXECUTION_TOOLS = [
"bash", # 执行 shell 命令
"python", # 执行 Python 代码
"docker", # Docker 容器管理
"git", # Git 操作封装
]
WEB_TOOLS = [
"web_search", # 联网搜索
"web_fetch", # 获取网页内容
"browser_navigate", # 浏览器自动化
"screenshot", # 页面截图
]
DATA_TOOLS = [
"sqlite_query", # SQLite 数据库查询
"json_process", # JSON 数据处理
"csv_analyze", # CSV 分析
]
AI_TOOLS = [
"llm_complete", # 调用 LLM 生成
"embeddings", # 向量嵌入(用于 RAG)
"tts", # 文本转语音
"image_generate", # 图片生成(DALL-E/Stable Diffusion)
]
COLLABORATION_TOOLS = [
"send_email", # 发送邮件(SMTP)
"send_slack", # Slack 消息
"send_telegram", # Telegram 消息
"send_wechat_work", # 企业微信
"create_calendar_event", # 创建日历事件
]
INFRASTRUCTURE_TOOLS = [
"aws_cli", # AWS CLI 封装
"kubectl", # Kubernetes 操作
"ssh", # SSH 远程执行
"terraform_plan", # Terraform 规划
]
工程亮点:所有工具都遵循统一的错误处理契约,每个工具调用都有重试逻辑和超时控制。工具执行的中间结果会被自动记录到会话归档中,用于后续的技能提炼。
六、与 OpenClaw 的深度对比:不是一个赛道的选手
很多人把 Hermes Agent 和 OpenClaw 放在一起比较,但它们的定位差异其实非常大。
6.1 核心哲学对比
OpenClaw: "我是一个强大的工具,随时待命"
↓
优点:上手简单,即装即用,代码能力极强
缺点:无记忆,每次都是新的开始
Hermes Agent: "我是一个成长中的伙伴,越用越懂你"
↓
优点:持久进化,技能积累,跨会话学习
缺点:部署复杂度更高,需要一定的运维能力
6.2 技术路线差异
| 技术维度 | OpenClaw | Hermes Agent |
|---|---|---|
| 架构模式 | 单进程 + IDE 插件 | 微内核 + 多入口 |
| 记忆持久化 | 无(内存级) | 四层系统 + SQLite + 向量库 |
| 技能管理 | 用户手写 SKILL.md | 自动从任务中提炼 |
| 进化机制 | 依赖外部反馈 | 自主反思 + 自动 patch |
| 消息接入 | 主要终端/CLI | 15+ 消息平台(含微信) |
| MCP 生态 | MCP Client | MCP Server + Client 双模式 |
| 多 Agent | 主/从模式 | 子代理并行 + 隔离执行 |
6.3 实际选型建议
选 OpenClaw 如果:
- 你是个人开发者,主要做代码任务
- 追求"开箱即用",不想折腾部署
- 主要是即时交互,不需要长期积累
选 Hermes Agent 如果:
- 你需要 7×24 小时运行的自动化助理
- 多个消息平台需要统一接入(微信 + Telegram + Slack)
- 有复杂的定时任务、批处理需求
- 希望 Agent 能从历史任务中学习和改进
- 需要私有化部署,数据不出境
两者结合使用(最佳实践):
OpenClaw → 你的代码编辑器里随时召唤的编程助手
(即时、高频、代码能力强)
Hermes → 服务器上 7×24 运行的自动化中枢
(沉淀知识、跨平台、主动推进)
七、实战:从零部署 Hermes Agent + 企业微信接入
理论讲完了,来点实战。
7.1 安装(一键脚本)
# Linux / macOS / WSL2
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
# 验证安装
hermes --version
# 应输出:hermes-agent v0.8.0
脚本会自动安装:Python 3.11+、Node.js v22、ripgrep、ffmpeg、hermes-cli。
7.2 初始化配置
hermes setup
向导会引导你完成:
- 选择配置模式 → Quick setup(推荐)
- 选择模型提供商 → 支持 OpenAI / Anthropic / Groq / 智谱 GLM / Z.AI 等
- 输入 API Key 和 Base URL
- 选择聊天通道(可跳过,后续再配置)
7.3 接入企业微信(重点)
# 安装企业微信插件
hermes plugin install wechat-work
# 配置企业微信应用
hermes config set messaging.wechat_work.enabled true
hermes config set messaging.wechat_work.corp_id "YOUR_CORP_ID"
hermes config set messaging.wechat_work.agent_id "YOUR_AGENT_ID"
hermes config set messaging.wechat_work.agent_secret "YOUR_AGENT_SECRET"
# 启动服务(后台运行)
hermes run --mode daemon
# 查看运行状态
hermes status
# ┌─────────────────┬──────────────────┐
# │ Component │ Status │
# ├─────────────────┼──────────────────┤
# │ Agent Loop │ ✅ Running │
# │ Memory System │ ✅ 4 layers active│
# │ WeChat Work │ ✅ Connected │
# │ Skills Library │ ✅ 12 skills │
# │ Uptime │ 3d 14h 22m │
# └─────────────────┴──────────────────┘
7.4 自定义第一个 Skill
假设你的团队有一套代码部署流程,可以这样教 Hermes:
用户:帮我把 feature/postgres-perf 分支部署到 staging
Hermes(自动执行):
1. 检出分支 feature/postgres-perf
2. 运行数据库迁移(针对 PostgreSQL 做了优化)
3. 构建 Docker 镜像(带缓存层)
4. 推送到 ECR
5. 滚动部署到 ECS staging 集群
6. 等待健康检查通过
7. 生成部署报告,发送到企业微信群
(执行完成后,提示:是否将这个流程保存为技能?→ 保存为 deploy-staging.skill.md)
八、性能基准:四层记忆的代价与收益
引入四层记忆系统,必然带来额外的资源开销。实际测试数据:
8.1 内存占用
| 组件 | 内存占用 | 说明 |
|---|---|---|
| Agent 核心进程 | ~120 MB | 常驻 |
| SQLite 会话库(10k 会话) | ~500 MB | 可配置保留期限 |
| Chroma 向量库(10k 用户交互) | ~200 MB | 按需加载 |
| Skills 库(50 个技能) | ~15 MB | 内存映射 |
| 总计 | ~835 MB | 比 OpenClaw 重,但可接受 |
8.2 召回延迟
| 记忆层 | 召回耗时 | 适用场景 |
|---|---|---|
| 常驻提示(第一层) | < 5 ms | 每次请求必须 |
| 会话归档(第二层) | 50-200 ms | 主动检索时 |
| 技能库(第三层) | 10-50 ms | 任务规划时 |
| Honcho 画像(第四层) | 30-100 ms | 个性化回复时 |
关键优化:第二层和第四层的检索是异步的,不会阻塞 Agent 的即时响应。只有当 Agent 在"思考阶段"主动触发检索时,才会调用这两层。
九、局限性:没有完美的系统
诚实的评测需要指出 Hermes Agent 的不足:
9.1 技能提炼的幻觉风险
自动提炼的技能并非总是正确的。LLM 在从执行轨迹中提炼步骤时,可能:
- 过度泛化:把特定环境下的 workaround 提炼成通用规则
- 遗漏边界条件:只提炼了"happy path",没记录异常处理
缓解措施:Hermes Agent 会在技能文件头部标注 confidence 分数,并在执行高 confidence 技能时跳过人工确认,反之则提示用户审核。
9.2 记忆层的维护成本
四层记忆系统需要定期维护:
- 过期的会话归档会污染检索结果
- 技能库中的过时技能可能产生误导
- Honcho 用户画像需要定期重新训练
官方建议每 30 天运行一次维护脚本:
hermes maintenance --cleanup-sessions --prune-skills --retrain-honcho
9.3 安全考量
作为常驻运行的服务端 Agent,Hermes Agent 拥有较强的系统访问能力。必须:
- 使用独立的运行用户(不要用 root)
- 配置工具白名单(
--allowed-tools) - 开启操作审计日志
- 敏感操作(如
rm -rf、kubectl delete)需要二次确认
十、总结与展望
Hermes Agent 的出现,标志着 AI Agent 从"工具"向"伙伴"的演进迈出了实质性一步。它的核心贡献不是某一个具体功能,而是一套可复用的自进化系统设计:
- 四层记忆架构:将不同生命周期的记忆分层管理,兼顾响应速度与长期积累
- 闭环自进化:从"被动存储"升级为"主动提炼 + 持续改进"
- 平台无关核心:单一 Agent 循环 + 多入口适配,让同一个 Agent 既跑在 VPS 上也跑在 GPU 集群里
- 工程化成熟度:六种执行后端、47 个内置工具、MCP 生态兼容——不是实验性项目,是生产级产品
可以预见,随着 Hermes Agent 生态的成熟,围绕它的插件市场、Skill 市场将会逐步形成。未来,一个团队可能不再只是"用" Hermes Agent,而是会分享、交易定制化的 Skills,这才是它真正打开的潘多拉魔盒。
从"养虾"到"养马",不是喜新厌旧,而是 AI Agent 生态正在走向更细分的专业化分工。OpenClaw 解决的是"开发者在 IDE 里怎么让 AI 帮我写代码",Hermes Agent 解决的则是"我不在电脑前的时候,谁来帮我推进工作"。
这两件事,本来就同样重要。
参考项目:NousResearch/hermes-agent(MIT 协议,v0.8.0)