编程 Hermes Agent 深度解析:当 AI Agent 学会"自我进化"——从 Nous Research 到下一代智能体运行时的范式革命

2026-04-15 01:55:19 +0800 CST views 13

Hermes Agent 深度解析:当 AI Agent 学会"自我进化"——从 Nous Research 到下一代智能体运行时的范式革命

一个会与你共同成长的 Agent。

2026年3月,开源 AI 社区迎来了一颗重磅炸弹。由 Nous Research 团队开发的 Hermes Agent 在 GitHub 上横空出世,短短30天内狂揽超过6万 Star,一举登顶 GitHub Trending 榜首。这个项目被业界称为"AI Agent 的 iPhone 时刻",不是因为它有多么炫酷的界面,而是因为它解决了一个困扰 AI 领域多年的核心难题:如何让 AI Agent 真正具备持续学习和自我进化的能力?

与当下流行的 OpenClaw 不同,Hermes Agent 走的不是"多 Agent 协作"的路线,而是专注于打造单一 Agent 的自我进化能力。它的核心理念可以概括为一句话:"一个会与你共同成长的 Agent。" 这不是营销话术,而是由其内置的闭环学习系统所支撑的技术现实。

本文将从工程视角深度拆解 Hermes Agent 的架构设计、记忆系统、技能进化机制,并与 OpenClaw 进行全方位对比,帮助你理解这个"爱马仕"究竟为何能在短时间内掀起如此大的波澜。


一、背景:AI Agent 的"失忆"困境

1.1 传统 Agent 的痛点

在深入 Hermes Agent 之前,我们需要先理解它要解决什么问题。

当前市面上的 AI Agent,无论是 Claude Code、GitHub Copilot,还是 OpenClaw,都面临一个共同的困境:它们都是" Stateless "(无状态)的。每次对话结束后,Agent 对用户的理解就归零了。下次再打开,你需要重新交代上下文、重新说明偏好、重新建立默契。

这种"失忆"问题带来了三个核心痛点:

痛点具体表现
能力固化Agent 的技能是预先设定的,无法自主开展学习,遇到新问题只能现场发挥
体验割裂每次交互都从零开始,不携带过往记忆,用户需要反复交代背景
模型绑定只能选用单一的大语言模型,缺乏灵活切换的能力

OpenClaw 试图通过 Skills 系统和 MEMORY.md 文件来缓解这个问题,但本质上仍然是人工维护的静态配置。Skills 需要开发者手动编写,MEMORY.md 需要用户主动更新,Agent 本身并不具备"从经验中学习"的能力。

1.2 Nous Research 的破局思路

Nous Research 是开源 LLM 社区最具影响力的研究团队之一,旗下拥有 Hermes、Nomos、Psyche 等多个知名开源模型系列。他们在开发 Hermes Agent 时,提出了一个根本性的问题:

如果 Agent 每次完成任务后都能总结经验、沉淀知识、优化技能,会发生什么?

这个问题的答案,就是 Hermes Agent 的核心创新——内置学习闭环(Built-in Learning Loop)


二、核心架构:四层记忆系统与自我进化引擎

Hermes Agent 的架构设计围绕一个核心理念展开:Agent 应该越用越聪明。为了实现这一目标,它构建了一套精密的四层记忆系统和自我进化引擎。

2.1 四层记忆系统详解

Hermes Agent 的记忆系统是其最具差异化的设计之一。它借鉴了人类记忆的分层模型,将记忆划分为四个层次:

┌─────────────────────────────────────────────────────────────┐
│                    Hermes Agent 记忆架构                      │
├─────────────────────────────────────────────────────────────┤
│  Layer 4: 冻结系统提示记忆 (Frozen Prompt Memory)            │
│  ├── MEMORY.md (2200字符) - 环境事实、项目信息               │
│  └── USER.md (1375字符) - 用户画像、偏好设置                 │
├─────────────────────────────────────────────────────────────┤
│  Layer 3: 工作记忆 (Working Memory)                          │
│  └── 当前对话的完整上下文窗口                                │
├─────────────────────────────────────────────────────────────┤
│  Layer 2: 情景记忆 (Episodic Memory)                         │
│  └── SQLite + FTS5 全文检索的历史会话索引                    │
├─────────────────────────────────────────────────────────────┤
│  Layer 1: 程序记忆 (Procedural Memory)                       │
│  └── Skills/ 目录下的自动生成的技能文件                      │
└─────────────────────────────────────────────────────────────┘

