编程 Hermes Agent 深度解析:拆解自进化 AI Agent 的完整工程架构,从源码到生产部署

2026-07-21 11:44:46 +0800 CST views 13

Hermes Agent 深度解析:拆解自进化 AI Agent 的完整工程架构,从源码到生产部署

前言:为什么 Hermes Agent 是 2026 年最值得关注的开源 Agent 项目

2026 年 2 月,Nous Research 发布了一个开源 AI Agent 项目,GitHub Star 数在短短两个月内从零冲到 11 万,至今已超过 15 万,成为仅次于 OpenClaw 的最受关注开源 Agent 框架。这个项目叫 Hermes Agent

但真正让它与所有竞品拉开差距的,不是 Star 数,而是一个设计目标:"The self-improving AI agent"——会自我进化的 AI Agent

这意味着什么?意味着它不是一个"调用一次、执行一次、然后失忆"的工具,而是一个能从经验中创建技能、在使用中优化技能、自主决定记住什么、跨会话建立用户画像的智能体。你用它越多,它就越懂你,越能帮你做更多事。

本文将深入拆解 Hermes Agent 的完整工程架构,包括:

  • 闭环学习系统的源码级实现原理
  • 四层记忆体系的设计权衡
  • 技能自创建与自改进的具体机制
  • 200+ 模型接入与多平台集成的架构设计
  • 从源码编译到生产部署的完整实战

无论你是想理解现代 AI Agent 的架构设计,还是想在自己的项目中借鉴"自进化"机制,这篇文章都会给你足够的参考。


一、项目全貌:目录结构与核心模块

1.1 数据一览

在深入代码之前,先看一组硬数据:

指标数据
GitHub Stars150,000+
Forks15,000+
代码规模~30,000 行 Python(不含网站和测试)
支持模型200+(OpenAI、Anthropic、DeepSeek、千问等)
终端后端7 种(本地 CLI、Docker、SSH、Modal 等)
消息平台6+(Telegram、Discord、Slack、微信等)
内置技能40+
协议MIT

1.2 目录结构

hermes-agent/
├── agent/                    # 核心 Agent 逻辑(~80 个模块)
│   ├── conversation_loop.py  # 对话主循环(3900行,全项目最大)
│   ├── agent_init.py         # AIAgent.__init__ 实现
│   ├── context_engine.py     # 上下文引擎抽象基类
│   ├── context_compressor.py # 默认压缩实现(LLM 摘要)
│   ├── memory_engine.py      # 记忆引擎
│   ├── skill_engine.py       # 技能引擎
│   └── ...
├── skills/                  # 内置技能(40+)
├── honcho/                  # Honcho 协议实现(用户建模)
├── tools/                   # 工具集(文件系统、Git、Shell 等)
├── profiles/                # 多配置文件支持
├── platforms/               # 多平台接入(Telegram、Discord 等)
├── models/                  # 模型接入层
├── storage/                 # SQLite + FTS5 存储
├── scripts/                 # 安装脚本
└── website/                 # 官网(文档、演示)

关键观察:整个项目围绕三个核心系统展开:记忆系统(Memory)技能系统(Skill)工具系统(Tools)。理解了这三个系统的交互逻辑,就理解了整个 Hermes Agent 的设计哲学。


二、闭环学习系统:自进化的核心引擎

2.1 什么是闭环学习?

大多数 AI Agent 的工作流程是:接收指令 → 执行任务 → 返回结果 → 结束。如果下次需要做类似的任务,Agent 需要从零开始理解上下文。

Hermes Agent 的设计哲学完全不同。它的核心是一个闭环学习循环

完成任务
  ↓
策划记忆(决定记住什么)
  ↓
创建 Skill(将经验提炼为可复用文件)
  ↓
Skill 自改进(在使用中优化已有技能)
  ↓
FTS5 召回(按需检索历史经验)
  ↓
用户建模(构建个性化画像)
  ↓
(循环回到"完成任务")

这个循环对应认知科学中的三种记忆类型:

  • 情景记忆(Episodic Memory):会话历史 → 存储在 SQLite 中
  • 语义记忆(Semantic Memory):持久事实 → 存储在 MEMORY.md 中
  • 程序性记忆(Procedural Memory):技能流程 → 存储在 .skills/ 目录的 SKILL.md 文件中

