深入浅出 Hermes Agent 架构:一个自进化 AI Agent 的设计哲学

深入浅出 Hermes Agent 架构:一个自进化 AI Agent 的设计哲学

发布于: 2025-05-17
分类: 人工智能 · 系统架构 · 深度解析
阅读时间: 约 20 分钟
难度等级: ⭐⭐⭐⭐ 中高


写在前面

在上一篇部署教程中,我们学会了如何让 Hermes Agent 跑起来。今天,让我们深入它的"内脏",理解这个 28.4k Stars 开源项目的架构设计。

为什么值得深入研究?

Hermes Agent 是目前唯一内置"学习循环"的 AI Agent 系统。它不是简单的 LLM 包装器,而是一个能够自我进化的数字生命体。


一、架构全景图

1.1 核心设计理念

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                     Hermes Agent 架构全景                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐ │
│   │  用户界面  │───→│  核心引擎  │───→│  工具层   │───→│  执行环境 │ │
│   │   Layer  │    │   Core   │    │  Tools   │    │  Backend │ │
│   └──────────┘    └────┬─────┘    └──────────┘    └──────────┘ │
│                        │                                         │
│                   ┌────┴────┐                                    │
│                   │ 记忆系统 │ ← 自进化的核心                      │
│                   │ Memory  │                                    │
│                   └────┬────┘                                    │
│                        │                                         │
│              ┌─────────┼─────────┐                               │
│              ↓         ↓         ↓                               │
│         ┌────────┐ ┌────────┐ ┌────────┐                        │
│         │ 会话记忆 │ │ 技能记忆 │ │ 用户建模 │                        │
│         │Session │ │ Skills │ │ Honcho │                        │
│         └────────┘ └────────┘ └────────┘                        │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

1.2 与传统 Agent 的本质区别

维度 传统 Agent Hermes Agent
记忆 单会话、易丢失 跨会话、自组织、FTS5 全文索引
技能 预定义、固定 自创建、自优化、可共享
学习 闭环学习、持续进化
用户理解 通用提示词 深度用户建模
部署 绑定 IDE/本地 云原生、Serverless

二、核心引擎:对话流转的艺术

2.1 消息生命周期

python 复制代码
# 简化的消息处理流程

class ConversationEngine:
    async def process_turn(self, user_message):
        # 1. 上下文检索
        context = await self.memory.retrieve_relevant(
            query=user_message,
            session_id=self.session_id,
            user_id=self.user_id
        )
        
        # 2. 技能匹配
        relevant_skills = await self.skill_registry.match(
            intent=user_message,
            context=context
        )
        
        # 3. LLM 推理
        response = await self.llm.generate(
            messages=build_messages(context, user_message),
            tools=self.tool_registry.get_available(),
            skills=relevant_skills
        )
        
        # 4. 工具执行(如有)
        if response.has_tool_calls:
            results = await self.execute_tools(response.tool_calls)
            
            # 4.1 递归推理(观察-行动循环)
            response = await self.llm.generate(
                messages=add_observations(results),
                tools=self.tool_registry.get_available()
            )
        
        # 5. 记忆持久化
        await self.memory.store(
            session_id=self.session_id,
            turn={"input": user_message, "output": response}
        )
        
        # 6. 技能学习触发(异步)
        asyncio.create_task(
            self.learning_loop.analyze_and_learn(
                session_id=self.session_id,
                trajectory=get_recent_turns(n=5)
            )
        )
        
        return response

2.2 ReAct 模式的进化

传统 ReAct(Reasoning + Acting):

复制代码
Thought → Action → Observation → Thought → Action → ... → Answer

Hermes 的增强 ReAct:

复制代码
Thought → Action → Observation → [Skill Check] → Thought → Action → ...
                ↓
         [学习触发器] → 生成/优化 Skill → 存入技能库

关键创新:在每次行动循环中嵌入学习触发器,让 Agent 从执行过程中自动提炼经验。


三、记忆系统:超越 RAG 的设计

3.1 三层记忆架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                      记忆金字塔                               │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   Level 3: 用户建模层 (Honcho)                                │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • 用户偏好画像      • 对话风格偏好                     │   │
│   │ • 长期目标追踪      • 个性化知识                        │   │
│   │ • 情感状态历史      • 信任度评估                        │   │
│   └─────────────────────────────────────────────────────┘   │
│                          ↑  dialectic 对话                    │
│   Level 2: 技能记忆层 (Skills)                                │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • 程序化记忆        • 可复用工作流                     │   │
│   │ • 自创建、自优化    • agentskills.io 标准              │   │
│   └─────────────────────────────────────────────────────┘   │
│                          ↑  经验提炼                          │
│   Level 1: 会话记忆层 (Session)                               │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • 对话历史          • FTS5 全文索引                   │   │
│   │ • 向量检索          • LLM 摘要压缩                    │   │
│   │ • 跨会话关联        • 时间衰减算法                    │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