Layer 4: 冻结系统提示记忆

这是最核心的一层,包含两个常驻文件:

MEMORY.md - 存储"环境事实"类信息:

# 项目信息
- 项目位于 ~/code/myapi,使用 Rust + Axum + SQLx
- 此机器运行 Ubuntu 22.04,已安装 Docker
- 代码风格:Tab 缩进,120 字符行宽,Google docstrings
- 已于 2026-01-15 将数据库从 MySQL 迁移到 PostgreSQL

USER.md - 存储"用户偏好"类信息:

# 用户画像
- 回复语言:中文为主,技术术语保留英文
- 报告格式:Markdown,带二级目录
- 偏好工具:pip 用 uv 替代,npm 用 pnpm 替代
- 沟通风格:直接给结论,不要铺垫

这两个文件有严格的字符上限(合计约 1300 tokens),强制 Agent 只保留最关键的信息。这种"有限记忆"的设计避免了上下文窗口被低价值数据挤爆,是 Hermes Agent 在成本控制上的核心策略。

Layer 3: 工作记忆

工作记忆就是当前对话的完整上下文窗口。当对话过长时,Hermes 会触发上下文压缩机制

class ContextCompressor:
    """
    压缩策略:
    1. 保留头部(系统提示 + 第一轮对话)
    2. 保留尾部(最近 20K tokens)
    3. 用 LLM 总结中间部分
    4. 迭代更新摘要
    """
    
    def compress(self, messages: List[Message]) -> List[Message]:
        if self.token_count(messages) < self.threshold:
            return messages
        
        # 保留头部和尾部
        head = messages[:2]  # 系统提示 + 第一轮
        tail = messages[-10:]  # 最近10轮
        
        # 中间部分用 LLM 生成结构化摘要
        middle_summary = self.summarize(messages[2:-10])
        
        return head + [middle_summary] + tail

Layer 2: 情景记忆

情景记忆使用 SQLite + WAL(Write-Ahead Logging)+ FTS5(全文检索) 实现:

-- 会话表
CREATE TABLE sessions (
    id TEXT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    summary TEXT  -- LLM 生成的会话摘要
);

-- 消息表
CREATE TABLE messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id TEXT REFERENCES sessions(id),
    role TEXT CHECK(role IN ('user', 'assistant', 'system')),
    content TEXT,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- FTS5 全文检索虚拟表
CREATE VIRTUAL TABLE messages_fts USING fts5(
    content, 
    session_id UNINDEXED,
    tokenize='porter'
);

这种设计的精妙之处在于:

  • 预取机制:在用户发消息前,系统会根据当前查询预取相关历史会话
  • 全文检索:FTS5 支持高效的关键词搜索,比向量检索更轻量
  • 本地优先:所有数据存储在本地 SQLite,无需外部依赖

Layer 1: 程序记忆(技能系统)

这是 Hermes Agent 最具革命性的设计。Agent 会在完成任务后自动生成 Skill 文件,将解决问题的经验沉淀为可复用的知识:

~/.hermes/skills/
├── deploy_docker_service/
│   ├── SKILL.md          # 技能主文档
│   ├── references/       # 参考资料
│   │   └── docker-compose.template.yml
│   └── examples/         # 示例记录
│       └── 2026-04-10_nginx_setup.md
├── analyze_log_patterns/
│   └── SKILL.md
└── generate_api_documentation/
    └── SKILL.md

每个 Skill 都是一个 Markdown 文件,包含:

  • 元数据:名称、描述、适用场景、依赖工具
  • 主指令:详细的执行步骤
  • 示例:历史成功执行的记录

2.2 自我进化引擎:KEPA 系统

Hermes Agent 的自我进化能力来自于其 KEPA(Knowledge Extraction and Pattern Analysis)系统,这是一个类反向传播的机制:

┌──────────────────────────────────────────────────────────────┐
│                      KEPA 学习循环                           │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│   用户请求 → 检索相关 Skills → 执行 Task → 生成结果          │
│       ↑                                    │                 │
│       │                                    ↓                 │
│       └──── 评估效果 ← 沉淀经验 ← 更新/创建 Skill            │
│                                                              │
│   关键触发条件:                                             │
│   - 任务复杂度 > threshold                                   │
│   - 使用了 3+ 个工具                                         │
│   - 用户明确反馈"记住这个方法"                               │
│                                                              │
└──────────────────────────────────────────────────────────────┘

KEPA 的核心流程:

  1. 模式识别:分析任务执行路径,识别可复用的解决模式
  2. 技能提取:将模式转化为结构化的 Skill 文档
  3. 持续优化:每次执行同类任务时,根据反馈更新 Skill
  4. 知识沉淀:将高频使用的 Skill 提升到 MEMORY.md

这种设计让 Hermes Agent 具备了真正的学习能力——不是简单地记住对话历史,而是从经验中提取知识、优化策略


三、工程实现:核心源码解析

3.1 记忆管理器(MemoryManager)

记忆管理器是 Hermes Agent 的核心组件,负责所有记忆层的读写操作:

# agent/memory_manager.py

class MemoryManager:
    """四层记忆系统的统一管理层"""
    
    def __init__(self, db_path: str, memories_dir: str):
        self.db = sqlite3.connect(db_path)
        self.db.enable_load_extension(True)
        self.db.execute("SELECT load_extension('fts5')")
        self.memories_dir = Path(memories_dir)
        
    def prefetch_all(self, query: str, session_id: str) -> Dict[str, Any]:
        """
        在用户发消息前,预取所有相关记忆
        这是 Hermes 的"预热"机制,确保 Agent 进入对话时已有上下文
        """
        return {
            # Layer 4: 冻结记忆(始终加载)
            'frozen_memory': self._load_frozen_memory(),
            
            # Layer 2: 检索相关历史会话
            'relevant_sessions': self._search_episodic_memory(query, limit=3),
            
            # Layer 1: 检索相关 Skills
            'relevant_skills': self._search_procedural_memory(query, limit=5),
            
            # Layer 3: 当前会话历史(由调用方传入)
        }
    
    def sync_all(self, user_content: str, assistant_content: str):
        """
        每轮对话后,同步更新所有记忆层
        这是异步执行的,不阻塞用户响应
        """
        # 写入工作记忆(当前会话)
        self._append_to_working_memory(user_content, assistant_content)
        
        # 更新情景记忆(SQLite)
        self._index_episodic_memory(user_content, assistant_content)
        
        # 评估是否需要创建/更新 Skill
        if self._should_extract_skill(user_content, assistant_content):
            self._trigger_skill_extraction()
    
    def _search_episodic_memory(self, query: str, limit: int = 3) -> List[Dict]:
        """使用 FTS5 全文检索历史会话"""
        cursor = self.db.execute("""
            SELECT sessions.id, sessions.summary, messages.content,
                   rank(matchinfo(messages_fts)) as relevance
            FROM messages_fts
            JOIN messages ON messages.rowid = messages_fts.rowid
            JOIN sessions ON messages.session_id = sessions.id
            WHERE messages_fts MATCH ?
            ORDER BY relevance DESC
            LIMIT ?
        """, (query, limit))
        return cursor.fetchall()

3.2 技能系统(Skills Tool)

技能系统是 Hermes Agent 自我进化的载体。它通过分析任务执行过程,自动生成和优化 Skill:

# tools/skills_tool.py