2.2 技能自创建:源码级解析

技能创建(Skill Creation)是闭环学习的第一步。当 Agent 完成一个复杂任务(涉及 5 个以上工具调用)后,会触发技能创建流程。

关键源码逻辑(简化版):

# agent/skill_engine.py

class SkillEngine:
    def should_create_skill(self, task_history: list[ToolCall]) -> bool:
        """判断是否值得创建技能"""
        if len(task_history) < 5:
            return False  # 简单任务不值得创建技能
        
        # 检查是否与已有技能重复
        for skill in self.list_skills():
            if self._is_similar(task_history, skill.pattern):
                return False
        
        # 检查是否是值得记录的非平凡工作流
        return task_history.has_unseen_pattern()
    
    def create_skill(self, task_history: list[ToolCall]) -> Skill:
        """从任务历史中提炼技能"""
        # 1. 提取核心工作流模式
        workflow = self._extract_workflow(task_history)
        
        # 2. LLM 总结:生成技能描述、触发条件、使用说明
        summary = self.llm.summarize(
            f"从以下工具调用历史中提炼出一个可复用的技能:\n{task_history}"
        )
        
        # 3. 生成 SKILL.md 文件
        skill_md = self._generate_skill_markdown(workflow, summary)
        
        # 4. 保存到 skills/ 目录
        skill_path = self._save_skill(skill_md)
        
        # 5. 注册到技能索引(支持 FTS5 搜索)
        self.index_skill(skill_path, summary)
        
        return Skill(path=skill_path)
    
    def _generate_skill_markdown(self, workflow, summary) -> str:
        """生成标准格式的 SKILL.md"""
        return f"""# {summary.name}

## 描述
{summary.description}

## 触发条件
{summary.trigger_condition}

## 工作流
{workflow.description}

## 关键步骤
{workflow.steps_markdown}

## 注意事项
{summary.caveats}

## 成功指标
{summary.success_criteria}
"""

生成的技能文件是标准 Markdown 格式,可以直接用文本编辑器查看和修改:

# GitHub PR 自动化审查

## 描述
自动审查 GitHub Pull Request,分析代码变更并给出质量评估。

## 触发条件
用户提到 "review PR" 或 "审查 PR"

## 工作流
1. 使用 gh CLI 获取 PR 详情
2. 调用 code_review skill 分析变更
3. 汇总审查意见并格式化输出
4. 附上相关代码片段链接

## 关键步骤
- gh pr view {pr_url} --json title,body,files
- 过滤新增行数 > 20 的文件
- 按文件类型分组(测试 / 业务 / 配置)
- 生成增量 diff 并分析

## 注意事项
- 仅分析 diff,不克隆整个仓库
- 安全相关的变更需要额外审查
- 避免评论过多导致 PR 混乱(上限 20 条)

2.3 技能自改进:patch 机制

创建出来的技能不是一成不变的。Agent 在后续调用技能时,如果发现执行失败或效果不佳,会自动触发自改进机制

关键设计:用 patch 而不是全量重写。这个选择非常务实——patch 的 token 消耗远低于全量重写,且更容易追溯修改历史。

# agent/skill_optimizer.py

class SkillOptimizer:
    def optimize_skill(self, skill: Skill, failure: ExecutionFailure) -> None:
        """分析失败原因,对技能进行增量优化"""
        
        # 1. 分析失败原因
        cause = self._analyze_failure(failure)
        
        # 2. 生成 patch 建议
        patch = self.llm.generate_patch(
            current_skill=skill.content,
            failure_cause=cause,
            context=failure.execution_context
        )
        
        # 3. 验证 patch 的有效性
        if self._validate_patch(skill, patch):
            # 4. 以追加方式写入(保留历史版本)
            self._apply_patch(skill, patch)
        else:
            # 5. patch 无效则回退,触发全量重写
            self._regenerate_skill(skill, failure)
    
    def _validate_patch(self, skill: Skill, patch: Patch) -> bool:
        """验证 patch 不会破坏技能的完整性"""
        # 检查:patch 不会删除关键步骤
        # 检查:patch 的 LLM 总结是否与原技能一致
        # 检查:patch 后的技能在测试用例上能否通过
        ...

