编程 Hermes Agent 深度实战:47K+ Star 的自进化 AI 智能体框架——从 Harness Engineering 到 Skill 闭环系统的全链路架构解析

2026-05-07 07:06:42 +0800 CST views 10

Hermes Agent 深度实战:47K+ Star 的自进化 AI 智能体框架——从 Harness Engineering 到 Skill 闭环系统的全链路架构解析

一、项目背景:从"工具"到"数字伙伴"的范式转移

1.1 AI Agent 的"健忘症"困局

2026 年初,AI Agent 领域面临一个尴尬的现实:无论框架多么先进,大部分 Agent 仍然像金鱼一样——只有 7 秒记忆。每次对话都从零开始,昨天聊过什么、做过什么、学过什么,统统不记得。

这个问题的本质是:传统 Agent 系统缺失了"从经验中学习"的能力

我们看一组数据对比:

Agent 系统记忆持久化技能沉淀自我优化跨会话能力
传统 ChatBot手动编码
LangChain Agent向量数据库有限(需手动配置)
AutoGPT文件存储
OpenClawSQLite + LCMSkill 系统有限
Claude Code会话级.claude 目录有限
Hermes Agent四层记忆自动生成完整闭环原生支持

1.2 Hermes Agent 的诞生

2026 年 2 月 25 日,Nous Research 正式开源 Hermes Agent。这个硅谷 AI 实验室给出了一个激进的定义:

Self-Improving AI Agent(自进化 AI 智能体)

这不是营销话术,而是一个完整的工程实现。让我们拆解它的核心理念:

Harness Engineering(马具工程)

这个概念来自骑马:马具(Harness)不是马本身,而是一套约束马匹行为、确保安全的装备系统。映射到 AI Agent:

  • Agent = 马:执行任务的主体
  • Harness = 规则沙盒:定义行为边界、提供反馈机制
  • 骑手 = 用户:发出指令、设定目标

Hermes Agent 的突破在于:它把"马具"变成了一个自动化评估与反馈系统,让 Agent 在安全边界内自主进化。

1.3 项目爆火数据

发布两个月内,Hermes Agent 的增长曲线堪称恐怖:

2026-02-25:首次发布
2026-03-27:GitHub Star 突破 22,000
2026-04-08:v0.8.0 发布,单日新增 6,400+ Star
2026-05-01:Star 突破 47,000,Fork 超 3,000
2026-05-07:活跃贡献者 200+,Issues 800+

为什么能这么火?因为这是第一个真正解决"Agent 越用越强"问题的开源框架。


二、核心架构:自进化闭环的工程实现

2.1 整体架构图

Hermes Agent 的架构可以用一个公式概括:

Self-Evolution = Memory + Skill + Reflection + Action

让我们看核心组件关系:

┌─────────────────────────────────────────────────────────┐
│                     Message Gateway                       │
│         (Telegram/Discord/Slack/WhatsApp/Signal)         │
└─────────────────────┬───────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────┐
│                  run_conversation Loop                    │
│  ┌─────────────────────────────────────────────────────┐│
│  │  1. Receive Message                                  ││
│  │  2. Build Context (Memory + Skills + User Profile)  ││
│  │  3. LLM Inference                                    ││
│  │  4. Tool Execution                                   ││
│  │  5. Skill Creation/Update (if triggered)            ││
│  │  6. Memory Consolidation                             ││
│  │  7. Response Generation                              ││
│  └─────────────────────────────────────────────────────┘│
└─────────────────────┬───────────────────────────────────┘
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
┌──────────────┐ ┌──────────┐ ┌────────────┐
│  Memory DB   │ │ Skill DB │ │ Honcho     │
│ (SQLite+FTS5)│ │ (MD Files)│ │(User Model)│
└──────────────┘ └──────────┘ └────────────┘
        │             │             │
        └─────────────┴─────────────┘
                      │
                      ▼
            ┌──────────────────┐
            │  GEPA Engine     │
            │ (Self-Evolution) │
            └──────────────────┘