3.2 会话记忆的实现细节

python 复制代码
# 基于 SQLite + FTS5 的混合检索

class SessionMemory:
    def __init__(self, db_path):
        self.conn = sqlite3.connect(db_path)
        self._init_fts5()
        
    def _init_fts5(self):
        """初始化全文搜索表"""
        self.conn.execute('''
            CREATE VIRTUAL TABLE IF NOT EXISTS memories USING fts5(
                session_id,
                content,
                timestamp,
                embedding,  -- 可选:向量存储
                metadata
            )
        ''')
    
    async def retrieve_relevant(self, query, session_id, limit=5):
        """混合检索:关键词 + 语义 + 时间衰减"""
        
        # 1. FTS5 关键词检索
        keyword_results = self.conn.execute('''
            SELECT content, timestamp, rank
            FROM memories
            WHERE session_id = ? AND memories MATCH ?
            ORDER BY rank
            LIMIT ?
        ''', (session_id, query, limit)).fetchall()
        
        # 2. 向量相似度检索(如有 embedding)
        semantic_results = await self.vector_search(
            query_embedding=await self.embed(query),
            session_id=session_id,
            limit=limit
        )
        
        # 3. 时间衰减加权
        time_weighted = self._apply_time_decay(
            results=keyword_results + semantic_results,
            decay_factor=0.95  # 越旧的记忆权重越低
        )
        
        # 4. LLM 重排序
        reranked = await self.llm_rerank(
            query=query,
            candidates=time_weighted,
            top_k=limit
        )
        
        return reranked

3.3 跨会话召回机制

问题: 用户上周让 Agent 记住了一个重要信息,本周新会话如何找回?

Hermes 的解决方案:

python 复制代码
class CrossSessionRecall:
    async def recall(self, current_query, user_id):
        # 1. 生成搜索查询(LLM 扩展)
        search_queries = await self.llm.generate(
            prompt=f"基于当前问题 '{current_query}',生成 3 个可能相关的历史搜索词"
        )
        
        # 2. 跨会话全文搜索
        all_memories = []
        for query in search_queries:
            memories = self.fts5_search_across_sessions(
                query=query,
                user_id=user_id,
                limit=10
            )
            all_memories.extend(memories)
        
        # 3. 去重和聚类
        clustered = self.cluster_by_topic(all_memories)
        
        # 4. LLM 摘要生成
        summary = await self.llm.summarize(
            f"基于以下历史记忆,生成对当前问题的相关背景:\n{clustered}"
        )
        
        return summary

四、技能系统:程序化的经验

4.1 Skill 的本质

Skill 是 Hermes 最核心的创新------将经验转化为可执行代码

yaml 复制代码
# Skill 的结构示例
# ~/.hermes/skills/web_search_skill.yaml

name: web_search_enhanced
version: 1.2.3
created_at: 2025-03-15
optimized_at: 2025-04-01  # 自优化时间戳

description: |
  增强版网页搜索技能,针对技术问题优化,
  会自动访问多个结果并综合答案。

triggers:
  - pattern: "搜索.*最新"
  - pattern: "查找.*文档"
  - intent: "technical_research"

parameters:
  query:
    type: string
    required: true
  depth:
    type: enum
    values: [quick, thorough, deep]
    default: thorough

implementation:
  type: python
  code: |
    async def execute(query, depth):
        # 技能的具体实现
        results = await search_web(query, num_results=5 if depth == 'quick' else 10)
        
        if depth == 'deep':
            # 访问每个结果页面提取详细内容
            detailed = await asyncio.gather(*[
                extract_content(url) for url in results
            ])
            return synthesize_answer(detailed)
        
        return summarize_results(results)

# 性能追踪(用于自优化)
metrics:
  total_calls: 156
  avg_latency_ms: 2300
  success_rate: 0.94
  user_ratings: [5, 4, 5, 5, 4, ...]

4.2 技能创建流程