为什么 patch 机制比全量重写更好?

  1. Token 效率:patch 通常只有 200-500 tokens,全量重写可能需要 2000+ tokens
  2. 可追溯性:patch 历史可以清晰地看到每次优化的原因
  3. 安全性:全量重写有破坏原有有效逻辑的风险,patch 风险更小
  4. 渐进性:符合"渐进式改进"的工程哲学

三、四层记忆体系:从瞬时到持久

Hermes Agent 的记忆系统是它区别于所有竞品的核心基础设施。大多数 Agent 框架使用向量数据库做 RAG,但 Hermes Agent 选择了更务实的方案:SQLite + FTS5 + Markdown 文件

3.1 四层架构详解

┌─────────────────────────────────────────────────────┐
│  L1: 常驻提示记忆 (MEMORY.md + USER.md)             │
│  上限 3575 tokens,每次会话自动注入                   │
├─────────────────────────────────────────────────────┤
│  L2: 会话归档 (SQLite + FTS5)                       │
│  跨会话持久存储,支持全文检索                         │
├─────────────────────────────────────────────────────┤
│  L3: 情景缓存 (当前会话)                            │
│  当前对话的上下文,窗口内直接访问                    │
├─────────────────────────────────────────────────────┤
│  L4: 技能索引 (FTS5)                               │
│  所有 Skill 文件的全文索引,支持按需加载             │
└─────────────────────────────────────────────────────┘

3.2 L1:常驻提示记忆

第一层是 MEMORY.md 和 USER.md——这正是 OpenClaw 使用的方案,Hermes Agent 与 OpenClaw 在这一点上英雄所见略同。

# agent/memory/working_memory.py

class WorkingMemory:
    MAX_TOKENS = 3575
    
    def load(self, profile_dir: Path) -> str:
        """加载常驻记忆并截断到上限"""
        memory_path = profile_dir / "MEMORY.md"
        user_path = profile_dir / "USER.md"
        
        parts = []
        for path in [memory_path, user_path]:
            if path.exists():
                parts.append(path.read_text())
        
        combined = "\n\n".join(parts)
        
        # 按 token 数截断,确保不超过上限
        if self._count_tokens(combined) > self.MAX_TOKENS:
            combined = self._smart_truncate(combined, self.MAX_TOKENS)
        
        return combined

3.3 L2:会话归档(SQLite + FTS5)

第二层是 SQLite 数据库,结合 FTS5 全文搜索引擎。这是 Hermes Agent 最聪明的设计之一——用关系型数据库做持久化,用全文索引做检索,两者结合远比分向量数据库更轻量、更可靠。

# agent/storage/sqlite_store.py

class SQLiteStore:
    def __init__(self, db_path: Path):
        self.conn = sqlite3.connect(db_path)
        self._init_tables()
        self._init_fts5()
    
    def _init_fts5(self):
        """初始化 FTS5 全文索引"""
        self.conn.execute("""
            CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts
            USING fts5(
                content,
                session_id UNINDEXED,
                timestamp UNINDEXED,
                content='conversations',
                content_rowid='id'
            )
        """)
    
    def store_conversation(self, session_id: str, messages: list[Message]):
        """持久化对话历史"""
        cursor = self.conn.cursor()
        for msg in messages:
            cursor.execute(
                "INSERT INTO conversations VALUES (?, ?, ?, ?)",
                (session_id, msg.role, msg.content, msg.timestamp)
            )
        self.conn.commit()
        
        # 同步到 FTS5 索引
        self._rebuild_fts_index(session_id)
    
    def search(self, query: str, top_k: int = 5) -> list[dict]:
        """FTS5 全文检索"""
        cursor = self.conn.execute("""
            SELECT session_id, snippet('conversations_fts', 1, '【', '】', '...', 32) as context
            FROM conversations_fts
            WHERE conversations_fts MATCH ?
            ORDER BY rank
            LIMIT ?
        """, (query, top_k))
        
        return [{"session_id": r[0], "context": r[1]} for r in cursor.fetchall()]

3.4 为什么不用向量数据库?

这是一个非常务实的技术选型决策。很多 Agent 框架追求用向量数据库(Chroma、Pinecone)做 RAG,但 Hermes Agent 选择了 SQLite + FTS5:

维度向量数据库SQLite + FTS5
部署复杂度高(需要单独服务)低(单文件)
内存占用极低
全文检索精度中(依赖 embedding 模型)高(精确关键词匹配)
模糊匹配
结构化查询强(SQL)
适合场景语义相似性检索精确事实召回

对于 Agent 的记忆召回来说,精确的关键词检索往往比语义相似性更重要——"上次用哪个命令部署到了生产环境"这类问题,关键词搜索比向量搜索更可靠。


四、模型接入层:200+ 模型的统一抽象

4.1 模型路由架构

Hermes Agent 支持 200+ 模型的背后,是一套精心设计的模型抽象层:

# agent/models/base.py

class ModelBackend(ABC):
    @abstractmethod
    async def chat(
        self,
        messages: list[Message],
        **kwargs
    ) -> AsyncIterator[Message]:
        """流式输出接口"""
        pass

# 具体实现
class OpenAIBackend(ModelBackend):
    def __init__(self, api_key: str, model: str = "gpt-4o"):
        self.client = OpenAI(api_key=api_key)
        self.model = model
    
    async def chat(self, messages, **kwargs):
        stream = self.client.chat.completions.create(
            model=self.model,
            messages=[m.to_openai_format() for m in messages],
            stream=True,
            **kwargs
        )
        for chunk in stream:
            yield Message(role="assistant", content=chunk.choices[0].delta.content)

class AnthropicBackend(ModelBackend):
    async def chat(self, messages, **kwargs):
        stream = await self.client.messages.create(
            model="claude-sonnet-4-20250514",
            messages=[m.to_anthropic_format() for m in messages],
            stream=True,
            **kwargs
        )
        async for event in stream:
            if event.type == "content_block_delta":
                yield Message(role="assistant", content=event.delta.text)

class OllamaBackend(ModelBackend):
    """本地 Ollama 模型支持"""
    async def chat(self, messages, **kwargs):
        async with aiohttp.ClientSession() as session:
            async with session.post(
                "http://localhost:11434/api/chat",
                json={"model": self.model, "messages": messages}
            ) as resp:
                async for line in resp.content:
                    yield Message(role="assistant", content=json.loads(line)["message"]["content"])

4.2 模型路由器:自动故障转移

# agent/models/router.py

class ModelRouter:
    def __init__(self, backends: list[tuple[ModelBackend, float]]):
        """
        backends: [(OpenAI backend, 1.0), (DeepSeek backend, 0.8), ...]
        权重决定调用优先级
        """
        self.backends = sorted(backends, key=lambda x: x[1], reverse=True)
        self.current = 0
    
    async def chat(self, messages: list[Message], **kwargs) -> AsyncIterator[Message]:
        """带自动故障转移的聊天接口"""
        tried = 0
        
        while tried < len(self.backends):
            backend = self.backends[self.current % len(self.backends)][0]
            
            try:
                async for msg in backend.chat(messages, **kwargs):
                    yield msg
                return  # 成功,直接返回
                
            except RateLimitError:
                # 速率限制 → 切换到下一个后端
                self.current += 1
                tried += 1
                await self._backoff(tried)
                
            except AuthenticationError:
                # 认证失败 → 永久跳过该后端
                self.backends.pop(self.current)
                tried += 1
                
            except Exception as e:
                # 其他错误 → 重试一次后切换
                tried += 1
                if tried > len(self.backends):
                    raise

4.3 本地部署:GGUF 量化方案

对于希望完全私有化部署的开发者,Hermes Agent 支持通过 Ollama 接入本地 GGUF 量化模型:

# 安装 Ollama
curl -fsSL https://ollama.ai/install.sh | sh

# 下载量化模型(推荐 Q4_K_M 量化,平衡质量和速度)
ollama pull llama3.2:3b-instruct-q4_K_M   # ~2GB,适合 8GB 内存
ollama pull qwen2.5:7b-q4_K_M              # ~4.7GB,适合 16GB 内存
ollama pull deepseek-r1:14b-q4_K_M         # ~9GB,适合 32GB 内存

# 配置 Hermes Agent 使用 Ollama
# 在 profiles/default/model_config.yaml 中设置:
# provider: ollama
# model: llama3.2:3b-instruct-q4_K_M
# base_url: http://localhost:11434

