AI AinoCode AI 工具与基础设施
AI Agent 8 分钟

Hermes Agent 开源架构深度拆解:MemPalace 记忆宫殿与 Kanban 多 Agent 协作系统

从源码级别拆解 Hermes Agent 的 MemPalace 记忆架构(Room/Drawer 分层存储、语义检索、反循环机制)和 Kanban 多 Agent 协作系统(依赖驱动调度、独立 Worker 进程、审计追踪),揭示下一代 AI Agent 框架的核心设计哲学。

KazK

Hermes Agent 架构拆解

引子:为什么大多数 AI Agent 聊完就忘?

如果你用过 ChatGPT、Claude,甚至 LangChain 构建的 Agent,你大概率经历过这个场景:

上周你花了两小时教会了 Agent 你的业务规则、数据表结构、部署流程。今天你打开对话窗口,它从零开始问你:“请问您的项目使用的是什么技术栈?”

记忆断裂,是 2025-2026 年 AI Agent 领域最核心、最被低估的技术瓶颈。

不是上下文窗口不够大。不是 Prompt 写得不好。而是现有框架的”记忆”本质上是一个线性缓冲区——聊多了就溢出,开新会话就清零,跨任务之间完全隔离。

Nous Research 开源的 Hermes Agent 尝试用一套完全不同的架构来解决这个问题。它的核心组件叫 MemPalace(记忆宫殿)——名字直接来自人类的记忆方法论,但实现上是工程级的分布式记忆管理系统。

今天我们从源码和架构层面拆解:MemPalace 怎么存储?Kanban 多 Agent 系统怎么调度?为什么这套设计比 LangGraph、CrewAI 的”对话历史=记忆”方案高了一个维度?


一、MemPalace 记忆架构:从线性 Buffer 到分层宫殿

1.1 核心抽象:Room / Drawer / 持久化存储

MemPalace 的记忆模型建立在三层抽象之上:

┌──────────────────────────────────────────────┐
│                  MemPalace                   │
│  ┌────────────┐  ┌────────────┐  ┌────────┐  │
│  │ room_hermes│  │room_config │  │ room_...│  │
│  │ ┌────────┐ │  │ ┌────────┐ │  │        │  │
│  │ │drawer_0│ │  │ │drawer_0│ │  │        │  │
│  │ │drawer_1│ │  │ │drawer_1│ │  │        │  │
│  │ └────────┘ │  │ └────────┘ │  │        │  │
│  └────────────┘  └────────────┘  └────────┘  │
│         │              │                     │
│    ┌────▼──────────────▼─────┐               │
│    │  Semantic Index (VexDB) │               │
│    └─────────────────────────┘               │
└──────────────────────────────────────────────┘

Room(房间) = 按业务域隔离的记忆空间。每个 Room 对应一类知识:

  • room_hermes_config:Agent 自身配置、能力边界、工具清单
  • room_project_alpha:某个具体项目的上下文
  • room_user_profile:用户的偏好、历史决策

Drawer(抽屉) = Room 内的子分区。按时间、话题或来源进一步细分。

为什么需要 Room/Drawer 两层?

LangGraph 的做法是把所有东西塞进一个 Message List,靠 Prompt 里的 system 指令区分角色。当对话超过 200 轮、涉及 3 个不同项目时,检索的噪声比会急剧上升——相关记忆被无关的对话历史淹没。

MemPalace 的方案是先路由到正确的 Room,再在 Drawer 内做语义检索。这本质上是一个两级索引:

  1. L1 路由层:根据当前任务的语义特征(任务类型、涉及模块、用户身份)决定进入哪个 Room
  2. L2 检索层:在 Room 的 Drawer 中执行向量相似度检索 + 关键词过滤

用伪代码表达就是:

