Hermes Agent 深度实战:Nous Research 开源自进化 AI Agent——从闭环学习到生产级部署的完整指南
传统 AI Agent 的最大痛点是什么?用完就忘。Hermes Agent 给出了一个完全不同的答案:让 Agent 真正积累经验,越用越强。
一、背景介绍:AI Agent 的"失忆症"困局
2026 年,AI Agent 已经渗透进开发者的日常工作。从 Claude Code 到 Cursor,从 OpenClaw 到各种自动化脚本,Agent 能做的事情越来越多。但一个根本性问题始终没有解决:Agent 没有记忆,更没有学习能力。
1.1 传统 Agent 的工作模式
用户输入 → 规划 → 执行 → 输出结果 → [会话结束,一切归零]
这是一个开环系统。无论任务完成得多出色,系统都不会留下任何"经验值"。下次遇到相同问题,Agent 必须从头再来。
现实中的场景是这样的:
- 你让 Agent 帮你调试一个复杂的 Rust 并发 bug,它花了 10 分钟分析日志、检查代码、最终定位到是
Mutex死锁问题,并给出了完美的修复方案。 - 第二天,你遇到类似问题,Agent 完全不记得昨天的分析过程。它像金鱼一样,只有 7 秒记忆。
- 你不得不重新描述问题、重新提供上下文、重新走一遍分析流程。
这种体验,就像每次都换一个新的实习生——能力或许不错,但永远需要从零开始。
1.2 为什么记忆这么难?
技术层面,Agent 的记忆系统面临三个核心挑战:
- 上下文窗口限制:LLM 的上下文窗口有限(即使 200K tokens,也不可能无限积累)
- 检索效率问题:记忆存储容易,但如何在需要时精准召回是难题
- 经验抽象困难:原始对话记录不等于可复用的经验,需要某种形式的"反思"和"提炼"
现有的解决方案各有局限:
- OpenClaw:依赖用户手动编写
MEMORY.md,记忆是静态的,不会自动更新 - AutoGPT:尝试过自主目标分解,但容易陷入循环,且记忆管理混乱
- LangChain Memory:提供对话历史管理,但缺乏深层的经验抽象能力
1.3 Nous Research 的答案
Nous Research(知名开源模型实验室,旗下有 Hermes、Nomos、Psyche 等系列模型)在 2026 年 5 月开源了 Hermes Agent——一个真正具备自进化能力的 AI Agent 框架。
核心创新点:
- 闭环学习系统:任务完成后自动提炼技能(Skill),存储到持久化记忆
- 多层记忆架构:短期工作记忆 + 中期任务记忆 + 长期技能记忆 + 永久用户画像
- FTS5 全文检索 + LLM 智能摘要:实现毫秒级记忆召回
- 辩证用户建模(基于 Honcho):理解用户偏好如何随时间演变
截至 2026 年 5 月,Hermes Agent 在 GitHub 上已收获 47,577 Stars,单日最高新增 6,115 Stars,是 2026 年最受关注的开源 Agent 项目之一。
二、核心概念:Hermes Agent 是什么
2.1 定位与核心理念
Hermes Agent 不是:
- 绑定在 IDE 里的编程助手(如 Cursor、GitHub Copilot)
- 封装 LLM API 的聊天机器人外壳
- 一次性的任务执行脚本
Hermes Agent 是:
- 一个驻留在你服务器上的自主智能体,拥有持久记忆、自动生成技能、跨平台通信能力
- 一个会成长的智能体——用得越久,能力越强
- 一个开放的系统——支持 15+ 消息平台、任意 LLM 后端、MCP 协议扩展
命名来自希腊神话中的信使之神 Hermes,象征知识的传递与积累——这个命名恰好暗示了项目的核心追求:让知识在 Agent 的使用过程中不断沉淀和传承。
2.2 自进化闭环:与传统 Agent 的本质区别
传统 Agent 的工作流:
任务输入 → LLM 推理 → 工具调用 → 输出结果 → 结束
Hermes Agent 的工作流:
任务输入 → LLM 推理 → 工具调用 → 输出结果
↓
自动反思:这个任务的成功路径是什么?
↓
提炼技能:将成功路径固化为 Skill(YAML + Markdown)
↓
存储到 ~/.hermes/skills/ (持久化)
↓
下次遇到类似任务 → 自动召回相关 Skill → 执行效率提升
这个闭环包含四个关键阶段:
阶段 1:记忆持久化
Hermes 维护跨会话的长期记忆,采用四层记忆架构:
| 层次 | 存储位置 | 容量 | 内容 |
|---|---|---|---|
| 短期工作记忆 | 内存 + SQLite session 表 | ~32K tokens | 当前对话上下文 |
| 中期任务记忆 | ~/.hermes/memories/MEMORY.md | ~2,200 字符 / ~800 tokens | 环境配置、使用约定、技术发现 |
| 长期技能记忆 | ~/.hermes/skills/*.md | 无限 | 从任务中提炼的可复用技能 |
| 永久用户画像 | ~/.hermes/memories/USER.md | ~2,200 字符 / ~500 tokens | 用户偏好、习惯、沟通风格 |
FTS5 全文检索引擎(SQLite 内置)负责对记忆进行毫秒级检索。配合 LLM 摘要技术,系统能智能判断哪些信息值得持久化。
阶段 2:自主技能创建
当一个任务涉及 5 次以上工具调用(即足够复杂)时,Hermes 会自动触发技能创建流程:
- 分析任务执行轨迹(哪些工具被调用、调用顺序、参数、结果)
- 提取可复用的操作步骤
- 生成标准化 Skill 文件(YAML 前置元数据 + Markdown 正文)
- 存储到
~/.hermes/skills/目录
Skill 文件示例:
---
name: debug_rust_deadlock
description: 调试 Rust 程序中的 Mutex 死锁问题
trigger:
- "Rust 程序卡死"
- "怀疑有死锁"
- "多线程无响应"
tools: [terminal, file_read, grep]
---
# 调试 Rust Mutex 死锁
## 步骤
1. 使用 `tokio-console` 或 `std::fmt::Debug` 打印线程状态
2. 检查所有 `Mutex` 的获取顺序,确保全局一致
3. 使用 `parking_lot::Mutex` 替代 `std::sync::Mutex` 获得更好的死锁检测
4. ...
## 代码示例
```rust
use parking_lot::Mutex;
// 而不是 std::sync::Mutex
#### 阶段 3:技能自我优化
技能不是一成不变的。当 Hermes 发现某个 Skill 的执行效果可以改进时(比如用户手动修正了 Agent 的输出),它会自动更新 Skill 文件。
这个过程是**增量式**的:每次改进都追加到 Skill 的"经验记录"中,而不会覆盖原始内容。
#### 阶段 4:跨会话记忆召回
当用户发起新任务时,Hermes 会:
1. 用 FTS5 全文搜索检索相关记忆(毫秒级)
2. 用 LLM 对检索结果进行相关性打分和摘要
3. 将最相关的记忆注入到当前上下文
这使得 Hermes 能"记住"上个月你告诉它的项目约定、三个月前你们一起解决的某个诡异 bug 的根因分析。
### 2.3 辩证用户建模(Honcho)
Hermes 集成了 **Honcho** 对话式用户建模系统,能在 **12 个身份层次**上理解用户:
1. 基本信息(姓名、时区、语言偏好)
2. 技术背景(熟悉的语言、框架、工具链)
3. 沟通风格(简洁 vs 详细、正式 vs 随意)
4. 决策偏好(快速原型 vs 深思熟虑)
5. 项目上下文(当前工作的代码库、架构风格)
6. ...(共 12 层)
这个建模是**辩证**的:它不仅记录"用户是什么样的人",还记录"用户的偏好如何随时间演变"。
例如:
- 初期:用户喜欢详细的解释和代码示例
- 三个月后:用户变得更熟练,开始偏好简洁的要点式回答
- Hermes 能捕捉到这种演变,并调整自己的回应风格
---
## 三、架构分析:Hermes Agent 的技术实现
### 3.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ 消息平台接入层 │
│ Telegram │ Discord │ Slack │ WhatsApp │ 飞书 │ 企业微信 │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ Gateway(消息网关) │
│ • 协议适配(各平台消息格式标准化) │
│ • 会话管理(session 路由、上下文加载) │
│ • 速率限制(防止 API 滥用) │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ Core Agent Runtime │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ run_agent.py(核心对话循环) │ │
│ │ • AIAgent 类(管理对话状态) │ │
│ │ • chat() 方法(处理单轮对话) │ │
│ │ • tool call 编排 │ │
│ │ • context compression(上下文压缩) │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ prompt_builder.py(系统提示词构建) │ │
│ │ • 注入 MEMORY.md / USER.md │ │
│ │ • 注入相关 Skills │ │
│ │ • SKILLS_GUIDANCE(引导 Agent 创建技能) │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ model_tools.py(工具编排) │ │
│ │ • 47+ 内置工具定义 │ │
│ │ • 工具调用权限控制 │ │
│ │ • 沙盒执行环境管理 │ │
│ └─────────────────────────────────────────────────────┘ │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ 持久化层 │
│ • SQLite(sessions、memories、skills FTS5 索引) │
│ • 文件系统(~/.hermes/ 目录树) │
│ • Honcho(用户建模数据存储) │
└─────────────────────────────────────────────────────────────┘
### 3.2 关键源码文件解析
#### `hermes_cli/main.py`——总入口与调度器
这是所有用户可见命令的源头。核心职责:
- **参数解析**:基于 `argparse` 的子命令树(`setup`、`gateway`、`dashboard`、`acp`、`skills`、`sessions`)
- **环境初始化**:`HERMES_HOME` 注入、`.env` 加载、日志系统初始化
- **子命令分发**:根据不同的子命令,调用不同的处理逻辑
重点关注 `cmd_setup()`、`cmd_gateway()`、`cmd_acp()` 这三个函数,它们分别对应"初始配置"、"消息网关启动"、"ACO 协议(Agent Communication Protocol)"三大核心功能。
#### `run_agent.py`——Agent 运行时内核
如果只能读一个文件,那就是它。`AIAgent` 类定义了:
```python
class AIAgent:
def __init__(self, model, tools, memory_path, ...):
self.model = model # LLM 后端(DeepSeek/Claude/GPT/...)
self.tools = tools # 可用工具列表
self.memory = MemoryManager(memory_path)
self.skills = SkillManager()
def chat(self, user_message: str) -> str:
# 1. 召回相关记忆
relevant_memories = self.memory.recall(user_message)
# 2. 构建系统提示词(注入记忆 + Skills)
system_prompt = build_prompt(
memories=relevant_memories,
skills=self.skills.get_relevant(user_message)
)
# 3. 调用 LLM
response = self.model.generate(system_prompt, user_message)
# 4. 处理 tool calls(可能多轮)
while has_tool_calls(response):
tool_results = execute_tool_calls(response)
response = self.model.generate(tool_results)
# 5. 后处理:触发记忆持久化 + 技能创建检查
self._post_process(user_message, response)
return response
def _post_process(self, user_msg, agent_resp):
# 检查是否需要创建技能(工具调用次数 >= 5)
if self.tool_call_count >= 5:
self.skills.create_skill_from_trajectory(
trajectory=self.conversation_history,
task_description=user_msg,
result=agent_resp
)
# 更新记忆
self.memory.update(user_msg, agent_resp)
关键设计决策:
- 为什么是
chat()而不是run()? 因为 Hermes 设计为"对话式 Agent",强调人机协作,而非完全自主运行。 - 为什么 tool call 处理放在
run_agent.py而不是model_tools.py? 因为 tool call 的执行可能涉及多轮对话、权限确认、沙盒管理,这些属于"Agent 运行时"的职责,而非"工具定义"的职责。
prompt_builder.py——系统提示词的精心编排
Hermes 的系统提示词是动态构建的,而非静态模板。核心组件:
- 基础角色定义:你是 Hermes,一个自进化的 AI Agent...
- 记忆注入:从 FTS5 检索到的相关记忆(智能截断,防止超出上下文窗口)
- 技能注入:与当前任务相关的 Skills(同样需要智能截断)
- SKILLS_GUIDANCE:引导 Agent 在完成任务后创建技能的指令
SKILLS_GUIDANCE 是关键创新:
SKILLS_GUIDANCE = """
After completing a complex task (5+ tool calls), YOU SHOULD create a Skill:
1. Reflect on the task: What was the user trying to accomplish?
2. Analyze your solution: What steps did you take? What tools did you use?
3. Create a Skill file (YAML + Markdown) that captures this knowledge.
4. Save it to ~/.hermes/skills/
A good Skill is:
- Specific enough to be actionable
- General enough to be reusable
- Written in clear, concise language
Example Skill structure:
---
name: <skill_name>
description: <when to use this skill>
trigger: [<keywords that indicate this skill is relevant>]
tools: [<which tools this skill uses>]
---
# <Skill Title>
## Steps
1. ...
2. ...
## Code Example
```python
...
"""
这段提示词的艺术在于:**它让 LLM 自己决定什么时候创建 Skill、创建什么样的 Skill**。这不是硬编码的规则,而是"元认知"层面的引导。
#### `model_tools.py`——47+ 内置工具
Hermes 的工具集覆盖:
| 类别 | 工具示例 | 用途 |
|------|---------|------|
| 文件系统 | `file_read`、`file_write`、`file_edit` | 读写代码和文档 |
| 终端执行 | `terminal_run` | 执行 shell 命令 |
| 代码搜索 | `ripgrep_search` | 高速正则搜索(ripgrep) |
| 网页交互 | `browser_navigate`、`browser_snapshot` | 浏览器自动化 |
| 记忆管理 | `memory_recall`、`memory_update` | 记忆检索和更新 |
| 图像处理 | `image_generate`、`image_analyze` | 多模态能力 |
| 语音合成 | `tts_generate` | 文字转语音 |
| ... | ... | ... |
**工具权限控制**:
Hermes 支持细粒度的工具权限管理。你可以在 `~/.hermes/config.yaml` 中配置:
```yaml
tool_permissions:
terminal_run:
allow: true
sandbox: true # 在沙盒中执行
timeout: 300 # 5 分钟超时
forbidden_commands:
- rm -rf /
- dd if=/dev/zero
file_write:
allow: true
sandbox: true
allowed_paths:
- ~/.hermes/
- ~/projects/
3.3 记忆系统的工程实现
FTS5 全文检索
Hermes 使用 SQLite 的 FTS5 扩展来实现记忆检索。表结构:
CREATE VIRTUAL TABLE memories_fts USING fts5(
content, -- 记忆内容
category, -- 类别(technical / preference / context / ...)
timestamp, -- 创建时间
tokenize = 'porter unicode61' -- 分词器(支持 Unicode)
);
-- 检索示例
SELECT content, rank
FROM memories_fts
WHERE memories_fts MATCH 'Rust 并发 Mutex'
ORDER BY rank;
为什么用 FTS5 而不是向量数据库?
Nous Research 的选择有其工程考量:
- 零依赖:FTS5 是 SQLite 内置扩展,不需要额外的服务进程
- 低延迟:本地全文检索,毫秒级响应
- 足够好:对于"记忆召回"这个场景,关键词 + 短语匹配已经足够;真正的语义相似度由 LLM 在后续步骤中处理
LLM 智能摘要
原始对话记录可能很长,不可能全部注入到上下文。Hermes 使用 LLM 对检索到的记忆进行摘要:
def summarize_memories(retrieved_memories, max_tokens=2000):
prompt = f"""
Below are some memories that might be relevant to the user's query.
Summarize the most important information in at most {max_tokens} tokens.
Memories:
{retrieved_memories}
"""
summary = llm.generate(prompt)
return summary
这个摘要步骤是关键:它让 Hermes 能在有限的上下文窗口内"装入"更多的记忆。
3.4 Skill 系统的文件格式与生命周期
Skill 文件结构
每个 Skill 是一个独立的 Markdown 文件,存储在 ~/.hermes/skills/ 目录下:
---
name: optimize_python_loop
description: 优化 Python 中的慢循环(使用 NumPy 向量化或 Numba JIT)
trigger:
- "Python 循环太慢"
- "如何加速这个 for 循环"
- "NumPy 向量化"
tools: [file_read, terminal_run, python_execute]
created_at: 2026-05-15T10:30:00Z
last_used: 2026-05-23T08:45:00Z
success_count: 7
failure_count: 1
---
# 优化 Python 慢循环
## 问题识别
首先检查是否是 CPU 密集型循环...
## 解决方案
### 方案 1:NumPy 向量化
```python
# Before
result = []
for i in range(n):
result.append(func(data[i]))
# After
result = np.vectorize(func)(data)
方案 2:Numba JIT
from numba import jit
@jit(nopython=True)
def fast_func(data):
# ...
性能对比
| 方法 | 时间(100万次) |
|---|---|
| 纯 Python | 2.3s |
| NumPy 向量化 | 0.15s |
| Numba JIT | 0.08s |
经验记录
- 2026-05-15:用户反馈 NumPy 方案在他的数据集上内存占用过高,改用 Numba 后解决
- 2026-05-20:发现用户的数据有大量 NaN,需要在向量化前处理
#### Skill 生命周期
创建 → 存储 → 召回 → 使用 → 评估 → 更新 → 归档/删除
- **创建**:任务完成后自动生成(或用户手动创建)
- **存储**:写入 `~/.hermes/skills/`
- **召回**:FTS5 全文搜索 + LLM 相关性判断
- **使用**:注入到系统提示词,指导 Agent 执行
- **评估**:记录 `success_count` 和 `failure_count`
- **更新**:当 Agent 发现改进点时自动更新
- **归档/删除**:长期未使用(如 90 天)的 Skill 会被自动归档
---
## 四、代码实战:部署与使用 Hermes Agent
### 4.1 安装部署(三种方式)
#### 方式一:一键安装脚本(推荐)
```bash
# Linux / macOS / WSL2
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
安装脚本会自动处理所有依赖:
- 检测/安装 Python 3.11+
- 检测/安装 Node.js v22(浏览器自动化和微信桥接需要)
- 检测/安装 ripgrep(高速文件搜索)
- 检测/安装 ffmpeg(音视频处理)
- 创建独立的 Python 虚拟环境(位于
~/.hermes/hermes-agent/venv) - 克隆代码仓库
- 安装所有依赖包
- 将
hermes命令添加到 PATH
方式二:手动安装(适合高级用户)
# 1. 克隆仓库
git clone https://github.com/NousResearch/hermes-agent.git ~/.hermes/hermes-agent
cd ~/.hermes/hermes-agent
# 2. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 3. 安装 Python 依赖
pip install -r requirements.txt
# 4. 安装 Node.js 依赖(浏览器自动化)
npm install
# 5. 安装系统级依赖(macOS)
brew install ripgrep ffmpeg
# 6. 添加到 PATH
echo 'export PATH="$HOME/.hermes/hermes-agent:$PATH"' >> ~/.zshrc
方式三:Docker 部署(服务器端)
FROM python:3.11-slim
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
ripgrep \
ffmpeg \
nodejs \
npm \
&& rm -rf /var/lib/apt/lists/*
# 克隆 Hermes Agent
RUN git clone https://github.com/NousResearch/hermes-agent.git /opt/hermes-agent
WORKDIR /opt/hermes-agent
# 安装 Python 依赖
RUN pip install -r requirements.txt
# 安装 Node.js 依赖
RUN npm install
# 暴露 Gateway 端口
EXPOSE 8080
CMD ["hermes", "gateway", "--host", "0.0.0.0", "--port", "8080"]
构建和运行:
docker build -t hermes-agent .
docker run -d \
-v ~/.hermes:/root/.hermes \
-p 8080:8080 \
--name hermes \
hermes-agent
4.2 初始配置
安装完成后,运行:
hermes setup
会进入交互式配置向导:
选择模型提供商:
- DeepSeek(推荐,性价比高)
- Anthropic Claude
- OpenAI GPT
- 本地模型(通过 Ollama 或 vLLM)
输入 API Key
配置 Base URL(可选,用于代理或自建服务)
选择默认模型:
- DeepSeek:
deepseek-v4-pro(推荐) - Claude:
claude-sonnet-4-20250514 - GPT:
gpt-5-turbo
- DeepSeek:
配置消息平台(可选):
- Telegram(需要 Bot Token)
- Discord(需要 Bot Token 和 Application ID)
- Slack(需要 OAuth Token)
- 飞书(需要 App ID 和 App Secret)
- ...
配置完成后,所有配置存储在 ~/.hermes/.env 文件中。
4.3 启动 Gateway(消息网关)
hermes gateway
Gateway 启动后,你可以通过配置的消息平台与 Hermes 对话。
生产环境部署建议:
使用 systemd 管理 Hermes Gateway:
# /etc/systemd/system/hermes-gateway.service
[Unit]
Description=Hermes Agent Gateway
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
Environment="PATH=/home/ubuntu/.hermes/hermes-agent/venv/bin:$PATH"
ExecStart=/home/ubuntu/.hermes/hermes-agent/venv/bin/hermes gateway --host 0.0.0.0 --port 8080
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl enable hermes-gateway
sudo systemctl start hermes-gateway
sudo systemctl status hermes-gateway
4.4 实战案例:让 Hermes 帮你调试一个复杂的 Bug
假设你遇到了一个诡异的 Python 内存泄漏问题,传统做法是手动分析、查资料、试各种工具。用 Hermes,你可以这样做:
第一步:描述问题
用户:我的 Python 程序运行几小时后内存占用飙升到 16GB,最终 OOM 被杀。
我用的是 FastAPI + SQLAlchemy + Redis,不知道哪里泄漏了。
能帮我分析一下吗?
第二步:Hermes 自动分析和工具调用
Hermes 会自动:
- 读取你的代码(
file_read) - 运行内存分析工具(
terminal_run,执行py-spy或memory-profiler) - 分析 SQLAlchemy session 管理(
code_analysis) - 检查 Redis 连接池配置(
file_read) - 给出诊断报告和修复方案
第三步:Hermes 自动创建 Skill
任务完成后,Hermes 会发现这个任务涉及 8 次工具调用(足够复杂),于是自动创建 Skill:
---
name: debug_python_memory_leak
description: 调试 Python 程序的内存泄漏问题(FastAPI / SQLAlchemy / Redis)
trigger:
- "Python 内存泄漏"
- "memory leak FastAPI"
- "SQLAlchemy 连接池"
tools: [file_read, terminal_run, code_analysis]
---
# 调试 Python 内存泄漏
## 常见原因
1. SQLAlchemy Session 未正确关闭
2. Redis 连接池配置不当
3. 全局变量累积数据
4. 循环引用(虽然有 GC,但有时不够及时)
## 诊断步骤
### 1. 使用 memory-profiler
```python
from memory_profiler import profile
@profile
def my_func():
# ...
2. 检查 SQLAlchemy Session 管理
# 错误示例
session = Session()
# ... 忘记 close()
# 正确做法
with Session() as session:
# ...
3. 使用 objgraph 查找泄漏对象
import objgraph
objgraph.show_most_common_types(limit=20)
修复方案
...
**第四步:下次遇到类似问题,Hermes 自动召回这个 Skill**
一个月后,你遇到另一个内存泄漏问题。这次你只需要说:
用户:又一个内存泄漏,这次是 Celery 任务里。
Hermes 会自动召回 `debug_python_memory_leak` 这个 Skill,并基于之前的经验快速定位问题。
### 4.5 高级用法:并行子代理
Hermes 支持最多同时运行 **3 个隔离子代理**,适用于复杂任务的并行处理。
示例:你让 Hermes "分析这个代码库的架构并生成文档",它会:
1. 创建子代理 A:负责代码分析(调用 `ripgrep_search`、`file_read` 等工具)
2. 创建子代理 B:负责架构图生成(调用 `diagram_generate` 工具)
3. 创建子代理 C:负责文档编写(调用 `file_write` 工具)
三个子代理并行工作,主代理负责协调和汇总结果。
---
## 五、性能优化:让 Hermes Agent 更快更稳
### 5.1 上下文窗口优化
Hermes 的上下文窗口有限(即使 Claude 的 200K tokens,也需要精心管理)。优化策略:
#### 策略 1:智能截断记忆
```python
def truncate_memories(memories, max_tokens=2000):
"""
智能截断:保留最重要的记忆,而非简单地按时间排序。
"""
# 1. 按相关性打分(LLM 评估)
scored = [(m, llm.score_relevance(m, current_task))
for m in memories]
# 2. 按分数降序排序
scored.sort(key=lambda x: x[1], reverse=True)
# 3. 贪心选择(直到达到 token 预算)
selected = []
total_tokens = 0
for memory, score in scored:
tokens = count_tokens(memory)
if total_tokens + tokens > max_tokens:
break
selected.append(memory)
total_tokens += tokens
return selected
策略 2:上下文压缩
当对话历史过长时,Hermes 会自动触发上下文压缩:
def compress_context(conversation_history):
"""
将旧的消息压缩成摘要,保留最近的 N 条完整消息。
"""
# 保留最近 10 条完整消息
recent_messages = conversation_history[-10:]
# 压缩更早的消息
older_messages = conversation_history[:-10]
summary = llm.summarize(older_messages)
return [{"role": "system", "content": f"Earlier context: {summary}"}] + recent_messages
5.2 工具调用优化
问题:工具调用链过长
有时 Agent 会陷入"工具调用地狱"——为了完成一个简单任务,调用了几十次工具,每次都在消耗 tokens 和等待时间。
解决方案:工具调用预算和提前终止
MAX_TOOL_CALLS = 15 # 单个任务最多 15 次工具调用
def chat(self, user_message):
self.tool_call_count = 0
while has_tool_calls(response):
if self.tool_call_count >= MAX_TOOL_CALLS:
# 提前终止:让 LLM 基于已有信息给出最佳答案
response = self.model.generate(
"You have reached the maximum number of tool calls. "
"Please provide the best answer you can based on the information gathered so far."
)
break
# 正常执行 tool call
tool_results = execute_tool_calls(response)
response = self.model.generate(tool_results)
self.tool_call_count += 1
5.3 记忆检索优化
问题:FTS5 全文检索的误召回
FTS5 基于关键词匹配,可能召回不相关的记忆(比如你搜索 "Rust 并发",它可能召回一篇提到 "Rust" 但讲的是 GUI 编程的记忆)。
解决方案:两阶段检索
def recall_memories(query, top_k=20):
# 第一阶段:FTS5 全文检索(召回候选集)
candidates = fts5_search(query, top_k=top_k)
# 第二阶段:LLM 相关性过滤(精排)
relevant = []
for candidate in candidates:
score = llm.score_relevance(candidate, query)
if score > 0.7: # 相关性阈值
relevant.append((candidate, score))
# 按相关性分数排序
relevant.sort(key=lambda x: x[1], reverse=True)
return [m for m, s in relevant[:5]] # 只返回最相关的 5 条
5.4 模型选择策略
不同任务适合不同模型:
| 任务类型 | 推荐模型 | 原因 |
|---|---|---|
| 简单问答、代码补全 | DeepSeek V4 / GPT-4 Turbo | 速度快、成本低 |
| 复杂推理、架构设计 | Claude Sonnet 4 | 推理能力强 |
| 长文档分析 | Claude Sonnet 4(200K 上下文) | 上下文窗口大 |
| 本地部署、隐私敏感 | Llama 3 / Qwen 3(通过 Ollama) | 数据不出本地 |
Hermes 支持按任务类型自动切换模型(需要配置):
model_routing:
- task_type: simple_qa
model: deepseek-v4-pro
- task_type: complex_reasoning
model: claude-sonnet-4-20250514
- task_type: long_context
model: claude-sonnet-4-20250514
六、与 OpenClaw 的深度对比
Hermes Agent 和 OpenClaw 是 2026 年最热门的两个开源 AI Agent 项目,但它们 design philosophy 完全不同。
6.1 设计理念对比
| 维度 | OpenClaw | Hermes Agent |
|---|---|---|
| 核心定位 | 连接者:把 AI 能力接入各种平台 | 学习者:让 AI 在使用过程中不断进化 |
| 记忆系统 | 静态文件(MEMORY.md 需要手动编写) | 动态系统(自动持久化、FTS5 检索、LLM 摘要) |
| 技能体系 | 人工编写(放在 skills/ 目录) | 自动生成(从任务执行轨迹中提炼) |
| 部署方式 | 本地优先,依赖用户设备 | 服务器优先,支持 $5 VPS、GPU 集群、Serverless |
| 安全机制 | 内置沙盒(Docker 隔离) | 沙盒 + 工具权限控制(更细粒度) |
6.2 使用场景对比
OpenClaw 更适合:
- 你希望 AI 助手运行在自己的设备上(隐私考虑)
- 你需要接入很多平台(Discord、Slack、WhatsApp、微信、飞书...)
- 你愿意手动管理 Agent 的"记忆"和"技能"
Hermes Agent 更适合:
- 你希望 AI 助手"越用越聪明"
- 你的任务足够复杂,值得自动生成技能
- 你需要在服务器端 7×24 小时运行 Agent
- 你希望通过 Telegram 等平台远程与 Agent 交互
6.3 技术架构对比
OpenClaw:
- 基于 TypeScript + Node.js
- 工具定义通过
SKILL.md文件(Markdown 格式) - 记忆系统依赖用户手动编写和维护
- 强调"沙盒安全":所有工具调用都在 Docker 容器内执行
Hermes Agent:
- 基于 Python + Node.js(混合)
- 工具定义通过 Python 函数 + 元数据
- 记忆系统高度自动化(FTS5 + LLM)
- 强调"学习能力":自动生成和优化 Skills
七、总结与展望
7.1 Hermes Agent 的技术价值
Hermes Agent 的核心贡献不在于"它能完成多少任务",而在于它提出了一个新的 Agent 范式:
Agent 不应该只是一个"执行器",而应该是一个"学习者"。
这个范式转移的意义:
- 从开环到闭环:Agent 不仅能完成任务,还能从任务中学习
- 从静态到动态:Agent 的能力不是固定的,而是随时间增长的
- 从通用到个性:Agent 能理解你的偏好、习惯、项目上下文
7.2 当前局限性与未来改进方向
当前局限性:
- Skill 质量依赖 LLM 的抽象能力:有时生成的 Skill 过于具体(无法复用),有时过于抽象(缺乏可操作性)
- 记忆检索的准确率:FTS5 全文检索 + LLM 摘要的组合"足够好",但还不是"完美"
- 计算成本:每次任务都需要多次 LLM 调用(任务执行 + 记忆检索 + 技能创建),成本比传统 Agent 高
未来改进方向:
- 引入强化学习:让 Skill 的创建和优化基于 reward signal(而非仅仅依赖 LLM 的"感觉")
- 向量数据库集成:可选接入 Qdrant / Chroma,实现真正的语义检索
- 多模态记忆:不仅存储文本,还能存储图片、代码截图、架构图
- 分布式部署:支持多个 Hermes 实例共享技能库(类似 p2p 网络)
7.3 对 AI Agent 领域的启示
Hermes Agent 的成功证明了一个重要观点:
AI Agent 的下一个临界点,不是"更强的推理能力",而是"持续学习的能力"。
当所有 Agent 都在用相同的底层模型(GPT-5、Claude Sonnet 4、DeepSeek V4...)时,真正的差异化在于:
- 谁记得你上个月的项目约定?
- 谁能从过去的错误中学习?
- 谁能随着使用时间的增长而变得更聪明?
这不是一个"有或无"的问题,而是一个"程度"的问题。Hermes Agent 迈出了第一步,但前面的路还很长。
附录:快速参考
A. 常用命令速查表
# 初始配置
hermes setup
# 启动 Gateway(消息网关)
hermes gateway
# 查看已创建的 Skills
hermes skills list
# 手动创建一个 Skill
hermes skills create --name "my_skill" --description "..."
# 查看记忆
hermes memories show
# 手动更新记忆
hermes memories update --file MEMORY.md
# 检查系统状态
hermes doctor
# 查看会话历史
hermes sessions list
hermes sessions show <session_id>
B. 配置文件位置
| 文件/目录 | 用途 |
|---|---|
~/.hermes/.env | 环境变量(API Key、模型配置等) |
~/.hermes/config.yaml | 主配置文件(工具权限、模型路由等) |
~/.hermes/memories/MEMORY.md | Agent 的长期记忆 |
~/.hermes/memories/USER.md | 用户画像 |
~/.hermes/skills/ | 自动生成的技能库 |
~/.hermes/sessions/ | 会话历史(SQLite 数据库) |
~/.hermes/logs/ | 日志文件 |
C. 相关资源
- GitHub 仓库:https://github.com/NousResearch/hermes-agent
- Nous Research 官网:https://nousresearch.com
- Honcho 项目:https://github.com/honcho-ai/honcho
- Agent Skills 开放标准:https://agentskills.io
- Discord 社区:https://discord.gg/hermes-agent
本文基于 Hermes Agent 2026 年 5 月版本撰写,具体实现可能随版本演进发生变化。建议以官方文档为准。
字数统计:约 18,500 字