短期和长期记忆在何时写入、保存,采用同步还是异步方式?

考查重点:恢复必需状态与长期记忆的落盘。当前任务状态随步骤及时保存,稳定偏好经筛选后写长期记忆;恢复必需状态同步落盘,非关键摘要可异步但需记录失败重试

本题目录

参考答案

核心回答

写入时机取决于信息的用途,是否等待写入则取决于丢失的代价。 短期记忆服务当前会话,包括消息、任务进度和工具结果;其中恢复必需的部分应随执行步骤及时持久化,不能只等会话结束。长期记忆保存跨会话复用的偏好、事实和经验,先筛选,再更新。

同步和异步也不能简单对应短期和长期。用户明确要求“记住这个偏好”,可以在当前请求中完成写入,确认成功后再答复;需要模型抽取、去重的经验总结,可以在一轮对话或任务结束后异步处理。即使使用异步数据库接口,只要主流程仍然等待提交确认,它在业务上依然属于等待保存完成的路径。

另外,已经存好、下轮能查到、已经进入本轮模型上下文,是三个不同状态。保存成功后,还要按系统的检索或提示刷新规则让模型使用,不能把内存更新或一句“记住了”当成持久化成功。

如何选择保存时机

当前任务:在恢复需要的执行边界保存

用户输入应在开始处理前保存;调用有外部影响的工具前记录调用意图,工具返回后保存结果和任务进度;结束、中断或失败时补齐最终状态。这样重启后才能区分“尚未执行”“已发起但结果未知”和“已完成”。会话历史与结构化任务状态可以分开存,但两者对执行结果的描述应保持一致。

这里等待的是必要记录的提交确认,不要求每生成一个流式片段就写数据库。普通文本可以在消息完成或适当的检查点保存,接受相应范围内的部分文本丢失;有外部影响的操作则要更谨慎。若工具已经执行,而结果尚未写回,仍需靠幂等键或查询外部状态处理,单靠保存聊天记录无法保证工具只执行一次。

跨会话记忆:按明确请求或筛选结果保存

用户明确要求保留的偏好、对旧事实的纠正,可以在当前流程中校验并保存;如果保存失败,应告知失败,不能提前确认“已经记住”。当前任务的临时参数只需要留在任务状态中。

从多轮交互中提炼习惯、经验或摘要,通常适合在对话完成、任务收尾或达到配置周期后处理,避免每条消息都调用模型抽取。写入前检查来源、适用范围、重复和冲突;原始对话落库并不意味着其中每句话都应变成长期事实。这种前台更新和后台提炼的取舍,也见于 LangChain 的记忆写入设计。

异步处理:说清楚是否允许丢失和延迟可见

如果摘要只是可重新生成的辅助信息,尽力而为的后台任务可以满足需求;如果要求进程重启后仍继续处理,就需要先持久化待处理事件,再由工作进程消费,并记录失败和重试。不能只启动一个线程,就承诺最终一定保存成功。

重试可按源消息和处理批次去重,并为同一记忆的更新保留版本,避免旧任务晚到后覆盖新纠正。例如用户已经撤销某个偏好,之前排队的抽取任务就不应再把它写回来。验证时应覆盖写入失败、重复消费、并发修改,以及写后尚未被另一会话读到的情况。

Hermes AgentPython

基于 Hermes Agent

Hermes Agent 是支持持续任务、工具执行和跨会话记忆的个人助手。它用 SQLite 保存会话历史,用 MEMORY.md 保存环境事实与通用约定,用 USER.md 保存用户偏好。历史保存、记忆更新、提示加载分别有自己的时机。

会话历史在消息和工具边界增量保存

启用会话数据库时,用户输入在首次模型调用前保存;模型产生工具调用后,先保存调用消息,再执行工具;工具结果返回后继续增量保存。完整回答形成后也会写入,退出路径再补充保存,因此不是等整个会话结束才统一落库。