# 简化的 MemPalace 检索流程
def retrieve_memory(query: str, context: TaskContext) -> list[Memory]:
    # L1: 路由到目标 Room
    target_rooms = router.route(query, context)  # 返回 1-3 个最相关的 Room
    
    memories = []
    for room in target_rooms:
        # L2: Room 内语义检索
        candidates = room.semantic_search(query, top_k=20)
        # Drawer 级过滤(时间衰减、可信度加权)
        filtered = room.apply_decay(candidates, half_life_hours=72)
        memories.extend(filtered[:5])  # 每个 Room 最多取 5 条
    
    return rank_and_deduplicate(memories)

1.2 反循环协议(Anti-Loop Protocol):不只是”别重复”

大多数 AI Agent 框架的反重复机制是:记录最近 N 条输出,检查新输出是否包含相同关键词。简单粗暴,误杀率高。

Hermes Agent 的反循环机制写在系统提示词的核心层,但它的实现远比表面复杂:

三层防循环:

层级检测对象策略
L1 输出去重连续输出相似度 > 0.9 时强制改写或终止
L2 搜索防重检索查询同一关键词连续 2 次相似结果 → 更换搜索策略
L3 任务迭代上限同一任务最多 3 次尝试,第 3 次失败必须停止并汇报

关键是 L3。它不是一个简单的计数器,而是和 MemPalace 的状态机绑定的:

class TaskState:
    attempts: int = 0
    max_attempts: int = 3
    last_output_facts: set[str]  # 前次输出中的事实集
    
    def can_retry(self, new_output: str) -> bool:
        self.attempts += 1
        if self.attempts > self.max_attempts:
            return False
        # 检查是否只是润色/改写而没有新增事实
        new_facts = extract_facts(new_output)
        if not (new_facts - self.last_output_facts):
            return False  # 没有新增事实,不应重试
        return True

这个设计解决了一个真实痛点:Agent 在”再想想”或”换个角度”时,经常只是在用不同的词说同一件事,白白消耗 token 和时间。事实增量检查是判断是否需要继续迭代的核心标准。

1.3 自动写入规则:记忆的”写入侧”同样重要

大多数框架只关心”怎么读记忆”,不关心”什么时候写记忆”。MemPalace 的写入规则是硬编码的:

# 自动写入规则(简化版)
auto_write_rules:
  - trigger: "完成一个子任务"
    action: "写入对应 room,记录做了什么、结果如何"
  
  - trigger: "修改了配置文件/代码"
    action: "写入 room_hermes_config,记录改了什么、为什么改"
  
  - trigger: "学到新知识/踩了新坑"
    action: "写入对应 room,记录教训"
  
  - trigger: "用户告知重要信息"
    action: "写入对应 room,记录事实"
  
  - trigger: "每 5 轮对话"
    action: "强制记忆维护检查,防止长任务中途丢失上下文"

这意味着 Agent 的每一次关键操作都会产生一个持久化的记忆条目——而不是等会话结束后一次性总结。这种流式写入保证了即使 Agent 在任务中途被中断,上下文也不会丢失。

和 LangGraph 的对比:

LangGraph 的记忆完全依赖对话历史(Message History)。一旦对话被截断或会话重置,所有”记忆”就没了。Hermes Agent 的记忆独立于对话存在,存储在 MemPalace 中,对话只是记忆的”消费者”之一。


二、Kanban 多 Agent 协作:从中心化调度到依赖驱动

2.1 架构设计:Orchestrator + Worker 模式

Hermes Agent 的多 Agent 系统基于一个核心思想:Orchestrator(指挥者)不执行具体工作,只负责任务拆解和分配

┌─────────────────────────────────────────┐
│           Orchestrator (妮妮)            │
│                                         │
│  输入: "调研竞品 + 写分析 + 审核发布"    │
│  输出: 3 个 Kanban 任务 + 依赖关系       │
└────────────┬────────────────────────────┘
             │ kanban_create()