复制代码
┌─────────────────────────────────────────────────────────────┐
│                     技能创建流水线                            │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   触发条件                                                   │
│      │                                                       │
│      ▼                                                       │
│   ┌─────────────────┐                                        │
│   │ 1. 检测复杂任务  │ ← 多步骤、多工具调用、成功完成           │
│   │    Detect       │                                        │
│   └────────┬────────┘                                        │
│            │                                                 │
│            ▼                                                 │
│   ┌─────────────────┐                                        │
│   │ 2. 轨迹记录      │ ← 记录完整的 Thought-Action-Observation │
│   │    Trajectory   │                                        │
│   └────────┬────────┘                                        │
│            │                                                 │
│            ▼                                                 │
│   ┌─────────────────┐     ┌─────────────────┐               │
│   │ 3. 模式抽象      │────→│ LLM 分析通用模式  │               │
│   │    Abstract     │     │ "提取可复用步骤"  │               │
│   └────────┬────────┘     └─────────────────┘               │
│            │                                                 │
│            ▼                                                 │
│   ┌─────────────────┐     ┌─────────────────┐               │
│   │ 4. 代码生成      │────→│ 生成 Skill 代码  │               │
│   │    Generate     │     │ + 触发器 + 参数  │               │
│   └────────┬────────┘     └─────────────────┘               │
│            │                                                 │
│            ▼                                                 │
│   ┌─────────────────┐                                        │
│   │ 5. 验证测试      │ ← 在沙箱中执行,验证正确性              │
│   │    Validate     │                                        │
│   └────────┬────────┘                                        │
│            │                                                 │
│            ▼                                                 │
│   ┌─────────────────┐                                        │
│   │ 6. 注册入库      │ ← 存入技能库,可被后续调用              │
│   │    Register     │                                        │
│   └─────────────────┘                                        │
│                                                              │
└─────────────────────────────────────────────────────────────┘

4.3 技能自优化机制

python 复制代码
class SkillOptimizer:
    async def optimize_skill(self, skill_id):
        skill = self.skill_registry.get(skill_id)
        
        # 1. 收集性能数据
        metrics = skill.get_metrics()
        
        # 2. 识别瓶颈
        if metrics.avg_latency_ms > 3000:
            # 延迟过高,尝试并行化
            optimized_code = await self.llm.optimize(
                skill.code,
                goal="reduce_latency",
                strategy="parallelize_io"
            )
        
        if metrics.success_rate < 0.9:
            # 成功率低,增强错误处理
            optimized_code = await self.llm.optimize(
                skill.code,
                goal="improve_reliability",
                strategy="add_retries_and_fallbacks"
            )
        
        # 3. A/B 测试
        test_results = await self.ab_test(
            original=skill.code,
            optimized=optimized_code,
            test_cases=self.generate_test_cases(skill)
        )
        
        # 4. 如果优化版本更好,更新技能
        if test_results.improvement > 0.1:  # 10% 提升阈值
            skill.update_code(optimized_code)
            skill.version_bump()
            skill.record_optimization()

五、工具层:能力的延伸

5.1 工具架构

python 复制代码
# 工具注册与发现机制

class ToolRegistry:
    def __init__(self):
        self.tools: Dict[str, Tool] = {}
        self.toolsets: Dict[str, ToolSet] = {}
    
    def register(self, tool: Tool):
        """注册单个工具"""
        self.tools[tool.name] = tool
        
    def register_toolset(self, toolset: ToolSet):
        """注册工具集(一组相关工具)"""
        self.toolsets[toolset.name] = toolset
        for tool in toolset.tools:
            self.register(tool)
    
    def get_available(self, context: Context) -> List[Tool]:
        """根据上下文动态返回可用工具"""
        available = []
        
        for tool in self.tools.values():
            # 检查权限
            if not self.check_permission(tool, context.user):
                continue
            
            # 检查环境依赖
            if not tool.check_dependencies():
                continue
            
            # 检查上下文相关性(可选的语义过滤)
            if context.intent and tool.relevance_score(context.intent) < 0.3:
                continue
            
            available.append(tool)
        
        return available

5.2 内置工具分类

类别 工具示例 用途
Web search, fetch, browse 信息检索、网页浏览
File read, write, edit, grep 文件操作
Code execute_code, exec 代码执行
System shell, ssh 系统管理
Media image_gen, tts, vision 多媒体处理
Comm send_message, email 消息发送
Data sql_query, csv_process 数据处理

5.3 MCP 集成:无限扩展

python 复制代码
# Model Context Protocol 支持