2.2 核心代码入口:run_agent.py

Hermes 的执行循环核心在 run_agent.py

async def run_conversation(
    agent: Agent,
    messages: List[Dict],
    model: str = "claude-3-5-sonnet-20241022",
    max_iterations: int = 100,
) -> AsyncGenerator[Dict, None]:
    """
    Hermes Agent 的核心对话循环
    
    Args:
        agent: Agent 实例,包含配置和工具集
        messages: 对话历史
        model: 使用的 LLM 模型
        max_iterations: 最大迭代次数(防死循环)
    
    Yields:
        流式响应块
    """
    iteration = 0
    
    while iteration < max_iterations:
        # 1. 构建上下文(包含记忆、技能、用户画像)
        context = await build_context(agent, messages)
        
        # 2. 调用 LLM
        response = await call_llm(
            messages=context.full_messages,
            model=model,
            tools=agent.tools,
            stream=True,
        )
        
        # 3. 处理响应
        async for chunk in process_response(response, agent):
            yield chunk
            
            # 4. 触发技能创建/更新
            if should_create_skill(chunk):
                await create_or_update_skill(agent, chunk)
            
            # 5. 记忆巩固
            if should_consolidate_memory(iteration):
                await consolidate_memories(agent)
        
        # 6. 检查是否完成
        if is_conversation_complete(response):
            break
        
        iteration += 1

这个循环的关键在于第 4、5 步:在对话过程中,Agent 会自动判断是否需要创建新技能或更新记忆

2.3 Harness 安全边界

Hermes 的 Harness 系统定义了 Agent 的行为边界:

class Harness:
    """
    安全边界与反馈系统
    
    - 定义哪些操作是允许的
    - 监控 Agent 行为
    - 提供自动化评估反馈
    """
    
    ALLOWED_TOOLS = {
        "read_file", "write_file", "execute_code",
        "web_search", "web_fetch", "browser_act",
        "send_message", "schedule_task",
        # ... 40+ 内置工具
    }
    
    FORBIDDEN_OPERATIONS = {
        "delete_system_files",
        "modify_harness_config",
        "exfiltrate_data",
        "execute_unsafe_code",
    }
    
    def evaluate_action(self, action: Dict) -> HarnessFeedback:
        """
        评估 Agent 动作,返回反馈
        
        Returns:
            HarnessFeedback: 包含是否允许、建议修改、风险评估
        """
        risk_score = self._calculate_risk(action)
        
        if risk_score > self.threshold:
            return HarnessFeedback(
                allowed=False,
                reason="Risk threshold exceeded",
                suggestion=self._suggest_alternative(action),
            )
        
        return HarnessFeedback(allowed=True)

三、四层记忆架构:从"健忘"到"博闻"

3.1 记忆系统设计理念

Hermes 的记忆系统解决了三个核心问题:

  1. 存储效率:不能存所有东西,必须有选择
  2. 检索精度:需要时能精准召回相关记忆
  3. 跨会话一致性:不同入口(CLI、Telegram、Web)共享记忆

解决方案:四层记忆 + FTS5 全文检索

3.2 四层记忆详解

