📝 Hermes 有界记忆管理速记笔记
1. 核心痛点与选型
- 问题:记忆无上限,Token 有上限。简单截断导致失忆(金鱼脑),不处理导致 Context 溢出报错。
- 方案:有界记忆管理(字符限制 + 压缩策略 + 快照机制)。
- 选型建议:
- 短任务 → 滑动窗口
- 长任务/自主执行 → 有界压缩
2. 持久记忆:字符限制与硬拒策略
- 边界定义:使用字符数而非 Token 数(模型无关性,适配 200+ 模型)。
MEMORY.md:2200 字符(~800 tokens),存环境事实/项目约定。USER.md:1375 字符(~500 tokens),存用户画像。
- 溢出处理:硬拒写入(Hard Reject),不静默截断。
- 返回
current_entries,让 Agent 自主决策删旧添新。
- 返回
3. 对话历史:三阶段递进压缩
当 Context 使用率达到 50% 时触发,按顺序执行:
- 工具输出预剪枝(零成本):
- 将大块日志替换为摘要(如
[read_file] read config.py (12,000 chars))。
- 将大块日志替换为摘要(如
- 头尾保护(零成本):
- 头部:System Prompt + 前 3 条非系统消息。
- 尾部:保留最近约 20% 的 Token 预算。
- LLM 结构化摘要(核心成本):
- 格式:包含当前任务、已完成操作、当前状态、待处理请求、关键上下文、剩余工作。
- 迭代更新:基于上一次摘要(
_previous_summary)进行增量更新,而非从零重建。 - 防误读:添加
SUMMARY_PREFIX,明确告知模型“这是背景,不是新指令”。
4. 关键工程保障
- 边界对齐:压缩时不能切断
tool_call和tool_result的配对。- 修复:若出现“孤儿调用”,插入占位符结果修复配对,防止 API 400 错误。
- 快照机制(缓存优化):
- 本轮
memory add立即写盘,但不更新 System Prompt(保持前缀缓存有效)。 - 生效时机:下一轮对话启动时刷新快照。
- 本轮
- 三重脱敏(安全):
- 输入脱敏:拦截零宽字符、Prompt Injection 模式。
- 生成约束:提示词要求输出
[已脱敏]。 - 输出复检:摘要生成后再次扫描。
5. 防抖与降级兜底
- Anti-thrashing:连续 2 次压缩无效(节省 <10%)则自动暂停压缩。
- 故障降级:
- LLM 摘要失败 → 使用静态兜底消息。
- 摘要模型挂了 → 自动切回主模型。
- 主模型也失败 → 进入 60 秒冷却期。
🔗 原文链接 Hermes有界记忆管理:字符限制+压缩策略,永不溢出