深入浅出 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 设计原则总结
- 学习优先:不是执行工具,而是从执行中学习
- 记忆即身份:Agent 的本质是其积累的记忆
- 用户为中心:深度理解用户,而非通用响应
- 无处不在:灵活部署,不绑定特定环境
- 开放生态:标准化接口,社区共建
9.2 为什么这很重要?
当前大多数 AI Agent 是"无状态"的------每次对话都是新的开始。
Hermes Agent 探索的是"有状态"的路径------像人类一样,从经验中成长。
这不仅是技术架构的差异,更是AI 范式的转变:
从:LLM + Prompt → 响应
到:LLM + 记忆 + 技能 + 用户模型 → 持续进化的伙伴
参考资源
- 官方文档: https://hermes-agent.nousresearch.com/docs/
- 架构详解: https://hermes-agent.nousresearch.com/docs/developer-guide/architecture
- GitHub 仓库: https://github.com/NousResearch/hermes-agent
- Skill 标准: https://agentskills.io
评论区互动
你对 Hermes Agent 的哪个架构设计最感兴趣?你觉得自进化 AI 的未来会怎样?欢迎讨论!
本文基于 Hermes Agent 开源代码和官方文档分析整理,如有理解偏差欢迎指正。
标签: #HermesAgent #AI架构 #Agent设计 #自进化AI #系统架构 #深度解析
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/\[your_username\]/article/details/\[article_id\]