1. Hermes Agent 记忆系统架构概览Hermes Agent 的记忆系统采用四层栈式设计每一层解决不同维度的记忆需求。这种分层架构体现了核心简洁、扩展丰富的设计哲学既保证了基础功能的可靠性又为高级功能提供了灵活的扩展点。1.1 四层记忆栈详解Layer 1内建文件记忆实现方式两个Markdown文件MEMORY.md和USER.md容量限制MEMORY.md 2200字符USER.md 1375字符特点始终启用不依赖外部服务采用冻结快照机制典型内容MEMORY.md环境事实、项目约定、工具特性USER.md用户偏好、沟通风格、个人习惯Layer 2会话持久化实现方式SQLite数据库FTS5全文索引功能特点记录完整对话历史支持跨会话语义检索通过session_search工具与Layer 1的定位区分原始过程 vs 提炼事实Layer 3上下文窗口管理核心组件ContextCompressor触发条件上下文窗口使用率≥50%五阶段压缩流程工具输出裁剪零成本头部保护保留前3条消息尾部token预算从后向前累积LLM生成结构化摘要迭代更新已有摘要Layer 4外部记忆提供者设计模式插件系统MemoryProvider ABC当前支持Honcho、Mem0等8种后端约束条件同一时间只允许激活一个外部provider1.2 关键设计原则有界性Bounded字符硬限制防止记忆膨胀MEMORY.md2200字符约800 tokensUSER.md1375字符约500 tokens采用字符而非token计数的原因模型无关性策展式CuratedAgent主动决定保存内容保存优先级用户偏好和纠正环境事实流程知识通过memory工具的schema嵌入行为引导缓存友好Cache-Friendly冻结快照模式保护提示词前缀缓存写入立即持久化但下个session才生效唯一例外上下文压缩时重建系统提示词2. 内建记忆系统核心技术2.1 双态存储引擎MemoryStore类实现双态管理class MemoryStore: def __init__(self): self.memory_entries: List[str] [] # 活跃状态 self.user_entries: List[str] [] # 活跃状态 self._system_prompt_snapshot {} # 冻结快照冻结快照在load_from_disk()时捕获用于系统提示词注入session内保持不变保证前缀缓存稳定活跃状态由工具调用实时修改每次修改立即持久化到磁盘工具响应反映活跃状态2.2 原子写入与并发安全写入流程创建临时文件写入内容并刷盘原子rename替换原文件staticmethod def _write_file(path: Path, entries: List[str]): tmp_path tempfile.mkstemp(dirpath.parent, prefix.mem_) try: with open(tmp_path, w) as f: f.write(content) f.flush() os.fsync(f.fileno()) os.replace(tmp_path, path) # 原子操作 except: os.unlink(tmp_path) raise并发控制使用分离的.lock文件而非flock()原因避免w模式截断文件造成的竞态条件锁文件与数据文件分离不影响原子替换2.3 记忆安全扫描记忆内容被注入系统提示词需防范Prompt注入攻击角色劫持秘密泄露持久化后门防御措施12种正则模式检测威胁_MEMORY_THREAT_PATTERNS [ (rignore\sprevious\sinstructions, prompt_injection), (ryou\sare\snow\s, role_hijack), # 其他10种模式... ]检测10种不可见Unicode字符写入前自动扫描内容3. 冻结快照与提示词缓存3.1 缓存经济学Anthropic的system_and_3缓存策略系统提示词最高优先级缓存点最近3条非系统消息滚动窗口节省约75%的token处理成本关键洞察系统提示词的稳定性比记忆实时性更重要。3.2 冻结快照实现加载时捕获快照def load_from_disk(self): self.memory_entries self._read_file(MEMORY.md) self.user_entries self._read_file(USER.md) self._system_prompt_snapshot { # 冻结点 memory: self._render_block(memory, self.memory_entries), user: self._render_block(user, self.user_entries), }系统提示词注入始终使用冻结快照活跃状态的修改不影响当前session的提示词新写入内容在下个session生效3.3 缓存失效策略唯一重建时机上下文压缩压缩导致消息序列结构改变缓存必然失效顺带重新加载记忆快照def _invalidate_system_prompt(self): self._cached_system_prompt None self._memory_store.load_from_disk() # 重新加载快照4. 记忆提供者插件系统4.1 MemoryProvider ABC核心生命周期方法class MemoryProvider(ABC): abstractmethod def initialize(self, session_id: str, **kwargs): ... abstractmethod def prefetch(self, user_message: str) - str: ... abstractmethod def sync_turn(self, user_msg: str, assistant_msg: str): ... abstractmethod def shutdown(self): ...可选钩子on_turn_start轮次计数on_session_end会话摘要on_pre_compress压缩前提取on_memory_write内建记忆同步on_delegation子Agent观察4.2 提供者案例Honcho工具集honcho_profile用户画像卡片honcho_search语义搜索honcho_context辩证问答honcho_conclude持久化结论节流机制injection_frequency每轮/首轮context_cadence上下文API调用间隔dialectic_cadence辩证API调用间隔reasoning_level_cap推理级别上限4.3 提供者案例Holographic纯本地特性SQLite存储事实可选HRRHolographic Reduced Representations代数无外部API依赖特色工具probe实体召回related结构邻接reason组合查询contradict矛盾检测5. 上下文窗口管理5.1 压缩触发条件双重检测机制预检preflight基于消息长度的粗略估算快速判断是否需要压缩精确检测使用实际tokenizer阈值context_length × 50%5.2 五阶段压缩算法工具输出裁剪目标旧的大体积tool消息替换为[Old tool output cleared]零成本操作头部保护保留前3条消息系统提示初始交互建立对话基本上下文尾部token预算def _find_tail_cut_by_tokens(messages, budget): for i in range(len(messages)-1, head_end-1, -1): msg_tokens estimate_tokens(messages[i]) if accumulated msg_tokens budget: break accumulated msg_tokensLLM结构化摘要模板包含Goal/Progress/Key DecisionsNext Steps/Critical Context增量更新已有摘要迭代更新保留前次摘要作为基础只补充新内容避免信息衰减5.3 记忆冲刷机制流程注入系统消息 [System: The session is being compressed...]单次API调用仅memory工具可用Agent决定保存内容执行memory工具调用清理冲刷相关消息设计要点使用唯一哨兵标记定位清理范围优先使用辅助LLM客户端更便宜模型冲刷的memory调用会同步到外部provider6. 生产环境实践建议6.1 容量规划MEMORY.md2200字符 ≈ 800 tokens英文中文等语言token效率更高使用率提示[67% — 1,474/2,200 chars]优化策略定期清理过时条目合并相关事实用缩写替代完整短语6.2 安全配置必做检查启用内存扫描memory: security_scan: true限制记忆工具调用权限审计MEMORY.md变更历史高级防护自定义威胁模式CUSTOM_THREATS [ (rcompany\-specific\-threat, custom_threat) ]定期轮换存储路径6.3 性能调优缓存优化保持系统提示词稳定减少不必要的压缩适当增大压缩阈值外部provider选择低延迟场景Holographic纯本地复杂查询场景Honcho辩证推理存储敏感场景RetainDBDelta压缩6.4 监控指标关键metric记忆写入频率压缩触发次数外部provider延迟缓存命中率安全扫描拦截次数日志示例[memory] flush_memories saved 3 entries [compressor] reduced ctx from 12k→4k tokens [honcho] prefetch latency142ms7. 架构演进与边界案例7.1 设计决策验证字符vs Token限制问题不同模型tokenizer不同验证跨模型测试Claude vs GPT-4结论字符计数确保一致性双文件分离问题为何不合并验证多用户场景测试结论支持独立配置/隔离7.2 已知边界案例中文处理现象字符限制下中文信息密度更高建议动态调整字符限制def adjust_for_cjk(limit): return int(limit * 1.3) # CJK补偿系数长会话稳定性现象50轮次后压缩质量下降方案引入会话分段if turn_count 50: self._segment_session()7.3 演进路线短期规划记忆版本控制差分同步外部provider基于信任评分的自动清理长期方向分层记忆生命周期联合压缩策略神经记忆索引