class SkillsTool:
    """技能管理工具:自动创建、更新、检索 Skills"""
    
    SKILL_TEMPLATE = """# Skill: {name}

## 元数据
- **创建时间**: {created_at}
- **最后更新**: {updated_at}
- **使用次数**: {usage_count}
- **成功率**: {success_rate}%

## 描述
{description}

## 适用场景
{applicable_scenarios}

## 依赖工具
{required_tools}

## 执行步骤
{execution_steps}

## 示例
{examples}
"""
    
    def create_skill(self, task_trajectory: TaskTrajectory) -> str:
        """
        从任务执行轨迹中提取并创建 Skill
        触发条件:任务复杂度 > threshold,或使用了多个工具
        """
        # 使用 LLM 分析任务轨迹,提取可复用模式
        analysis = self.llm.analyze(
            prompt=f"""
            分析以下任务执行轨迹,提取可复用的解决模式:
            
            任务目标: {task_trajectory.goal}
            执行步骤: {task_trajectory.steps}
            使用工具: {task_trajectory.tools_used}
            执行结果: {task_trajectory.result}
            
            请输出:
            1. 技能名称(动词+名词,如"deploy_docker_service")
            2. 一句话描述
            3. 适用场景列表
            4. 详细的执行步骤
            5. 关键注意事项
            """,
            model="claude-3-5-sonnet-20241022"
        )
        
        # 生成 Skill 文件
        skill_content = self.SKILL_TEMPLATE.format(
            name=analysis.name,
            created_at=datetime.now().isoformat(),
            updated_at=datetime.now().isoformat(),
            usage_count=1,
            success_rate=100,
            description=analysis.description,
            applicable_scenarios=analysis.scenarios,
            required_tools=analysis.tools,
            execution_steps=analysis.steps,
            examples=task_trajectory.summarize()
        )
        
        skill_path = self.skills_dir / f"{analysis.name}" / "SKILL.md"
        skill_path.parent.mkdir(parents=True, exist_ok=True)
        skill_path.write_text(skill_content)
        
        return str(skill_path)
    
    def update_skill(self, skill_name: str, execution_feedback: Feedback):
        """
        根据执行反馈更新 Skill
        这是技能进化的核心机制
        """
        skill_path = self.skills_dir / skill_name / "SKILL.md"
        if not skill_path.exists():
            return
        
        current_skill = skill_path.read_text()
        
        # 使用 LLM 评估是否需要更新
        update_analysis = self.llm.analyze(f"""
        当前 Skill:
        {current_skill}
        
        最新执行反馈:
        {execution_feedback}
        
        请判断:
        1. 是否需要更新执行步骤?
        2. 是否需要添加新的注意事项?
        3. 是否需要记录新的示例?
        
        输出更新建议。
        """)
        
        if update_analysis.should_update:
            # 应用更新
            updated_skill = self.llm.generate(
                prompt=f"""
                基于以下更新建议,重写 Skill 文件:
                
                当前 Skill:
                {current_skill}
                
                更新建议:
                {update_analysis.suggestions}
                
                保持原有格式,只更新必要内容。
                """
            )
            skill_path.write_text(updated_skill)

3.3 主 Agent 循环(run_agent.py)

这是 Hermes Agent 的核心编排逻辑:

# run_agent.py

