先这样答
解决Agent长任务中断恢复的核心思路是状态外置。大模型的上下文窗口仅仅是一个临时视图,真正的任务状态包括执行计划、已经完成的步骤以及中间产物的存储指针,都需要在会话之外进行持久化,通常落盘到外部数据库或文件系统中。这是所有恢复机制的前提。
在具体执行过程中,系统需要按照任务的步骤粒度保存检查点。当任务因为超时或服务重启而中断时,恢复流程会从存储中拉取最近一次的有效检查点,据此重新构建大模型的上下文视图。重建的内容包含原始任务计划、当前的执行进度和积累的关键变量。对于中断时正在执行、尚未完成的那个步骤,系统会直接进行重放。这就要求Agent调用的底层动作必须设计成可重入的,通过幂等性保证重复执行不会产生脏数据。
如果是用户主动离开或触发中断,处理逻辑会有所不同。系统会将当前任务挂起,并保存用户的原始意图与执行进度。当用户再次返回会话时,Agent会加载挂起的状态,并向用户确认是继续按照原计划执行后续步骤,还是根据用户的新输入改道,调整接下来的任务规划。
总体而言,应对长任务中断的机制就是把状态持久化到外部,配合动作的幂等设计,让Agent在任何异常切断后都能安全地回到断点继续推进。
面试官会怎么追问
- 「LangGraph 里的 checkpoint 机制和你说这个有什么关系?」 LangGraph的checkpoint就是这种状态外置机制的框架化实现。它在每个节点执行完毕后,将整个图的状态快照持久化到存储介质中。恢复时,框架通过加载特定线程的最新快照,直接还原图的执行上下文,开发者不需要手动管理每一步的变量保存。
- 「你提到未完成步骤要重放,怎么保证重放时的幂等性?」 需要在写操作的接口设计上加入防重机制。具体做法是给每次操作携带唯一的去重键,或者在数据库更新时带上版本号。如果重放时发现该去重键已经存在或版本号不匹配,系统就直接返回已有的执行结果,避免重复写入等副作用。
- 「如果中间产物很大,状态外置时具体该怎么存?」 中间产物通常是生成的长文本或大文件,直接存入状态检查点会导致上下文体积过大,影响读写性能。此时需要将产物本身存入对象存储,而在检查点中只保留该产物的存储指针或唯一标识路径。
回答的坑
- 认为只要保留大模型的历史对话记录就能恢复状态,正确的做法是把计划和进度等结构化状态提取出来存入外部数据库,上下文只是状态的映射。
- 遇到中断直接让Agent从头开始重新规划和执行任务,正确的做法是基于步骤粒度的检查点从断点处重放,并确保动作设计具备幂等性。
同系列的题
相关深度笔记
—— 本题完 ——