class MemorySystem:
    """
    四层记忆架构
    
    Layer 1: Episodic Memory(情节记忆)
        - 原始对话记录
        - 存储粒度:每次工具调用
        
    Layer 2: Semantic Memory(语义记忆)
        - LLM 提取的关键事实
        - 用户偏好、约束、习惯
        
    Layer 3: Procedural Memory(程序性记忆)
        - Skill 文件(SKILL.md)
        - 可复用的操作流程
        
    Layer 4: Meta Memory(元记忆)
        - 系统自省结果
        - 性能统计、策略优化记录
    """
    
    def __init__(self, db_path: str = "memory.db"):
        self.conn = sqlite3.connect(db_path)
        self._init_fts5()
    
    def _init_fts5(self):
        """初始化全文检索索引"""
        self.conn.executescript("""
            CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
                content,
                memory_type,
                session_id,
                timestamp,
                metadata,
                tokenize='porter unicode61'
            );
        """)
    
    async def store(self, memory: Memory) -> str:
        """存储记忆并建立索引"""
        cursor = self.conn.cursor()
        cursor.execute(
            "INSERT INTO memory_fts VALUES (?, ?, ?, ?, ?)",
            (
                memory.content,
                memory.type.value,
                memory.session_id,
                memory.timestamp.isoformat(),
                json.dumps(memory.metadata),
            )
        )
        self.conn.commit()
        return cursor.lastrowid
    
    async def retrieve(
        self,
        query: str,
        memory_types: List[str] = None,
        limit: int = 10,
    ) -> List[Memory]:
        """
        检索相关记忆
        
        支持:
        - 关键词搜索
        - 类型过滤
        - 时间范围过滤
        - 相关性排序
        """
        sql = """
            SELECT content, memory_type, session_id, timestamp, metadata
            FROM memory_fts
            WHERE memory_fts MATCH ?
        """
        params = [query]
        
        if memory_types:
            placeholders = " OR ".join(["memory_type = ?"] * len(memory_types))
            sql += f" AND ({placeholders})"
            params.extend(memory_types)
        
        sql += " ORDER BY rank LIMIT ?"
        params.append(limit)
        
        cursor = self.conn.cursor()
        return [
            Memory(
                content=row[0],
                type=MemoryType(row[1]),
                session_id=row[2],
                timestamp=datetime.fromisoformat(row[3]),
                metadata=json.loads(row[4]),
            )
            for row in cursor.execute(sql, params)
        ]

3.3 记忆策展(Memory Curation)

Hermes 的一个关键创新是:让 Agent 自己决定哪些值得记

# agent/prompt_builder.py

MEMORY_CURATION_PROMPT = """
You are running a periodic memory curation task.

Review your recent operations (last 100 actions) and decide:
1. What information is worth storing in long-term memory?
2. What can be discarded as noise?

Criteria for keeping:
- User preferences expressed explicitly
- Important decisions made
- Errors encountered and solutions found
- Patterns that might repeat

Criteria for discarding:
- Routine operations without learning value
- Temporary calculations
- Already known facts

Output a JSON list of memory entries to create/update/delete.
"""

async def curation_loop(agent: Agent, interval_minutes: int = 30):
    """
    周期性记忆策展循环
    
    每 30 分钟触发一次,让 Agent 复盘并整理记忆
    """
    while True:
        await asyncio.sleep(interval_minutes * 60)
        
        # 获取近期操作历史
        recent_actions = await get_recent_actions(agent, limit=100)
        
        # 让 LLM 决定哪些值得记
        decisions = await agent.llm.chat(
            MEMORY_CURATION_PROMPT,
            context={"recent_actions": recent_actions},
        )
        
        # 执行记忆操作
        for decision in decisions:
            if decision.action == "create":
                await agent.memory.store(decision.memory)
            elif decision.action == "update":
                await agent.memory.update(decision.memory_id, decision.content)
            elif decision.action == "delete":
                await agent.memory.delete(decision.memory_id)

这个设计的精妙之处:记忆不再是被动存储,而是主动策展。Agent 会定期"审视"自己的经历,提炼出有价值的信息存入长期记忆。


四、Skill 系统:从经验到能力的自动化沉淀

4.1 Skill 创建触发机制

Hermes 最受关注的能力是"自动创建 Skill"。但它怎么判断什么时候需要创建?

# agent/skill_manager.py

SKILL_CREATION_TRIGGERS = {
    # 触发条件 1:复杂任务完成(工具调用 >= 5 次)
    "complex_task": lambda ctx: ctx.tool_calls >= 5,
    
    # 触发条件 2:从错误中恢复
    "error_recovery": lambda ctx: ctx.had_error and ctx.resolved,
    
    # 触发条件 3:用户显式请求
    "user_request": lambda ctx: "save this" in ctx.last_message.lower(),
    
    # 触发条件 4:发现高效模式
    "pattern_found": lambda ctx: ctx.pattern_score > 0.8,
}