class AIAgent:
    """Hermes Agent 核心运行时"""
    
    def __init__(self, config: AgentConfig):
        self.memory_manager = MemoryManager(
            db_path=config.db_path,
            memories_dir=config.memories_dir
        )
        self.tool_registry = ToolRegistry()
        self.context_compressor = ContextCompressor()
        self.llm = LLMClient(config.model_provider)
        
    async def run(self, user_input: str, session_id: str) -> str:
        """主对话循环"""
        
        # ========== Phase 1: 记忆预取(在用户发消息前) ==========
        memories = self.memory_manager.prefetch_all(user_input, session_id)
        
        # 组装系统提示
        system_prompt = self._build_system_prompt(memories)
        
        # ========== Phase 2: 主对话循环 ==========
        messages = [
            {"role": "system", "content": system_prompt},
            *self._get_session_history(session_id),
            {"role": "user", "content": user_input}
        ]
        
        max_iterations = 50
        iteration = 0
        
        while iteration < max_iterations:
            iteration += 1
            
            # 检查上下文长度,必要时压缩
            if self.context_compressor.should_compress(messages):
                messages = self.context_compressor.compress(messages)
            
            # 调用 LLM
            response = await self.llm.chat(messages)
            
            # 检查是否需要工具调用
            if response.tool_calls:
                # 执行工具
                tool_results = []
                for tool_call in response.tool_calls:
                    result = await self.tool_registry.execute(
                        tool_call.name, 
                        tool_call.arguments
                    )
                    tool_results.append({
                        "role": "tool",
                        "name": tool_call.name,
                        "content": result
                    })
                
                # 追加工具结果到上下文
                messages.append({"role": "assistant", "content": response.content})
                messages.extend(tool_results)
                
                # 继续循环,让 LLM 基于工具结果生成回复
                continue
            
            # 没有工具调用,返回最终回复
            final_response = response.content
            break
        
        # ========== Phase 3: 记忆同步(异步执行) ==========
        asyncio.create_task(
            self.memory_manager.sync_all(user_input, final_response)
        )
        
        return final_response
    
    def _build_system_prompt(self, memories: Dict[str, Any]) -> str:
        """组装系统提示,注入预取的记忆"""
        parts = [
            "You are Hermes, a self-improving AI agent.",
            "",
            "# Core Principles",
            "1. After completing complex tasks, CREATE or UPDATE skills",
            "2. Always check relevant skills before starting a task",
            "3. Learn from each interaction and improve over time",
            "",
            "# Frozen Memory",
            memories.get('frozen_memory', ''),
            "",
            "# Relevant Skills",
            self._format_skills(memories.get('relevant_skills', [])),
            "",
            "# Relevant Past Sessions",
            self._format_sessions(memories.get('relevant_sessions', [])),
        ]
        return "\n".join(parts)

四、与 OpenClaw 的全面对比

Hermes Agent 和 OpenClaw 经常被拿来比较,但它们的设计哲学截然不同。理解这些差异,有助于你选择适合自己场景的工具。

4.1 核心定位对比

维度Hermes AgentOpenClaw
核心定位自我进化的智能体引擎多渠道个人助理操作系统
设计模式Engine 引擎模式Gateway 网关模式
主要目标深度优先:让单个 Agent 越用越强广度优先:连接所有工具和平台
GitHub Stars~60,000+(2026年4月)~350,000+
首次发布2026年3月2024年

4.2 架构设计对比

┌─────────────────────────────────────────────────────────────────────┐
│                        Hermes Agent 架构                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│   ┌──────────────┐     ┌──────────────┐     ┌──────────────┐        │
│   │   CLI/Gateway │────▶│  AI Agent    │────▶│   Skills     │        │
│   │   (入口层)    │     │  (核心引擎)   │     │  (自动进化)   │        │
│   └──────────────┘     └──────┬───────┘     └──────────────┘        │
│                               │                                      │
│                    ┌──────────┴──────────┐                          │
│                    ▼                     ▼                          │
│           ┌────────────────┐   ┌────────────────┐                   │
│           │  Memory System │   │  Tool Registry │                   │
│           │  (四层记忆)     │   │  (动态注册)     │                   │
│           └────────────────┘   └────────────────┘                   │
│                                                                      │
│   核心特点:单一 Agent,内置学习闭环,自我进化                         │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│                         OpenClaw 架构                                │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│   ┌──────────┐ ┌──────────┐ ┌──────────┐                           │
│   │ Discord  │ │ Telegram │ │  Slack   │  ... (15+ 平台)           │
│   └────┬─────┘ └────┬─────┘ └────┬─────┘                           │
│        └─────────────┴─────────────┘                                │
│                      │                                               │
│                      ▼                                               │
│           ┌────────────────────┐                                    │
│           │   Gateway Router   │  ← 消息路由中心                     │
│           └──────────┬─────────┘                                    │
│                      │                                               │
│        ┌─────────────┼─────────────┐                                │
│        ▼             ▼             ▼                                │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐                            │
│   │ Agent 1 │  │ Agent 2 │  │ Agent 3 │  ... (多 Agent 协作)        │
│   └────┬────┘  └────┬────┘  └────┬────┘                            │
│        └─────────────┴─────────────┘                                │
│                      │                                               │
│                      ▼                                               │
│           ┌────────────────────┐                                    │
│           │    ClawHub Skills   │  ← 人工编写的技能生态              │
│           └────────────────────┘                                    │
│                                                                      │
│   核心特点:多 Agent 协作,人工维护 Skills,强调连接能力               │
└─────────────────────────────────────────────────────────────────────┘