class MCPConnector:
    """连接外部 MCP 服务器,扩展工具能力"""
    
    def __init__(self, server_config):
        self.servers = {}
        for config in server_config:
            self.connect(config)
    
    def connect(self, config):
        """连接到 MCP 服务器"""
        server = MCPClient(
            command=config['command'],
            args=config['args'],
            env=config.get('env', {})
        )
        
        # 发现服务器提供的工具
        tools = server.list_tools()
        
        # 注册到工具库
        for tool in tools:
            self.register_mcp_tool(server, tool)
        
        self.servers[config['name']] = server
    
    def register_mcp_tool(self, server, tool_def):
        """将 MCP 工具包装为 Hermes 工具"""
        
        async def wrapper(**kwargs):
            return await server.call_tool(tool_def['name'], kwargs)
        
        tool = Tool(
            name=f"mcp_{server.name}_{tool_def['name']}",
            description=tool_def['description'],
            parameters=tool_def['parameters'],
            execute=wrapper
        )
        
        self.registry.register(tool)

六、执行环境:无处不在的部署

6.1 终端后端抽象

python 复制代码
# 统一的执行环境接口

class TerminalBackend(ABC):
    """终端后端抽象基类"""
    
    @abstractmethod
    async def execute(self, command: str) -> ExecutionResult:
        pass
    
    @abstractmethod
    async def read_file(self, path: str) -> str:
        pass
    
    @abstractmethod
    async def write_file(self, path: str, content: str):
        pass

# 具体实现

class LocalBackend(TerminalBackend):
    """本地执行"""
    pass

class DockerBackend(TerminalBackend):
    """Docker 容器执行"""
    pass

class SSHBackend(TerminalBackend):
    """SSH 远程执行"""
    pass

class DaytonaBackend(TerminalBackend):
    """Daytona Serverless"""
    pass

class ModalBackend(TerminalBackend):
    """Modal Serverless"""
    pass

6.2 Serverless 休眠唤醒机制

python 复制代码
class ServerlessBackend(TerminalBackend):
    """
    Serverless 后端的核心:休眠时零成本,唤醒时快速恢复
    """
    
    async def ensure_active(self):
        """确保环境处于活跃状态"""
        if self.state == 'hibernating':
            # 唤醒环境
            await self.wake_up()
            
            # 恢复会话状态
            await self.restore_session()
            
            # 启动心跳保持活跃
            self.start_heartbeat()
    
    async def hibernate(self):
        """进入休眠状态"""
        # 保存会话状态
        await self.save_session()
        
        # 停止心跳
        self.stop_heartbeat()
        
        # 通知平台休眠
        await self.platform.hibernate()
        
        self.state = 'hibernating'

七、消息网关:多平台统一接入

7.1 网关架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                        消息网关层                             │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐          │
│   │Telegram │ │Discord  │ │  Slack  │ │WhatsApp │          │
│   └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘          │
│        │           │           │           │               │
│        └───────────┴─────┬─────┴───────────┘               │
│                          │                                  │
│                    ┌─────┴─────┐                            │
│                    │  协议适配器 │ ← 统一消息格式转换          │
│                    │ Adapters  │                            │
│                    └─────┬─────┘                            │
│                          │                                  │
│                    ┌─────┴─────┐                            │
│                    │  消息路由器 │ ← 会话管理与路由            │
│                    │  Router   │                            │
│                    └─────┬─────┘                            │
│                          │                                  │
│                    ┌─────┴─────┐                            │
│                    │  核心引擎   │                            │
│                    │   Core    │                            │
│                    └───────────┘                            │
│                                                              │
└─────────────────────────────────────────────────────────────┘

7.2 跨平台会话连续性

python 复制代码
class ConversationRouter:
    """
    确保用户可以在不同平台间无缝切换,会话状态保持一致
    """
    
    async def route_message(self, incoming_msg: Message):
        # 1. 识别用户(跨平台身份关联)
        user = await self.identify_user(
            platform=incoming_msg.platform,
            platform_user_id=incoming_msg.user_id
        )
        
        # 2. 查找或创建会话
        session = await self.get_or_create_session(
            user=user,
            context=incoming_msg.context
        )
        
        # 3. 检查跨平台状态
        if session.last_platform != incoming_msg.platform:
            # 用户切换了平台,发送上下文摘要
            context_summary = await self.generate_context_summary(session)
            await self.send_notification(
                platform=incoming_msg.platform,
                message=f"继续之前的会话:{context_summary}"
            )
        
        # 4. 处理消息
        response = await self.core.process(
            session=session,
            message=incoming_msg.content
        )
        
        # 5. 回复到原平台
        await self.reply(
            platform=incoming_msg.platform,
            chat_id=incoming_msg.chat_id,
            content=response
        )

