揭秘Hermes Agent的持久化记忆系统:让AI真正记住你的偏好与习惯
Hermes Agent是一款智能AI助手,其核心优势在于拥有强大的持久化记忆系统,能够跨会话记住用户的偏好与习惯。这个创新的记忆系统通过文件持久化技术,让AI不再是"健忘"的工具,而是能随着使用时间推移变得更加智能和个性化的助手。
Hermes Agent记忆系统的核心设计理念
Hermes Agent的记忆系统采用了双存储设计,将记忆分为两个独立的部分:
- MEMORY.md:存储AI代理的个人笔记和观察结果,包括环境事实、项目约定、工具特性以及学习到的知识
- USER.md:记录AI对用户的了解,包括偏好、沟通风格、期望和工作流习惯
这两个文件都存储在~/.hermes/memories目录下,采用文件持久化方式确保数据不会因会话结束而丢失。系统在会话开始时会将这些记忆作为快照注入到系统提示中,而会话中的更新会立即写入磁盘,但不会改变当前会话的系统提示,这种设计既保证了记忆的持久性,又维持了系统提示的稳定性。
记忆系统的工作原理与技术实现
Hermes Agent的记忆系统通过MemoryStore类实现核心功能,该类维护着两种并行状态:
- 系统提示快照:在会话开始时冻结,用于系统提示注入,整个会话期间保持不变,确保前缀缓存稳定
- 实时状态:通过工具调用进行修改,并即时持久化到磁盘,工具响应始终反映最新状态
记忆条目使用特殊的分隔符§(段落符号)进行分隔,支持多行条目。系统对记忆内容实施字符限制(而非 tokens),确保跨模型兼容性,其中MEMORY.md限制为2200字符,USER.md限制为1375字符。
# 记忆存储的初始化代码 class MemoryStore: def __init__(self, memory_char_limit: int = 2200, user_char_limit: int = 1375): self.memory_entries: List[str] = [] self.user_entries: List[str] = [] self.memory_char_limit = memory_char_limit self.user_char_limit = user_char_limit # 系统提示快照 - 在load_from_disk()时设置一次 self._system_prompt_snapshot: Dict[str, str] = {"memory": "", "user": ""}记忆操作的原子性保证
为确保记忆数据的完整性,系统采用了原子写入技术:
@staticmethod def _write_file(path: Path, entries: List[str]): """使用原子临时文件+重命名写入条目到内存文件""" content = ENTRY_DELIMITER.join(entries) if entries else "" try: # 在同一目录下写入临时文件(保证同一文件系统上的原子重命名) fd, tmp_path = tempfile.mkstemp( dir=str(path.parent), suffix=".tmp", prefix=".mem_" ) try: with os.fdopen(fd, "w", encoding="utf-8") as f: f.write(content) f.flush() os.fsync(f.fileno()) os.replace(tmp_path, str(path)) # 在同一文件系统上是原子操作 except BaseException: # 任何失败时清理临时文件 try: os.unlink(tmp_path) except OSError: pass raise except (OSError, IOError) as e: raise RuntimeError(f"Failed to write memory file {path}: {e}")这种方法避免了传统文件写入可能导致的部分写入或文件损坏问题,确保了记忆数据的可靠性。
安全防护:防止记忆注入攻击
记忆系统是AI的核心组成部分,安全至关重要。Hermes Agent实现了多层次防护机制:
- 内容扫描:检查记忆内容中是否包含提示注入、角色劫持、秘密窃取等威胁模式
- 不可见字符检测:识别并阻止包含零宽空格等不可见字符的内容,防止隐藏注入
- 操作限制:严格控制记忆的添加、修改和删除权限
def _scan_memory_content(content: str) -> Optional[str]: """扫描内存内容中的注入/窃取模式。如果被阻止,返回错误字符串。""" # 检查不可见unicode字符 for char in _INVISIBLE_CHARS: if char in content: return f"Blocked: content contains invisible unicode character U+{ord(char):04X} (possible injection)." # 检查威胁模式 for pattern, pid in _MEMORY_THREAT_PATTERNS: if re.search(pattern, content, re.IGNORECASE): return f"Blocked: content matches threat pattern '{pid}'. Memory entries are injected into the system prompt and must not contain injection or exfiltration payloads." return None这些安全措施确保了记忆系统不被恶意利用,保护AI和用户的安全。
实用记忆管理功能
Hermes Agent提供了直观的记忆管理工具,通过简单的API即可完成记忆的增删改查:
- 添加记忆:使用
add动作添加新的记忆条目,系统会自动检查字符限制和重复内容 - 替换记忆:使用
replace动作更新现有条目,通过唯一子字符串匹配定位条目 - 删除记忆:使用
remove动作删除条目,同样通过子字符串匹配定位
def memory_tool( action: str, target: str = "memory", content: str = None, old_text: str = None, store: Optional[MemoryStore] = None, ) -> str: """记忆工具的单一入口点。调度到MemoryStore方法。返回JSON字符串结果。""" # 实现记忆操作的核心逻辑系统还会自动计算记忆使用率,并在接近容量上限时提醒用户进行整理,保持记忆系统的高效运行。
记忆系统的最佳实践
要充分利用Hermes Agent的记忆系统,建议遵循以下最佳实践:
主动记忆重要信息:
- 用户分享的偏好、习惯或个人细节(姓名、角色、时区、编码风格)
- 环境相关信息(操作系统、已安装工具、项目结构)
- 用户的纠正或明确要求记住的内容
- 特定于用户设置的约定、API特性或工作流
合理分类记忆:
- 将与用户相关的信息存入"user"目标
- 将环境和学习到的知识存入"memory"目标
保持记忆精简:
- 避免存储琐碎或明显的信息
- 不存储容易重新发现的内容
- 避免原始数据转储,提炼关键信息
定期整理记忆:
- 当记忆使用率超过80%时,主动合并或精简条目
- 及时删除过时或不再相关的信息
通过遵循这些实践,用户可以让Hermes Agent随着使用时间的推移变得越来越智能,真正成为理解用户需求的个性化助手。
总结:持久化记忆如何改变AI交互体验
Hermes Agent的持久化记忆系统通过创新的双存储设计、原子写入技术和安全防护机制,解决了传统AI助手"健忘"的痛点。这个系统不仅能记住用户的偏好和习惯,还能学习环境知识和工作流程,随着使用时间的积累,提供越来越个性化和高效的服务。
无论是个人用户还是开发团队,都能从这个持久化记忆系统中获益:个人用户获得更加贴心的智能助手,开发团队则能构建持续学习和适应的AI工作流。随着AI技术的不断发展,持久化记忆必将成为智能助手的核心竞争力之一。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考