这些保存调用在当前执行路径中等待 SQLite 写入完成,已保存消息的标记用于避免重复追加。工具调用前若明确写入失败,会停止执行该批工具;最终回答的写入失败则留给收尾阶段重试,不能据此承诺任何故障下都不丢历史。流式文本也不是逐个词元落盘;中断时可以将已累积的部分回答记录为中断消息。

显式记忆更新同步写文件,提示在边界重载

memory 工具处理新增、修改或删除时,会在文件锁内重新读取当前内容,校验字符预算和修改条件,再通过临时文件与原子替换保存。成功结果在写入完成后返回。启用 memory.write_approval 时,部分写入可能先暂存待审批,需要区分“已提交审批”和“已写入记忆文件”。

记忆文件更新成功,不会立即重建当前系统提示。正常调用继续使用已加载的快照,以保持提示前缀稳定;发生上下文压缩后,系统会清除提示缓存并重新从磁盘加载记忆,新会话也会加载最新文件。因而写入与进入模型提示并非同一个动作。

后台复盘按条件异步触发

内置记忆复盘的默认间隔是 10 个用户回合。达到周期,且本轮有最终回复、未被中断、没有跳过后台复盘,并满足相关配置条件时,系统在交付回复后启动后台复盘;auxiliary.background_review.enabled 默认开启,也可以关闭。复盘会判断是否有值得保存的内容,可以得出“没有需要保存的信息”,并非每轮都提炼一条记忆。

后台复盘使用独立执行分支,不把复盘对话混进用户的会话历史;真正更新内置记忆时,仍通过同一套同步文件写入机制。异步的是复盘调度与模型处理,文件更新本身仍等待写入完成。 该后台线程属于尽力而为的处理,进程退出可能使它中止,不等于具有持久队列和失败重放能力。额外接入外部记忆提供方时,还要按对应插件的同步与提取策略判断,不能套用内置文件记忆的时机。

对应教程

参考资料

  • 国内:JavaGuide:AI Agent 记忆系统:借鉴记忆的写入、巩固与提取分工,以及重复和冲突处理,说明原始历史应先筛选再转成长期事实。
  • 国内:zero2Agent:记忆与上下文:依据任务状态、模型上下文和可复用记忆的区别,解释恢复必需状态不能只依赖记忆摘要。
  • 国内:Datawhale:记忆与检索:参考临时对话历史与持久记忆的区别,以及编码、存储和整合的过程,说明保存历史和提炼长期信息各自承担的职责。
  • 国内:AgentGuide:Agent Memory:借鉴全部保存、关键信息保存和周期整理的比较,说明何时值得触发长期记忆处理,用于判断哪些信息值得长期保留。
  • 国外:LangChain:Memory overview:参考前台写入和后台提炼在延迟、处理频率与信息新鲜度上的取舍,说明长期记忆可以采用不同保存路径。
  • 国外:SQLite:Transaction:根据事务提交和写入失败的行为,区分函数被调用与保存已完成,并说明等待提交确认的含义。
  • 国外:Hermes Agent:记忆存储实现、提示刷新、会话持久化与后台复盘触发:用于项目答法中的同步文件更新、消息增量保存、压缩后重载与条件式后台处理。

相关面经

2 篇

小红书

后端开发工程师
实习一面
查看原面经 →
多少次更新一次长期记忆

快手

Java 开发实习生
一面
查看原面经 →
长短期记忆、保存、存储的一个时机是什么样?是多久呢。是同步做的吗?

收录题集

2 个来源,共4 份题集

AI 智能体与大模型应用开发面试题库

didilili · ai-agents-from-zero · 1 条原题

查看题集 →

Agent 开发实战追问

阿东玩 AI · AgentGuide · 1 条原题

查看题集 →

Agent Memory专题问答

阿东玩 AI · AgentGuide · 1 条原题

查看题集 →

Agent Memory进阶追问

阿东玩 AI · AgentGuide · 2 条原题

查看题集 →

相关题目

4 题