def should_create_skill(context: AgentContext) -> tuple[bool, str]:
    """
    判断是否应该创建 Skill
    
    Returns:
        (should_create: bool, trigger_reason: str)
    """
    for trigger_name, condition in SKILL_CREATION_TRIGGERS.items():
        if condition(context):
            return True, trigger_name
    
    return False, ""

4.2 Skill 文件格式

Hermes 的 Skill 遵循 agentskills.io 开放标准:

# SKILL.md

## Metadata
- name: deploy-python-service
- version: 1.0.3
- created: 2026-04-15
- last_updated: 2026-05-01
- triggers: ["deploy", "python service", "production release"]
- tags: ["deployment", "python", "devops"]

## Description
Deploy a Python web service to production with zero downtime.

## Prerequisites
- Docker installed
- Access to production registry
- Valid deployment credentials

## Steps

### Step 1: Build Docker Image
```bash
docker build -t registry.example.com/${SERVICE_NAME}:${VERSION} .
docker push registry.example.com/${SERVICE_NAME}:${VERSION}

Step 2: Update Kubernetes Deployment

kubectl set image deployment/${SERVICE_NAME} \
  ${SERVICE_NAME}=registry.example.com/${SERVICE_NAME}:${VERSION} \
  -n production

Step 3: Verify Deployment

kubectl rollout status deployment/${SERVICE_NAME} -n production --timeout=300s

Known Issues

  • Network timeout during push: retry with --timeout=600
  • Image pull error: check registry credentials

Validation

  • Service responds to health check endpoint
  • No pods in error state
  • Logs show successful startup

### 4.3 Skill 自动创建流程

```python
async def create_or_update_skill(
    agent: Agent,
    context: AgentContext,
) -> Optional[Skill]:
    """
    自动创建或更新 Skill
    
    流程:
    1. 分析当前对话,提取操作序列
    2. 让 LLM 生成 Skill 草稿
    3. 检查是否已存在相似 Skill(去重)
    4. 如果存在 → 更新;不存在 → 创建
    5. 写入原子文件,建立索引
    """
    # 1. 提取操作序列
    actions = extract_action_sequence(context)
    
    if not actions:
        return None
    
    # 2. LLM 生成 Skill 草稿
    skill_draft = await agent.llm.chat(
        SKILL_GENERATION_PROMPT,
        context={
            "actions": actions,
            "task_description": context.task_description,
            "errors_encountered": context.errors,
            "solutions_applied": context.solutions,
        },
    )
    
    # 3. 检查相似 Skill
    similar_skills = await agent.skill_db.search_similar(
        query=skill_draft.description,
        threshold=0.85,
    )
    
    if similar_skills:
        # 更新已有 Skill
        existing = similar_skills[0]
        return await update_skill(existing, skill_draft)
    
    # 4. 创建新 Skill
    skill = Skill(
        id=generate_skill_id(),
        name=skill_draft.name,
        description=skill_draft.description,
        steps=skill_draft.steps,
        triggers=extract_triggers(context),
        created_at=datetime.now(),
    )
    
    # 5. 原子写入
    skill_path = f"skills/{skill.id}/SKILL.md"
    await atomic_write(skill_path, skill.to_markdown())
    
    # 6. 建立索引
    await agent.skill_db.index(skill)
    
    return skill

4.4 Skill 自我优化机制

Skill 不是创建后就一成不变。Hermes 会在使用过程中持续优化:

class SkillOptimizer:
    """
    Skill 自我优化引擎
    
    触发优化的条件:
    1. Skill 执行失败
    2. 发现更高效的方法
    3. 环境变化导致不兼容
    """
    
    async def optimize(self, skill: Skill, feedback: ExecutionFeedback) -> Skill:
        """基于反馈优化 Skill"""
        
        if feedback.success:
            # 成功执行 → 可能发现优化点
            if feedback.efficiency_score > skill.efficiency_score:
                return await self._suggest_optimization(skill, feedback)
        else:
            # 执行失败 → 必须修复
            return await self._fix_skill(skill, feedback)
        
        return skill
    
    async def _fix_skill(self, skill: Skill, feedback: ExecutionFeedback) -> Skill:
        """修复失败的 Skill"""
        
        # 让 LLM 分析失败原因并建议修复
        fix_suggestion = await self.llm.chat(
            """
            The following Skill failed during execution.
            Analyze the failure and suggest fixes.
            
            Skill: {skill}
            Error: {error}
            Context: {context}
            
            Output the updated Skill in markdown format.
            """,
            context={
                "skill": skill.to_markdown(),
                "error": feedback.error_message,
                "context": feedback.execution_log,
            },
        )
        
        # 应用修复
        return Skill.from_markdown(fix_suggestion)

五、部署实战:从本地到生产

5.1 本地快速启动

# 克隆仓库
git clone https://github.com/NousResearch/hermes-agent.git
cd hermes-agent

# 创建虚拟环境
python3.11 -m venv venv
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

# 配置环境变量
export LLM_PROVIDER="openrouter"
export LLM_MODEL="anthropic/claude-3.5-sonnet"
export LLM_API_KEY="your-api-key"

# 启动 CLI 模式
python run_agent.py --mode cli

5.2 Docker 部署

# Dockerfile
FROM python:3.11-slim

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    sqlite3 \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制代码
COPY . .

# 创建数据目录
RUN mkdir -p /data/memory /data/skills

# 设置环境变量
ENV MEMORY_DB_PATH=/data/memory/memory.db
ENV SKILL_DB_PATH=/data/skills

# 启动命令
CMD ["python", "run_agent.py", "--mode", "api", "--port", "8080"]
# 构建镜像
docker build -t hermes-agent:latest .

# 运行容器
docker run -d \
  --name hermes \
  -p 8080:8080 \
  -v hermes_data:/data \
  -e LLM_PROVIDER=openrouter \
  -e LLM_API_KEY=your-key \
  hermes-agent:latest

5.3 VPS 低成本部署

Hermes 可以在 $5/月的 VPS 上运行:

# docker-compose.yml
version: '3.8'

services:
  hermes:
    image: hermes-agent:latest
    restart: unless-stopped
    environment:
      - LLM_PROVIDER=openrouter
      - LLM_MODEL=anthropic/claude-3.5-sonnet
      - LLM_API_KEY=${LLM_API_KEY}
    volumes:
      - hermes_data:/data
    ports:
      - "127.0.0.1:8080:8080"  # 仅本地访问
    
  # Telegram Gateway
  telegram-gateway:
    image: hermes-gateway-telegram:latest
    environment:
      - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
      - HERMES_API_URL=http://hermes:8080
    depends_on:
      - hermes

volumes:
  hermes_data:
# 启动服务
docker-compose up -d

