内容提要
本文介绍 Koog 的 Agent 记忆与恢复机制:ChatMemory 按 sessionId 续接多轮对话,默认存于内存,可通过自定义 Provider 共享或持久化;预处理器支持截窗与过滤,但并非无损。历史压缩采用摘要或事实提取缩短上下文,需保留 system 消息与工具调用关系。Persistence 保存执行检查点,支持跨进程恢复,但要求状态可序列化,且不会自动撤销工具副作用,需借助 RollbackToolRegistry 补偿。LongTermMemory 按当前问题检索长期知识,属 1.3.0-beta 版本。
延伸解读
会话记忆与执行恢复是两套独立机制
文章明确区分了 ChatMemory 与 Persistence 的职责:前者按 sessionId 续接多轮对话消息,后者保存图执行的检查点位置。即使 ChatMemory 把历史存进数据库,也不代表程序知道上次执行到哪个节点;反之,Persistence 恢复执行位置也不会自动把聊天历史接上。两者可以组合安装,但组合后的实际行为需通过调用路径验证,不能仅凭都能 install 就认定没有问题。
历史压缩有损,关键业务数据不能只留在摘要里
文章强调历史压缩不是无损压缩,更不是无限上下文。摘要或事实提取可能遗漏或写错信息,订单金额、权限、已确认的操作状态等必须准确的业务数据,仍应保存在结构化状态或业务系统中。此外,windowSize 按消息条数而非 token 计算,一条长工具结果就可能超出预算;压缩后保存前若程序中断,压缩结果会随整轮丢弃,存储里仍是上一轮旧历史。
恢复检查点不等于撤销工具副作用
Persistence 保存的是框架理解的执行状态,不会自动撤销已执行的外部操作。文章用创建用户的例子说明:回退到 checkpoint-1 后,数据库中后续创建的用户不会自动消失。RollbackToolRegistry 为正向工具配置补偿工具,补偿按相反顺序执行,但调用 rollbackToCheckpoint 时只做比较和排队,真正执行发生在图应用恢复上下文时。未注册补偿的工具不会凭空获得逆操作,业务仍需设计幂等键和失败处理。
长期记忆按问题检索,与聊天记忆用途不同
LongTermMemory 根据当前问题从存储中查找相关记录并加入提示词,更接近从已有资料中找出这次需要的内容;ChatMemory 则是按会话标识加载一组历史消息接着聊。文章提醒,LongTermMemory 属于 1.3.0-beta 模块,API 可能变化;默认检索和写入配置为空,只配置检索不代表新消息会自动写入。namespace 只是存储的集合标识,不是权限校验,跨会话偏好仍需处理归属、删除和过期。
Q&A
Koog 的 ChatMemory 默认把聊天历史存在哪里?进程重启后还能恢复吗?
ChatMemory 默认使用 InMemoryChatHistoryProvider,把历史保存在进程内存中。进程退出后数据就会丢失,因此它不具备跨进程持久化能力。若要持久化或跨进程共享,需要自定义 ChatHistoryProvider 或使用共享的持久后端。
Koog 中 sessionId 在 ChatMemory 里起什么作用?不传 sessionId 会怎样?
sessionId 用于区分不同对话,ChatMemory 用它查询和保存对应历史。同一个 Agent 只安装一份 ChatMemory 和一个 Provider 实例,不同 sessionId 在 Provider 内部按 conversationId 分桶隔离。如果不传 sessionId,框架会立即生成随机 UUID,每轮都得到全新会话,无法自动续聊。
Koog 的 windowSize 和 filterMessages 预处理器有什么需要注意的坑?
windowSize(n) 按消息条数而非对话轮数或 token 数截取,且加载非空历史时会替换初始 prompt 消息,可能把 system 消息裁掉且不会自动补回。预处理在加载和保存时都会执行,保存时丢掉的消息不会因调大窗口而恢复。多个预处理器按顺序执行,顺序不同结果可能不同。生产配置通常需要自定义预处理以保留系统指令和完整工具调用关系。
Koog 的历史压缩是无损的吗?压缩结果和 sessionId 有什么关系?
历史压缩不是无损压缩,摘要可能遗漏或写错信息,必须准确的业务数据应保存在结构化状态或业务系统中。压缩只操作当前运行内存里的 prompt,不感知 sessionId;不安装 ChatMemory 也能使用,只是结果随本次运行结束消失。压缩的影响范围是本次运行的后续 LLM 调用,以及保存成功后同一 sessionId 的未来轮次。
Koog 的 Persistence 能自动撤销工具已经产生的副作用吗?
不能。Persistence 保存的是执行检查点,恢复的是框架执行状态,不会自动撤销工具副作用。需要借助 RollbackToolRegistry 为正向工具注册对应的回滚工具,在回滚时按逆序执行补偿动作。补偿在调用 rollbackToCheckpoint 时只做比较和排队,真正执行发生在图应用恢复上下文时。未注册补偿的工具不会凭空获得逆操作。
Koog 的 LongTermMemory 和 ChatMemory 有什么区别?
ChatMemory 按会话标识加载一组历史消息,用于把对话接着聊;LongTermMemory 根据当前问题从存储中检索相关记录并加入提示词,用于从已有资料中找出这次需要的内容。LongTermMemory 属于 1.3.0-beta 模块,API 可能变化,且需要显式配置 retrieval 和 ingestion 及存储,只配置检索不代表新消息会自动写入。