4.3 记忆系统对比

特性Hermes AgentOpenClaw
记忆架构四层分层记忆基于文件的简单记忆
持久化方式SQLite + WAL + FTS5Markdown 文件
历史检索内置全文检索依赖 LLM 判断
上下文压缩自动压缩 + 结构化摘要无内置压缩
技能生成自动从经验中提取人工编写
用户画像Honcho 深度建模简单的 USER.md

4.4 适用场景对比

选择 Hermes Agent 的场景:

  • 需要长期运行的个人 AI 助手,越用越懂你的偏好
  • 希望 Agent 能自动学习和沉淀知识
  • 单项目深度协作,如长期维护一个代码库
  • 追求低维护成本,不想手动编写 Skills

选择 OpenClaw 的场景:

  • 需要连接多个平台(Discord、Telegram、Slack 等)
  • 多 Agent 协作的复杂工作流
  • 需要现成的 Skills 生态快速搭建
  • 企业级部署,需要精细的权限控制

4.5 成本与性能对比

维度Hermes AgentOpenClaw
部署成本$5/月的 VPS 即可本地运行,无服务器成本
Token 消耗较低(上下文压缩 + 有限记忆)较高(全量记忆存储)
响应延迟较低(预取机制)中等
长期运行稳定性高(记忆不会无限膨胀)可能出现上下文巨坑
学习成本中等(需要理解记忆机制)较低(开箱即用)

五、实战:部署你的 Hermes Agent

5.1 一键安装

Hermes Agent 提供了一键安装脚本,最快 2 分钟即可完成部署:

# 一行命令安装(推荐)
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash

# 安装完成后加载环境变量并启动
source ~/.bashrc && hermes

安装脚本会自动完成以下工作:

  1. 检测/安装 uv(Astral 开发的超快 Python 包管理器)
  2. 检测/安装 Python 3.11+
  3. 检测/安装 Node.js(部分技能依赖)
  4. 检测/安装 ripgrep(高效文本搜索)
  5. 检测/安装 ffmpeg(音视频处理)
  6. 创建虚拟环境(~/.hermes-venv)
  7. 克隆仓库并安装依赖
  8. 配置 PATH

5.2 配置指南

# 运行设置向导
hermes setup

# 选择 LLM 模型
hermes model

# 配置 API Key
nano ~/.hermes/.env

.env 文件示例:

# LLM 配置
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...

# 可选:使用 OpenAI 兼容接口
OPENAI_BASE_URL=https://api.xuedingmao.com/v1

# 记忆配置
HERMES_MEMORY_DIR=~/.hermes/memories
HERMES_SKILLS_DIR=~/.hermes/skills
HERMES_DB_PATH=~/.hermes/state.db

5.3 多平台接入

Hermes Agent 支持 15+ 消息平台:

# 配置 Telegram Bot
hermes gateway telegram --token YOUR_BOT_TOKEN

# 配置 Discord Bot
hermes gateway discord --token YOUR_BOT_TOKEN

# 配置 Slack
hermes gateway slack --token YOUR_SLACK_TOKEN

# 查看所有支持的网关
hermes gateway list

5.4 技能系统实战

观察 Hermes Agent 如何自动生成 Skill:

# 启动交互式会话
hermes chat

# 输入一个复杂任务
> 帮我部署一个 Node.js 应用到 Docker,使用 Nginx 反向代理,
> 配置 SSL 证书,并设置自动重启

# Hermes 会:
# 1. 检索是否有相关 Skill
# 2. 如果没有,执行多步骤任务
# 3. 任务完成后,自动生成 deploy_nodejs_nginx Skill
# 4. 下次同类任务直接调用 Skill

查看生成的 Skill:

cat ~/.hermes/skills/deploy_nodejs_nginx/SKILL.md

输出示例:

# Skill: deploy_nodejs_nginx