# 配置 Nginx 反向代理(HTTPS)
server {
    listen 443 ssl;
    server_name hermes.yourdomain.com;
    
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

六、性能优化与调优

6.1 记忆检索优化

SQLite + FTS5 的性能瓶颈在于检索延迟。优化方案:

class OptimizedMemorySystem(MemorySystem):
    """高性能记忆系统"""
    
    def __init__(self, db_path: str):
        super().__init__(db_path)
        self._apply_optimizations()
    
    def _apply_optimizations(self):
        """应用 SQLite 性能优化"""
        self.conn.executescript("""
            -- 启用 WAL 模式(写性能提升 2-3x)
            PRAGMA journal_mode=WAL;
            
            -- 增大缓存(读取性能提升显著)
            PRAGMA cache_size=10000;
            
            -- 同步模式优化(写入延迟降低)
            PRAGMA synchronous=NORMAL;
            
            -- FTS5 特定优化
            INSERT INTO memory_fts(memory_fts) VALUES('optimize');
        """)
    
    async def retrieve_with_cache(
        self,
        query: str,
        memory_types: List[str] = None,
        limit: int = 10,
    ) -> List[Memory]:
        """
        带缓存的检索
        
        热点查询会缓存在内存中,避免重复 SQL
        """
        cache_key = f"{query}:{memory_types}:{limit}"
        
        # 检查缓存
        if cache_key in self._cache:
            return self._cache[cache_key]
        
        # 执行检索
        results = await self.retrieve(query, memory_types, limit)
        
        # 存入缓存
        self._cache[cache_key] = results
        return results

6.2 LLM 调用优化

Hermes 默认使用流式响应,但还可以进一步优化:

async def optimized_llm_call(
    messages: List[Dict],
    model: str,
    tools: List[Dict],
) -> AsyncGenerator[Dict, None]:
    """
    优化的 LLM 调用
    
    优化点:
    1. Prompt 缓存(减少重复传输)
    2. 并行工具调用
    3. 上下文压缩
    """
    
    # 1. 应用 Prompt 缓存标记
    cached_messages = mark_cacheable_messages(messages)
    
    # 2. 上下文压缩(如果超长)
    if estimate_tokens(cached_messages) > model_context_limit(model):
        cached_messages = await compress_context(cached_messages)
    
    # 3. 流式调用
    async for chunk in call_llm_stream(
        messages=cached_messages,
        model=model,
        tools=tools,
    ):
        yield chunk

6.3 Skill 加载优化

大量 Skill 时的性能问题:

class LazySkillLoader:
    """
    懒加载 Skill 系统
    
    只在需要时才加载完整内容
    """
    
    def __init__(self, skill_dir: str):
        self.skill_dir = skill_dir
        self._index: Dict[str, SkillMetadata] = {}
        self._loaded: Dict[str, Skill] = {}
    
    async def build_index(self):
        """构建轻量级索引"""
        for skill_path in glob(f"{self.skill_dir}/*/SKILL.md"):
            metadata = parse_skill_metadata(skill_path)
            self._index[metadata.id] = metadata
    
    async def get_skill(self, skill_id: str) -> Skill:
        """
        按需加载 Skill
        
        只有真正需要执行时才读取完整文件
        """
        if skill_id not in self._loaded:
            metadata = self._index[skill_id]
            full_content = await read_file(metadata.path)
            self._loaded[skill_id] = Skill.from_markdown(full_content)
        
        return self._loaded[skill_id]
    
    async def search_relevant(self, query: str, limit: int = 5) -> List[SkillMetadata]:
        """
        基于元数据搜索(不加载完整内容)
        """
        scores = []
        for skill_id, metadata in self._index.items():
            score = self._calculate_relevance(query, metadata)
            scores.append((score, metadata))
        
        scores.sort(reverse=True)
        return [m for _, m in scores[:limit]]

七、与其他框架对比

7.1 Hermes vs OpenClaw

维度Hermes AgentOpenClaw
定位自进化智能体框架AI Agent 运行时 + MCP 集成
记忆系统四层架构,原生持久化SQLite + LCM(可选)
技能系统自动创建/优化手动 Skill 文件
多平台12+ 消息平台Discord/Slack/Telegram
MCP 支持支持原生核心能力
成本$5/月 VPS可本地运行
最佳场景长期运行的"数字员工"生产级 Agent 部署

7.2 Hermes vs Claude Code

维度Hermes AgentClaude Code
形态后台服务终端工具
记忆跨会话持久会话级临时
Skill自动生成手动 .claude 配置
执行模式异步后台同步阻塞
适用场景自动化任务辅助编程

7.3 组合使用场景

场景:长期开发助手

Hermes Agent(后台) + Claude Code(终端) + OpenClaw(部署)
  • Hermes:负责后台自动化任务(定时备份、监控、报告)
  • Claude Code:负责交互式编程辅助
  • OpenClaw:负责生产环境部署

八、实战案例:个人知识助手

8.1 需求场景

一个程序员希望有 AI 助手:

  1. 记住他的技术栈偏好
  2. 自动整理阅读的论文/博客
  3. 定期生成知识报告
  4. 在 Telegram 随时交流

8.2 实现代码

# config/personal_assistant.yaml
agent:
  name: "知识小助手"
  model: "anthropic/claude-3.5-sonnet"
  
memory:
  types: ["episodic", "semantic", "procedural"]
  retention_days: 365
  
skills:
  auto_create: true
  categories: ["research", "coding", "workflow"]
  
gateways:
  telegram:
    enabled: true
    bot_token: "${TELEGRAM_BOT_TOKEN}"
  cli:
    enabled: true
    
tasks:
  - name: "每日论文摘要"
    schedule: "0 9 * * *"
    action: "summarize_recent_papers"
    
  - name: "周报生成"
    schedule: "0 18 * * 5"
    action: "generate_weekly_report"
# custom_skills/research_summary.py

from hermes import Skill, skill

@skill(
    name="summarize_recent_papers",
    triggers=["论文摘要", "paper summary"],
    description="自动从 arXiv 和 RSS 抓取论文,生成摘要"
)
class ResearchSummarySkill(Skill):
    
    async def execute(self, context: Dict) -> str:
        """执行论文摘要任务"""
        
        # 1. 获取用户偏好(从记忆)
        preferences = await self.agent.memory.retrieve(
            query="research preferences",
            memory_types=["semantic"],
        )
        topics = self._extract_topics(preferences)
        
        # 2. 抓取最新论文
        papers = await self._fetch_papers(topics)
        
        # 3. LLM 摘要
        summaries = []
        for paper in papers[:10]:
            summary = await self.agent.llm.chat(
                """
                Summarize this paper in Chinese, focusing on:
                1. Core contribution
                2. Methodology
                3. Results
                4. Why it matters to my research
                
                Paper: {title}
                Abstract: {abstract}
                """,
                context={"title": paper.title, "abstract": paper.abstract},
            )
            summaries.append(summary)
        
        # 4. 生成报告
        report = await self.agent.llm.chat(
            """
            Create a structured research summary with:
            - Key themes
            - Top 5 papers with summaries
            - Action items
            
            Papers: {summaries}
            """,
            context={"summaries": summaries},
        )
        
        # 5. 存储记忆
        await self.agent.memory.store(
            Memory(
                content=report,
                type=MemoryType.EPISODIC,
                metadata={"task": "daily_research_summary"},
            )
        )
        
        return report

8.3 部署到 VPS

# 在 $5/月 VPS 上部署
ssh user@vps

# 安装 Docker
curl -fsSL https://get.docker.com | sh

# 克隆配置
git clone https://github.com/yourname/hermes-personal-assistant.git
cd hermes-personal-assistant

# 配置环境变量
cat > .env << EOF
LLM_PROVIDER=openrouter
LLM_API_KEY=your-key
TELEGRAM_BOT_TOKEN=your-token
EOF

# 启动
docker-compose up -d

# 查看日志
docker-compose logs -f

九、进阶话题:GEPA 自我进化引擎

9.1 GEPA 架构

GEPA(General Evolutionary Policy Architecture)是 Hermes 的核心创新:

┌─────────────────────────────────────────────┐
│                GEPA Engine                    │
│                                              │
│  ┌─────────────────────────────────────────┐│
│  │     Policy Network (可进化的策略)        ││
│  │  - Prompt 模板                          ││
│  │  - 工具选择策略                          ││
│  │  - 记忆检索策略                          ││
│  └─────────────────────────────────────────┘│
│                    │                         │
│                    ▼                         │
│  ┌─────────────────────────────────────────┐│
│  │     Feedback Collector                   ││
│  │  - 任务成功率                            ││
│  │  - 用户满意度                            ││
│  │  - 效率指标                              ││
│  └─────────────────────────────────────────┘│
│                    │                         │
│                    ▼                         │
│  ┌─────────────────────────────────────────┐│
│  │     Evolution Optimizer                  ││
│  │  - 变异:微调策略参数                    ││
│  │  - 选择:保留优秀策略                    ││
│  │  - 交叉:组合成功策略                    ││
│  └─────────────────────────────────────────┘│
└─────────────────────────────────────────────┘

9.2 策略进化示例

class PolicyEvolver:
    """
    策略进化器
    
    让 Agent 的行为策略随时间优化
    """
    
    async def evolve_policy(
        self,
        policy: Policy,
        feedback_history: List[Feedback],
    ) -> Policy:
        """
        基于历史反馈进化策略
        
        使用遗传算法变体:
        1. 变异:随机微调参数
        2. 选择:保留高成功率变体
        3. 交叉:组合成功策略片段
        """
        
        # 1. 生成变异
        variants = await self._mutate(policy, n=5)
        
        # 2. 评估变体
        scores = []
        for variant in variants:
            score = await self._evaluate(variant, feedback_history)
            scores.append((score, variant))
        
        # 3. 选择最优
        scores.sort(reverse=True)
        best_variant = scores[0][1]
        
        # 4. 如果显著优于原策略,替换
        if scores[0][0] > policy.score * 1.1:
            return best_variant
        
        return policy

十、总结与展望

10.1 Hermes Agent 的核心价值

Hermes Agent 的突破在于真正实现了 AI Agent 的自我进化

  1. 记忆闭环:不再是被动存储,而是主动策展
  2. Skill 自动化:从经验中沉淀可复用能力
  3. 策略进化:行为模式随使用持续优化

10.2 适用场景

场景推荐度说明
个人知识助手⭐⭐⭐⭐⭐完美契合长期记忆需求
开发自动化⭐⭐⭐⭐⭐Skill 沉淀价值巨大
内容创作助手⭐⭐⭐⭐风格记忆能力强
多 Agent 编排⭐⭐⭐子 Agent 支持有限
客服机器人⭐⭐需要 RAG 增强

10.3 未来展望

Hermes Agent 代表了 AI Agent 发展的重要方向:从工具到伙伴。随着多模态能力增强和更高效的进化算法,未来的 Agent 将:

  • 更精准地理解用户意图
  • 更高效地积累专业知识
  • 更自然地融入工作流程

2026 年,我们正在见证 AI Agent 从"聊天机器人"向"数字同事"的历史性跨越。


附录:关键命令速查

# 安装
pip install hermes-agent

# 启动 CLI
hermes run --mode cli

# 启动 API
hermes run --mode api --port 8080

# 连接 Telegram
hermes gateway add telegram --token $TOKEN

# 查看记忆
hermes memory list --type semantic

# 导出 Skill
hermes skill export --format markdown

# 配置模型
hermes config set model anthropic/claude-3.5-sonnet

项目地址:https://github.com/NousResearch/hermes-agent
文档:https://docs.hermesagent.ai
中文社区:https://hermesagentai.cn
Star 数:47,000+(截至 2026-05-07)


本文约 8,500 字,涵盖 Hermes Agent 的核心架构、部署实战和进阶用法。希望能帮助你理解并应用这个革命性的 AI Agent 框架。

复制全文 生成海报 AI Agent 开源 框架 自进化

推荐文章

7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
404错误页面的HTML代码
2024-11-19 06:55:51 +0800 CST
Python设计模式之工厂模式详解
2024-11-19 09:36:23 +0800 CST
Golang 中应该知道的 defer 知识
2024-11-18 13:18:56 +0800 CST
Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
Elasticsearch 文档操作
2024-11-18 12:36:01 +0800 CST
filecmp,一个Python中非常有用的库
2024-11-19 03:23:11 +0800 CST
CentOS 镜像源配置
2024-11-18 11:28:06 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
防止 macOS 生成 .DS_Store 文件
2024-11-19 07:39:27 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
程序员茄子在线接单