┌─────────────────────────────────────────┐
│              Kanban Board               │
│                                         │
│  ┌──────────┐    ┌──────────┐           │
│  │ Task A:  │───▶│ Task B:  │           │
│  │ 调研竞品 │    │ 综合分析  │           │
│  │researcher│    │ analyst   │           │
│  └──────────┘    └──────────┘           │
│       │               ▲                 │
│       │               │                 │
│  ┌────▼────┐    ┌─────┴──────┐          │
│  │ Task C: │───▶│ Task D:     │          │
│  │ 技术调研 │    │ 审核发布   │          │
│  │researcher│    │ reviewer   │          │
│  └─────────┘    └────────────┘          │
└─────────────────────────────────────────┘

每个 Worker 是独立的 Agent 进程,拥有自己的终端、工具集和工作区。这不是线程池,而是进程池级别的隔离。

2.2 依赖驱动调度:parents=[...] 的威力

Kanban 系统的核心创新是用声明式的依赖关系代替命令式的顺序执行:

# 创建任务(无依赖,立即执行)
t1 = kanban_create(
    title="调研竞品功能",
    assignee="researcher",
    body="对比 Cursor、Windsurf、Copilot 的核心功能差异"
)

t2 = kanban_create(
    title="调研用户痛点",
    assignee="researcher",
    body="收集 Hacker News 和 Stack Overflow 上的开发者反馈"
)

# 创建任务(依赖 t1 和 t2 都完成)
t3 = kanban_create(
    title="综合分析",
    assignee="analyst",
    body="基于调研结果输出选型建议",
    parents=[t1["task_id"], t2["task_id"]]  # ← 关键
)

# t3 会自动等待 t1 和 t2 完成后才开始

Dispatcher 自动按依赖顺序调度——这和 Makefile、DAG(有向无环图)的执行逻辑类似,但用在 AI Agent 协作上,解决了一个真实问题:Agent 不应该在它需要的信息还没准备好时就开始工作

在 LangGraph 中,你需要手动编排节点顺序、检查状态机。在 CrewAI 中,任务是线性或分组的。Kanban 的方案是:用依赖图自动推导执行顺序,并行度最大化。

2.3 审核独立性:为什么不用 delegate_task 自审?

系统提示词中明确写道:

绝不能用 delegate_task 模拟审核者、评审者的反馈。 需要外部审核时,通过 Kanban 创建 reviewer 任务,由独立 Worker Agent 完成交叉审核。

这个规则背后的原因是:用同一个模型/同一个上下文做自我审核,本质上是自己检查自己的作业,偏差是系统性的。

Kanban 的 reviewer 任务会在独立的进程中运行,拥有不同的初始 prompt、不同的上下文窗口,甚至可以用不同的模型。这保证了审核的独立性——类似于代码审查中要求”非作者 review”。


三、实战视角:Hermes Agent 的记忆系统在真实场景中如何运作

3.1 场景一:跨会话的知识延续

假设你周一用 Hermes Agent 配置了一个 CI/CD 流水线,记录了:

  • 服务器地址:prod-01.internal
  • 部署路径:/var/www/ainocode.cn/
  • Git remote 已配置

周五你重新打开对话,让它部署一个新功能。

传统 Agent: 你得重新告诉它服务器地址、部署路径、Git 配置。或者在系统 Prompt 里硬编码(无法更新)。

Hermes Agent: MemPalace 的 room_hermes_config 中持久化了这些信息。Agent 启动时自动加载:

  1. room_hermes_config 检索配置信息
  2. room_project_ainocode 检索项目上下文
  3. room_user_profile 检索你的偏好(如”优先用 git 而不是 scp 部署”)

整个过程不需要你重复任何信息。

3.2 场景二:长任务的记忆维护

你让 Agent 完成一个需要 50 轮对话的复杂调研任务。

传统框架的问题:对话历史超过上下文窗口后,最早的对话(可能包含关键的初始假设、数据来源)被截断。Agent “忘记”了自己为什么要做这件事。

