编程 Hermes Agent 深度实战:Nous Research 开源自进化 AI Agent——从闭环学习到生产级部署的完整指南

2026-05-23 13:15:28 +0800 CST views 9

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 的记忆系统面临三个核心挑战:

  1. 上下文窗口限制:LLM 的上下文窗口有限(即使 200K tokens,也不可能无限积累)
  2. 检索效率问题:记忆存储容易,但如何在需要时精准召回是难题
  3. 经验抽象困难:原始对话记录不等于可复用的经验,需要某种形式的"反思"和"提炼"

现有的解决方案各有局限:

  • 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 会自动触发技能创建流程:

  1. 分析任务执行轨迹(哪些工具被调用、调用顺序、参数、结果)
  2. 提取可复用的操作步骤
  3. 生成标准化 Skill 文件(YAML 前置元数据 + Markdown 正文)
  4. 存储到 ~/.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 的系统提示词是动态构建的,而非静态模板。核心组件:

  1. 基础角色定义:你是 Hermes,一个自进化的 AI Agent...
  2. 记忆注入:从 FTS5 检索到的相关记忆(智能截断,防止超出上下文窗口)
  3. 技能注入:与当前任务相关的 Skills(同样需要智能截断)
  4. 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 的选择有其工程考量:

  1. 零依赖:FTS5 是 SQLite 内置扩展,不需要额外的服务进程
  2. 低延迟:本地全文检索,毫秒级响应
  3. 足够好:对于"记忆召回"这个场景,关键词 + 短语匹配已经足够;真正的语义相似度由 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万次)
纯 Python2.3s
NumPy 向量化0.15s
Numba JIT0.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

安装脚本会自动处理所有依赖:

  1. 检测/安装 Python 3.11+
  2. 检测/安装 Node.js v22(浏览器自动化和微信桥接需要)
  3. 检测/安装 ripgrep(高速文件搜索)
  4. 检测/安装 ffmpeg(音视频处理)
  5. 创建独立的 Python 虚拟环境(位于 ~/.hermes/hermes-agent/venv
  6. 克隆代码仓库
  7. 安装所有依赖包
  8. 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

会进入交互式配置向导:

  1. 选择模型提供商

    • DeepSeek(推荐,性价比高)
    • Anthropic Claude
    • OpenAI GPT
    • 本地模型(通过 Ollama 或 vLLM)
  2. 输入 API Key

  3. 配置 Base URL(可选,用于代理或自建服务)

  4. 选择默认模型

    • DeepSeek:deepseek-v4-pro(推荐)
    • Claude:claude-sonnet-4-20250514
    • GPT:gpt-5-turbo
  5. 配置消息平台(可选):

    • 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 会自动:

  1. 读取你的代码(file_read
  2. 运行内存分析工具(terminal_run,执行 py-spymemory-profiler
  3. 分析 SQLAlchemy session 管理(code_analysis
  4. 检查 Redis 连接池配置(file_read
  5. 给出诊断报告和修复方案

第三步: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 设计理念对比

维度OpenClawHermes 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 不应该只是一个"执行器",而应该是一个"学习者"。

这个范式转移的意义:

  1. 从开环到闭环:Agent 不仅能完成任务,还能从任务中学习
  2. 从静态到动态:Agent 的能力不是固定的,而是随时间增长的
  3. 从通用到个性:Agent 能理解你的偏好、习惯、项目上下文

7.2 当前局限性与未来改进方向

当前局限性

  1. Skill 质量依赖 LLM 的抽象能力:有时生成的 Skill 过于具体(无法复用),有时过于抽象(缺乏可操作性)
  2. 记忆检索的准确率:FTS5 全文检索 + LLM 摘要的组合"足够好",但还不是"完美"
  3. 计算成本:每次任务都需要多次 LLM 调用(任务执行 + 记忆检索 + 技能创建),成本比传统 Agent 高

未来改进方向

  1. 引入强化学习:让 Skill 的创建和优化基于 reward signal(而非仅仅依赖 LLM 的"感觉")
  2. 向量数据库集成:可选接入 Qdrant / Chroma,实现真正的语义检索
  3. 多模态记忆:不仅存储文本,还能存储图片、代码截图、架构图
  4. 分布式部署:支持多个 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.mdAgent 的长期记忆
~/.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 字

复制全文 生成海报 AI Agent 自进化 Nous Research Python LLM

推荐文章

设置mysql支持emoji表情
2024-11-17 04:59:45 +0800 CST
如何实现生产环境代码加密
2024-11-18 14:19:35 +0800 CST
程序员茄子在线接单