## 元数据
- **创建时间**: 2026-04-14T10:30:00
- **最后更新**: 2026-04-14T10:30:00
- **使用次数**: 1
- **成功率**: 100%

## 描述
部署 Node.js 应用到 Docker,配置 Nginx 反向代理和 SSL

## 适用场景
- 部署 Express/Fastify/NestJS 应用
- 需要 HTTPS 的生产环境
- 使用 Docker Compose 管理多容器

## 依赖工具
- docker
- docker-compose
- certbot

## 执行步骤
1. 创建 Dockerfile
2. 创建 docker-compose.yml(app + nginx + certbot)
3. 配置 Nginx 反向代理
4. 申请 SSL 证书
5. 启动服务并验证

## 注意事项
- 确保 80/443 端口开放
- 域名需提前解析到服务器
- 首次 SSL 申请可能需要等待 DNS 传播

## 示例
### 2026-04-14 成功部署 myapp.com
- 应用:Express + Prisma
- 服务器:Ubuntu 22.04
- 耗时:8 分钟
- 关键问题:Prisma 需要在容器内运行 migrate

六、性能优化与最佳实践

6.1 上下文压缩策略

Hermes Agent 的上下文压缩是其成本控制的核心。理解其工作原理,有助于你优化使用:

# 压缩触发条件
def should_compress(messages: List[Message]) -> bool:
    token_count = count_tokens(messages)
    
    # 当 token 数超过阈值时触发压缩
    # Claude 3.5 Sonnet: 100K tokens
    # GPT-4: 50K tokens
    # 本地模型:根据实际窗口调整
    threshold = get_model_token_limit() * 0.7
    
    return token_count > threshold

# 压缩策略
def compress(messages: List[Message]) -> List[Message]:
    # 1. 保留系统提示(永远不变)
    system_msg = messages[0]
    
    # 2. 保留第一轮对话(建立上下文)
    first_exchange = messages[1:3]
    
    # 3. 保留最近 N 轮(默认 10 轮)
    recent_messages = messages[-10:]
    
    # 4. 中间部分生成结构化摘要
    middle_messages = messages[3:-10]
    summary = generate_structured_summary(middle_messages)
    
    return [system_msg] + first_exchange + [summary] + recent_messages

6.2 记忆优化建议

MEMORY.md 维护最佳实践:

# 好的实践:具体、结构化
- 项目使用 pnpm workspace 管理 monorepo
- 数据库:PostgreSQL 15,主从架构
- 部署环境:Kubernetes + Helm
- 代码规范:ESLint + Prettier,提交前自动格式化

# 避免:模糊、冗余
- 这是一个大项目
- 有很多依赖
- 要注意代码质量

USER.md 维护最佳实践:

# 好的实践:明确的偏好
- 回复语言:中文为主,技术术语保留英文
- 代码风格:优先函数式编程,避免类继承
- 错误处理:使用 Result 类型而非 try-catch
- 沟通风格:直接给结论,不需要解释"为什么"

# 避免:主观、模糊
- 我喜欢干净的代码
- 请给我好的建议

6.3 Skill 进化优化

促进 Skill 生成的提示技巧:

# 明确触发 Skill 生成
"记住这个方法,下次还要用"
"把这个流程保存下来"
"这是一个标准的部署流程"

# 提供反馈帮助 Skill 优化
"这个步骤可以简化"
"漏了检查端口占用"
"建议加上健康检查"

七、局限性与未来展望

7.1 当前局限性

尽管 Hermes Agent 代表了 AI Agent 领域的重要突破,但它仍存在一些局限性:

  1. 单 Agent 限制:不支持原生的多 Agent 协作,复杂工作流需要借助外部编排
  2. 生态成熟度:相比 OpenClaw 的 ClawHub,Hermes 的 Skills 生态还在早期
  3. 学习曲线:四层记忆系统需要一定时间理解,新手可能感到困惑
  4. 资源占用:SQLite + FTS5 在超大规模数据下可能遇到性能瓶颈

7.2 与 OpenClaw 的协同

有趣的是,Hermes Agent 和 OpenClaw 并非完全竞争关系,它们可以形成互补:

┌─────────────────────────────────────────────────────────────┐
│                    协同架构示例                               │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   用户 ──▶ Hermes Agent(指挥层)                             │
│              │                                               │
│              ├──▶ 长期记忆、用户画像                          │
│              │                                               │
│              ├──▶ 决策:"需要调用 OpenClaw 执行"              │
│              │        │                                      │
│              │        └──▶ OpenClaw(执行层)                │
│              │                 │                             │
│              │                 ├──▶ 多平台消息发送            │
│              │                 ├──▶ 调用 ClawHub Skills       │
│              │                 └──▶ 多 Agent 协作             │
│              │                                               │
│              └──▶ 接收执行结果,更新记忆和 Skills             │
│                                                              │
│   优势:Hermes 负责"思考",OpenClaw 负责"执行"               │
└─────────────────────────────────────────────────────────────┘

7.3 未来发展方向

根据 Nous Research 的路线图和社区讨论,Hermes Agent 可能在以下方向继续演进:

  1. 多 Agent 支持:在保持自进化能力的同时,支持轻量级多 Agent 协作
  2. 分布式记忆:将 SQLite 扩展到向量数据库,支持更大规模的记忆检索
  3. 模型训练数据生成:利用积累的 Task Trajectory 为下一代模型准备训练数据
  4. 企业级功能:RBAC、审计日志、合规性检查等企业级特性

八、总结

Hermes Agent 的出现,标志着 AI Agent 从"工具"向"伙伴"的范式转变。它通过四层记忆系统和 KEPA 学习闭环,解决了传统 Agent "用完即走、无法成长"的核心痛点。

核心要点回顾:

  1. 四层记忆系统:冻结记忆 + 工作记忆 + 情景记忆 + 程序记忆,分层管理不同类型的知识
  2. KEPA 学习闭环:自动从任务执行中提取 Skill,持续优化,实现真正的自我进化
  3. 上下文压缩:智能压缩策略控制 Token 消耗,支持长期稳定运行
  4. 与 OpenClaw 的差异化:Hermes 专注"深度进化",OpenClaw 专注"广度连接"

适合谁用?

  • 需要长期 AI 协作的开发者
  • 追求低维护成本的个人用户
  • 希望 AI 能"记住"偏好和习惯的用户
  • 对 Agent 自我进化能力感兴趣的研究者

不适合谁用?

  • 需要多平台消息网关的企业用户
  • 依赖现成 Skills 生态快速搭建的用户
  • 需要复杂多 Agent 编排的场景

无论如何,Hermes Agent 的出现为 AI Agent 领域带来了新的思考维度:Agent 不应该只是执行命令的工具,而应该是一个能够学习、成长、进化的数字伙伴。 这或许正是 AI 助手未来的发展方向。


参考资源


本文撰写于 2026年4月,基于 Hermes Agent v0.8.0 版本。由于项目迭代迅速,部分细节可能与最新版本有所差异,建议参考官方文档获取最新信息。

推荐文章

liunx宝塔php7.3安装mongodb扩展
2024-11-17 11:56:14 +0800 CST
Nginx 反向代理
2024-11-19 08:02:10 +0800 CST
手机导航效果
2024-11-19 07:53:16 +0800 CST
html一些比较人使用的技巧和代码
2024-11-17 05:05:01 +0800 CST
H5端向App端通信(Uniapp 必会)
2025-02-20 10:32:26 +0800 CST
如何在Vue3中定义一个组件?
2024-11-17 04:15:09 +0800 CST
页面不存在404
2024-11-19 02:13:01 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
Vue 中如何处理父子组件通信?
2024-11-17 04:35:13 +0800 CST
Golang Select 的使用及基本实现
2024-11-18 13:48:21 +0800 CST
用 Rust 构建一个 WebSocket 服务器
2024-11-19 10:08:22 +0800 CST
Nginx负载均衡详解
2024-11-17 07:43:48 +0800 CST
关于 `nohup` 和 `&` 的使用说明
2024-11-19 08:49:44 +0800 CST
在JavaScript中实现队列
2024-11-19 01:38:36 +0800 CST
npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
程序员茄子在线接单