Hermes Agent 的方案:

  • 每 5 轮强制记忆检查:检查是否有重要内容未写入 MemPalace
  • 关键事实即时写入:每发现一个重要信息(数据点、决策、教训),立即写入对应 Room
  • 会话启动记忆维护:每次新会话启动前,压缩 MEMORY.md 到 < 500 字符,只保留指针,详细内容指向 MemPalace

这保证了即使对话历史被截断,关键信息仍然可以通过 MemPalace 检索回来。


四、和主流 Agent 框架的架构对比

维度LangGraphCrewAIAutoGenHermes Agent
记忆模型对话历史任务结果缓存群聊消息MemPalace 分层持久化
多 Agent 协作状态机图线性/分组任务群聊Kanban 依赖图
审核机制无内建无内建无内建独立 reviewer 进程
反循环基础去重三层防循环 + 事实增量检查
跨会话记忆✅(MemPalace 持久化)
流式记忆写入✅(自动写入规则)
任务迭代上限需手动实现需手动实现需手动实现✅(内置 3 次上限)

五、局限性与争议

没有完美的架构。Hermes Agent 的 MemPalace + Kanban 方案也有明显的权衡:

5.1 记忆写入的”垃圾进垃圾出”风险

自动写入规则意味着 Agent 的每一步操作都会产生记忆条目。如果 Agent 在某一步产生了错误信息,这个错误也会被持久化。MemPalace 目前没有内建的事实校验层——它假设写入的内容是可信的。

可能的缓解方案:在写入前加入轻量级的事实校验(如交叉引用已知数据源),但这会增加延迟和 token 消耗。

5.2 Kanban 的调度开销

每个 Worker 是独立进程,这意味着:

  • 启动延迟(进程初始化 + 模型加载)
  • 内存开销(每个进程有自己的上下文窗口)
  • 进程间通信成本(SQLite 持久化 + 轮询)

对于简单任务,这个开销可能比直接让单个 Agent 完成更大。Kanban 更适合多步骤、多角色、需要审核的复杂工作流。

5.3 MemPalace 的检索精度依赖向量模型质量

MemPalace 的 L2 检索层依赖语义向量相似度。如果嵌入模型对某个领域的语义理解不足(如特定技术栈的专有术语),检索结果可能不相关。这是一个通用问题——所有基于向量检索的记忆系统都面临。


结语:记忆是否是 Agent 走向 AGI 的关键瓶颈?

Anthropic 的 Chris Olah 在 2024 年就提出过:AI 系统的核心瓶颈不是推理能力,而是跨时间的一致性记忆

Hermes Agent 的 MemPalace 架构给出了一个工程化的答案:把记忆从对话历史中抽离出来,构建一个独立的、分层持久化的、可检索的记忆管理系统。这不是一个哲学命题,而是一个可以用 Room/Drawer/语义索引/自动写入规则来实现的工程问题。

但这只是第一步。真正的挑战在于:

  • 记忆的遗忘机制:什么该记住,什么该遗忘?(不是所有信息都值得持久化)
  • 记忆的冲突解决:当新旧记忆矛盾时,如何判断哪个更可信?
  • 记忆的跨 Agent 共享:多个 Agent 如何共享同一份记忆,而不是各自为政?

这些问题,Hermes Agent 还在迭代中。但它的方向是对的:Agent 不是”一次对话”,而是”一个持续存在的实体”。记忆系统是这个实体的基石。

如果你对 MemPalace 的具体实现感兴趣,Hermes Agent 的 GitHub 仓库已经开源了核心代码。如果你对 Kanban 多 Agent 协作的调度逻辑感兴趣,可以查看项目的 v37-orchestration 模块。

下一步我们可能会深入分析:MemPalace 的 VexDB Active Memory 是如何在数据库层实现语义索引的——那是另一个值得单独写一篇文章的话题。