量化参数参考:

模型精度体积最低内存速度(tokens/s)适合场景
3B Q4_K_M4-bit~2GB8GB~40快速响应、轻量任务
7B Q4_K_M4-bit~4.7GB16GB~25日常对话、中等任务
14B Q4_K_M4-bit~9GB32GB~12复杂推理、代码生成
14B Q5_K_M5-bit~11GB32GB~8高质量输出

五、工具系统:从文件系统到 MCP 扩展

5.1 内置工具集

Hermes Agent 内置了丰富的工具集,覆盖日常开发的高频场景:

# agent/tools/registry.py

BUILTIN_TOOLS = {
    # 文件操作
    "read_file": ReadFileTool(),
    "write_file": WriteFileTool(),
    "edit_file": EditFileTool(),
    "list_directory": ListDirTool(),
    "glob": GlobTool(),  # 文件模式匹配
    
    # Git 操作
    "git_status": GitStatusTool(),
    "git_log": GitLogTool(),
    "git_diff": GitDiffTool(),
    "git_branch": GitBranchTool(),
    
    # Shell 执行
    "bash": BashTool(),  # 安全执行本地命令
    "ssh": SSHTool(),    # 远程命令执行
    
    # 网络
    "http_request": HTTPRequestTool(),
    "search_web": WebSearchTool(),
    
    # 代码辅助
    "grep": GrepTool(),
    "execute_code": CodeExecutionTool(),
    
    # 搜索与检索
    "search_code": CodeSearchTool(),  # 基于 FTS5 的代码搜索
}

5.2 工具调用的安全设计

Shell 命令执行是 Agent 框架中最危险的功能,Hermes Agent 做了多层安全防护:

# agent/tools/bash.py

class BashTool(Tool):
    # 危险命令黑名单
    BLOCKED_PATTERNS = [
        r"rm\s+-rf\s+/",           # 递归删除根目录
        r"dd\s+if=.*of=/dev/",     # 磁盘覆写
        r":\(\)\{",                  # Fork 炸弹
        r"curl.*\|.*sh",             # 管道到 shell(安装脚本除外)
        r"wget.*\|.*sh",             # 同上
    ]
    
    MAX_EXECUTION_TIME = 120  # 最大执行时间(秒)
    MAX_OUTPUT_SIZE = 1024 * 1024  # 最大输出(1MB)
    
    async def execute(self, command: str, cwd: str = None, timeout: int = None):
        # 1. 命令安全检查
        self._check_dangerous_patterns(command)
        
        # 2. 设置资源限制
        proc = await asyncio.create_subprocess_shell(
            command,
            stdout=asyncio.subprocess.PIPE,
            stderr=asyncio.subprocess.PIPE,
            cwd=cwd,
            # 使用 prlimit 限制资源
            preexec_fn=lambda: resource.setrlimit(
                resource.RLIMIT_CPU,
                (timeout or self.MAX_EXECUTION_TIME, timeout or self.MAX_EXECUTION_TIME)
            )
        )
        
        # 3. 超时控制
        try:
            stdout, stderr = await asyncio.wait_for(
                proc.communicate(),
                timeout=timeout or self.MAX_EXECUTION_TIME
            )
        except asyncio.TimeoutError:
            proc.kill()
            raise ToolExecutionError(f"命令执行超时(>{timeout}s)")
        
        # 4. 输出截断
        if len(stdout) > self.MAX_OUTPUT_SIZE:
            stdout = stdout[:self.MAX_OUTPUT_SIZE] + b"\n[输出已截断]"
        
        return {"stdout": stdout.decode(), "stderr": stderr.decode(), "returncode": proc.returncode}

5.3 MCP(Model Context Protocol)扩展

2026 年,MCP 已成为 Agent 工具扩展的事实标准。Hermes Agent 支持连接 MCP 服务器来扩展工具集:

# agent/tools/mcp_client.py