八、安全设计:信任但验证

8.1 多层安全模型

复制代码
┌─────────────────────────────────────────────────────────────┐
│                       安全架构层                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   Level 1: 命令审批层                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • 危险操作需用户确认    • 可配置自动审批白名单        │   │
│   │ • 沙箱执行敏感命令      • 操作日志审计               │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
│   Level 2: 权限控制层                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • 工具级权限控制        • 文件访问限制               │   │
│   │ • 网络访问白名单        • 资源使用配额               │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
│   Level 3: 环境隔离层                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ • Docker 容器隔离       • 非特权用户运行             │   │
│   │ • 只读文件系统(可选)   • 资源限制(CPU/内存)       │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

8.2 危险操作识别

python 复制代码
class SafetyChecker:
    DANGEROUS_PATTERNS = [
        r'rm\s+-rf\s+/',           # 删除根目录
        r'dd\s+if=.*of=/dev/sd',   # 直接写磁盘
        r'>:?\s*/dev/sd',          # 覆盖磁盘设备
        r'curl.*\|\s*sh',          # 管道执行远程脚本
        r'wget.*\|\s*bash',        # 同上
    ]
    
    async def check_command(self, command: str) -> SafetyResult:
        # 1. 模式匹配
        for pattern in self.DANGEROUS_PATTERNS:
            if re.search(pattern, command):
                return SafetyResult(
                    safe=False,
                    risk_level='high',
                    reason=f"匹配危险模式: {pattern}",
                    requires_approval=True
                )
        
        # 2. LLM 语义分析
        llm_analysis = await self.llm.analyze_safety(command)
        
        # 3. 综合判断
        return self.combine_results(pattern_result, llm_analysis)

九、写在最后:架构的哲学

9.1 设计原则总结

  1. 学习优先:不是执行工具,而是从执行中学习
  2. 记忆即身份:Agent 的本质是其积累的记忆
  3. 用户为中心:深度理解用户,而非通用响应
  4. 无处不在:灵活部署,不绑定特定环境
  5. 开放生态:标准化接口,社区共建

9.2 为什么这很重要?

当前大多数 AI Agent 是"无状态"的------每次对话都是新的开始。

Hermes Agent 探索的是"有状态"的路径------像人类一样,从经验中成长。

这不仅是技术架构的差异,更是AI 范式的转变:

复制代码
从:LLM + Prompt → 响应
到:LLM + 记忆 + 技能 + 用户模型 → 持续进化的伙伴

参考资源


评论区互动

你对 Hermes Agent 的哪个架构设计最感兴趣?你觉得自进化 AI 的未来会怎样?欢迎讨论!


本文基于 Hermes Agent 开源代码和官方文档分析整理,如有理解偏差欢迎指正。

标签: #HermesAgent #AI架构 #Agent设计 #自进化AI #系统架构 #深度解析


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/\[your_username\]/article/details/\[article_id\]

相关推荐
小当家.1054 小时前
Codex + SSH 远程运维实战:让 AI 管你的云服务器
运维·服务器·人工智能·ssh·codex·ai-coding
1368木林森4 小时前
RAG查询改写②【第十篇】:HYDE、StepBack、子问题拆分,高阶改写算法生产落地
人工智能·算法·rag
逆境不可逃4 小时前
【与我学 ClaudeCode】工具与执行篇:从 0 到 1 拆解 Agent Loop 与 Tool Use 的极简设计哲学
人工智能·学习·agent·claudecode
cd_949217214 小时前
星思半导体:深耕芯片研发,助力卫星互联网产业高质量发展
网络·人工智能
xiaoxiaoxiaolll4 小时前
Light首次发表:动量空间穆勒矩阵偏振测量,破解纳米手性结构表征难题
人工智能·算法
kishu_iOS&AI4 小时前
NLP —— Transformer底层源码剖析(解码器部分+输出)
人工智能·自然语言处理·transformer
迦南的迦 亚索的索4 小时前
机器学习_01_基础
人工智能·机器学习
百珏4 小时前
AI 应用技术演进串讲大纲
人工智能·后端·架构
工业机器人销售服务4 小时前
泡沫箱码垛(易碎),伯朗特机器人宽幅吸盘+低真空,吸气泡沫箱无压痕
人工智能