class MCPClient:
    def __init__(self, server_config: dict):
        self.server_url = server_config["url"]
        self.capabilities = self._discover()  # 启动时发现可用工具
    
    def _discover(self) -> list[Tool]:
        """从 MCP 服务器发现可用工具"""
        # 调用 MCP 的 tools/list 接口
        response = requests.post(
            f"{self.server_url}/tools/list",
            json={"jsonrpc": "2.0", "method": "tools/list", "id": 1}
        )
        return [self._wrap_tool(spec) for spec in response.json()["tools"]]
    
    def _wrap_tool(self, spec: dict) -> Tool:
        """将 MCP 工具规范包装为 Hermes Tool 接口"""
        async def mcp_tool_call(**kwargs):
            result = await self._call_mcp_tool(spec["name"], kwargs)
            return self._parse_result(result)
        
        return Tool(
            name=spec["name"],
            description=spec["description"],
            parameters=spec["inputSchema"],
            execute=mcp_tool_call
        )

连接示例(MCP 服务器配置文件):

# profiles/default/mcp_servers.yaml

servers:
  - name: filesystem
    url: http://localhost:3001
    enabled: true
  
  - name: github
    url: http://localhost:3002
    enabled: true
    auth:
      type: bearer
      token: ${GITHUB_TOKEN}  # 从环境变量读取

六、Curator:自动化的后台维护员

Hermes Agent 引入了一个独特的设计:Curator(策展人)——一个后台守护进程,负责自动维护记忆和技能的整洁性。

6.1 Curator 的职责

# agent/curator.py

class Curator:
    """
    Curator 定期运行,维护系统整洁性:
    1. 记忆压缩:合并碎片化的记忆条目
    2. 技能去重:合并相似的技能
    3. 记忆失效:清理过时的信息
    4. 技能评分:根据使用频率和质量评分
    """
    
    async def run_maintenance(self):
        await self._compress_memories()      # 记忆压缩
        await self._deduplicate_skills()    # 技能去重
        await self._prune_stale_memories()  # 清理过时记忆
        await self._score_skills()          # 技能评分
    
    async def _compress_memories(self):
        """合并碎片化的记忆条目"""
        # 1. 找出所有关于同一主题的记忆片段
        memories = self.store.get_all_memories()
        
        clusters = self._cluster_by_topic(memories)
        
        for cluster in clusters:
            if len(cluster) > 3:
                # 2. LLM 总结为一个精炼条目
                summary = self.llm.summarize(
                    f"将以下关于 {cluster[0].topic} 的记忆片段合并为一个精炼总结:\n"
                    + "\n".join(m.content for m in cluster)
                )
                
                # 3. 替换为单一条目
                self.store.replace_with_summary(cluster, summary)
    
    async def _skill_score(self, skill: Skill) -> float:
        """计算技能质量分数"""
        # 使用成功率 × 调用频率 × 时效性
        success_rate = skill.total_calls > 0 and skill.successful_calls / skill.total_calls
        frequency = min(skill.total_calls / 30, 1.0)  # 归一化到最近30天
        recency = self._time_decay(skill.last_used)
        
        return 0.5 * success_rate + 0.3 * frequency + 0.2 * recency

Curator 的存在解决了所有长期运行 AI Agent 的共同痛点:记忆膨胀和技能腐化。没有自动维护的系统,最终会积累大量过时、无效的信息,导致检索质量下降和 token 消耗增加。


七、生产部署:从安装到高可用

7.1 一键安装

Hermes Agent 提供了一键安装脚本,自动处理所有依赖:

# Linux / macOS / WSL2
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash

# 安装脚本自动完成:
# 1. 检测 uv(Astral 开发的超快 Python 包管理器)
# 2. 安装/更新 uv
# 3. 安装 hermes-agent 及所有依赖
# 4. 配置 profiles/
# 5. 运行初始化向导

7.2 Docker 部署

# Dockerfile
FROM python:3.11-slim

RUN pip install uv
WORKDIR /app

# 安装依赖(使用 uv 加速)
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-install-project

COPY . .

# 非 root 用户运行
RUN useradd -m hermes && chown -R hermes:hermes /app
USER hermes

CMD ["python", "-m", "agent", "run", "--profile", "production"]
# docker-compose.yml
services:
  hermes:
    build: .
    volumes:
      - ./profiles:/app/profiles        # 配置和记忆数据
      - ./skills:/app/skills              # 技能文件
      - /var/run/docker.sock:/var/run/docker.sock  # Docker in Docker
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    restart: unless-stopped
    
  curator:
    build: .
    command: python -m agent run --curator
    volumes:
      - ./profiles:/app/profiles
    depends_on:
      - hermes
    restart: unless-stopped
    # Curator 每天凌晨 3 点运行一次维护

7.3 多 Profile 隔离

Hermes Agent 支持通过 Profile 运行多个完全隔离的实例:

# 创建新 profile
hermes profile create work
hermes profile create personal

# 查看所有 profile
hermes profile list

# 在特定 profile 中运行
hermes run --profile work

每个 Profile 拥有独立的:

  • MEMORY.md 和 USER.md
  • SQLite 数据库
  • 技能集合
  • 模型配置
  • 消息平台接入

这对于需要在工作和个人场景中使用不同配置的开发者来说是刚需。


八、与其他 Agent 框架的横向对比

理解 Hermes Agent 的独特价值,需要将它放到更宽的坐标系中:

维度Hermes AgentClaude CodeCodexOpenClaw
记忆持久化✅ SQLite+MD✅ 文件系统
技能自创建✅ 自动创建✅ Skill 系统
多平台接入✅ 15+ 平台✅ 多 channel
模型无关✅ 200+❌ 专用❌ 专用✅ 多 provider
Curator 维护✅ 自动
开源协议MIT闭源闭源闭源

结论:Hermes Agent 是目前最接近"通用自进化 AI 助手"目标的开源实现。它的很多设计(如 Curator、SQLite+FTS5、patch 机制)都非常值得借鉴。


九、局限性:务实的工程视角

任何项目都有局限性,Hermes Agent 也不例外:

9.1 上下文窗口依赖

技能创建和记忆召回都依赖 LLM 的上下文理解能力。当上下文窗口接近满载时,技能创建的质量会下降。

9.2 技能碎片化

长期使用后,可能会积累大量粒度不一、重叠度高的技能。Curator 的去重机制是缓解方案,但不是银弹。

9.3 本地模型质量瓶颈

使用本地量化模型(如 Q4_K_M)时,技能创建和复杂推理的质量明显不如 GPT-4o/Claude 等顶级模型。这不是 Hermes Agent 的问题,而是本地模型的固有限制。

9.4 Windows 体验相对较弱

虽然支持 WSL2,但原生 Windows 下的工具链(特别是 Git、Shell)体验不如 macOS/Linux。


十、总结:自进化 Agent 的工程启示

Hermes Agent 给我们最重要的启示,不是某一个具体功能,而是一种系统性的工程思维

1. 闭环设计比单点突破更重要
单一功能强大(如 GPT-4 的推理能力)固然有价值,但 Hermes Agent 证明了闭环系统(学习→创建→优化→召回→再学习)的长期价值远超单点优化。

2. 务实的工具选型
不用向量数据库,用 SQLite+FTS5;不用 Kubernetes,用 Docker Compose;不用复杂的微服务架构,用单进程 + 多 Profile。这种务实让项目易于部署和维护。

3. 可观测性内置
Curator 的维护日志、技能评分、使用统计——这些"元功能"对于一个需要长期运行的系统来说至关重要。

4. 开放生态的杠杆效应
MCP 支持、多平台集成、200+ 模型路由——这些设计让 Hermes Agent 能够融入已有的开发者工具链,而不是要求开发者彻底改变工作方式。

2026 年是 AI Agent 的爆发年,但大多数 Agent 框架还停留在"调用工具执行任务"的阶段。Hermes Agent 的出现,第一次让我们看到了一个真正能够随着使用而进化、随着时间而变得更聪明的 AI Agent 原型。这不只是一个开源项目,更是对"AI 助手应该是什么样的"这个问题的一次认真回答。

如果你正在构建自己的 Agent 系统,或者只是想体验一下"越用越懂你"的 AI 助手,Hermes Agent 值得你花时间深入研究。

推荐文章

Python实现Zip文件的暴力破解
2024-11-19 03:48:35 +0800 CST
rmux Test
2026-05-22 18:48:45 +0800 CST
MySQL 日志详解
2024-11-19 02:17:30 +0800 CST
总结出30个代码前端代码规范
2024-11-19 07:59:43 +0800 CST
PHP 代码功能与使用说明
2024-11-18 23:08:44 +0800 CST
实现微信回调多域名的方法
2024-11-18 09:45:18 +0800 CST
程序员茄子在线接单