恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Agent跑一半Ctrl+C还能续跑?扒透Harness会话持久化底层原理
首页
资讯中心
/
Agent跑一半Ctrl+C还能续跑?扒透Harness会话持久化底层原理
Agent跑一半Ctrl+C还能续跑?扒透Harness会话持久化底层原理
发布时间:2026/8/24 1:31:25
文章目录前言1 为啥光有agent循环不够还得整个harness1.1 有些东西天生就没法存到磁盘里1.2 半持久化才是真正的务实2 AgentHarness循环上面的大管家2.1 一生就五个阶段循环往复2.2 三条潜规则才是精髓3 会话持久化存啥、啥时候写、怎么读3.1 存啥一行一条记录拼成一棵树3.2 啥时候写全看当前在哪个阶段3.3 怎么读读日志还要投影成上下文4 上下文压缩删是不可能删的4.1 压缩就是多写一条摘要4.2 一次压缩分四步4.3 迭代折叠越压越划算5 最后说点掏心窝子的P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。前言不知道你们有没有过这种体验。跑个长任务的Agent跑一半嫌卡直接CtrlC给强退了。第二天想起来接着弄打开一看对话居然还好好躺在那点一下就能接着往下聊。以前我觉得这不是天经地义的吗直到自己去扒了一遍源码才发现。这哪是天经地义这背后是一整套工程在给你兜底。今天就跟大家聊聊这套叫harness的东西到底是怎么把“会话保存”这件小事做扎实的。1 为啥光有agent循环不够还得整个harness很多人一开始都有这个疑问。agent循环不是已经能跑任务了吗干嘛又多套一层脱裤子放屁这话就像问“人有手有脚为啥还要穿衣服”——光有核心能力不行你得给它搭个能正常运转的环境。1.1 有些东西天生就没法存到磁盘里先给大家说个很现实的问题。你想把整个会话持久化想法很美好但有些东西它就是没法序列化。比如工具的实现代码、模型的鉴权实例、各种钩子函数、资源加载器。这些东西都是活的带着闭包、带着网络连接、带着运行时状态。就像你能存下你朋友的手机号但你存不下他当下的心情。下次见面他心情好不好还得他现场给你表现。你总不能说“我上次存了你开心的状态这次你必须接着开心”那不现实。1.2 半持久化才是真正的务实所以聪明人就不追求“全都能恢复”这种虚无缥缈的目标了。人家直接定了个方案半持久化。简单说就是分工明确。会话数据、消息记录这些死的东西全给你存到磁盘上一条都不丢。工具、模型、钩子这些活的东西恢复的时候由宿主程序重新提供。数据归存储代码归运行时井水不犯河水。承认有些东西存不了把能存的存扎实比吹“全量持久化”的牛靠谱多了。2 AgentHarness循环上面的大管家这套负责编排的东西就叫AgentHarness。你可以把它理解成agent循环的大管家。循环负责闷头跑任务管家负责管着会话怎么存、配置怎么改、资源怎么调。跑、观测、控制三件事一把抓。2.1 一生就五个阶段循环往复这个管家的一生用五个状态就能概括完。idle闲着呢啥都能改啥操作都能发起。turn正在跑一轮对话模型在输出、工具在调用忙得很。compaction正在压缩上下文忙着给历史做总结。branch_summary跳分支的时候给旧分支写个总结再走。retry预留的重试位目前还在完善就当是个备胎。听着是不是挺简单就跟人一天的状态似的摸鱼、干活、整理笔记、换项目、准备返工。2.2 三条潜规则才是精髓状态就五个但背后的设计原则才是真东西。第一条这状态机是用来保数据一致性的不是给UI做进度条的。很多人以为这是给用户看进度用的格局小了。人家核心是解决“跑的时候状态一直在变怎么存才不乱”这个问题。UI能顺便拿到状态展示那都是买一送一的副产品。第二条运行中能改配置但只影响未来。跑一半你想换模型、调参数、加减工具都行。但正在发的这轮请求半个字节都不会给你改。就像你点外卖下单了再改备注骑手都取餐了你只能等下一单再改。这叫不折腾正在运行的东西稳字当头。第三条恢复全靠日志跟内存里的对象没关系。能持久化的只有一条条的日志条目。恢复的时候就靠这些日志重建状态那些运行时的对象全靠宿主重新注入。说白了就是重启之后谁都不认只认硬盘上的日志。3 会话持久化存啥、啥时候写、怎么读聊到核心了持久化到底怎么做的三句话就能说清存的是只追加的状态树写盘看阶段读取要投影。3.1 存啥一行一条记录拼成一棵树会话文件说穿了就是个JSONL一行一条记录。第一行是头信息后面每行一个条目。有消息、模型变更、压缩记录、分支总结、叶子标记这么几种类型。每个条目都带个父节点指针读进来就是一棵树。注意啊人家存的是一条条事件记录不是把整个对象直接dump下来。就像写日记你是每天发生啥写啥不是把自己整个人冷冻起来。工具、函数这些活的东西根本就不往日志里写。3.2 啥时候写全看当前在哪个阶段写盘不是想写就写不同阶段策略完全不一样。闲着的时候改配置、加消息立马就写。跑任务的时候得等一条消息完整结束了才写。跑一半改配置先存到待写队列里攒着等这轮跑完了统一写。为啥要攒着怕顺序乱啊。你配置都写进去了消息还没落盘恢复的时候顺序就错了。就像你还没吃饭呢先把洗碗的朋友圈发了那不就穿帮了吗。那有人问了中途CtrlC强退半条消息会不会丢放心人家设计的时候早就考虑到了。中断走的也是正常收尾流程被打断的消息会标成中断状态写进去。该落盘的一条都不会少连“这条没跑完”这件事都给你记下来。以前写脚本最怕中途断断了就得从头跑。现在就像外卖没吃完封上放冰箱第二天热一热还能接着吃连“上次吃到哪了”都给你记着。3.3 怎么读读日志还要投影成上下文很多人忽略了这一步。存的日志是一回事真正发给模型的上下文是另一回事。恢复的时候先从当前叶子节点往回倒拿到整条分支的历史。然后应用压缩边界旧的用摘要代替新的原样保留。最后拼成消息数组交给循环。所以日志是完整的档案上下文是给模型看的精简版。就像公司查档案全量记录都在库里但给你看的只是整理好的简报。4 上下文压缩删是不可能删的聊到这就该说上下文压缩了。很多人一听压缩就以为是把旧消息删了。大错特错。4.1 压缩就是多写一条摘要人家的日志是只追加的从来不改旧数据更不会删。所谓压缩就是往日志里多写一条压缩记录。里面俩核心东西一个是旧历史的摘要一个是保留起始位置。从这个位置往后的消息原样发给模型。这个位置之前的就用摘要顶替。磁盘上的历史一条没少模型看到的上下文却瘦了一大圈。就像你聊天记录不删但是把重点记在备忘录里。平时办事看备忘录就行真要翻旧账聊天记录原图都还在。4.2 一次压缩分四步单次压缩其实就四步。第一步触发。要么token用量到阈值了自动触发要么模型报溢出了兜底要么用户手动执行。第二步选切点。从后往前数留够最近的消息量剩下的送去总结。切点还得讲究不能切在工具调用中间不然模型看到半截工具调用直接就懵了。第三步生成摘要。把切点之前的消息交给模型总结成固定格式目标、进度、决策、下一步、关键文件一目了然。之前有摘要就做增量更新不用从头重读。第四步写回日志。写完就回到空闲状态下次读的时候自动用最新摘要。4.3 迭代折叠越压越划算最妙的是它的迭代设计。第一次压缩把最老的一批折成摘要。聊多了第二次压缩就把上次保留的、现在变老的那批和旧摘要叠在一起折成新摘要。每次只处理增量的部分旧摘要当底稿一路传下去。会话再长单次压缩的工作量都是有上限的。这就叫日志线性膨胀压缩成本恒定。说人话就是聊天记录越攒越多但每次整理重点的工作量不会跟着暴涨。5 最后说点掏心窝子的没看源码之前我以为会话保存就是找个时机把消息数组写进文件。不就是个写文件的事吗能有多复杂。真扒完才明白写文件只是最后一步。什么状态下能写、写入顺序怎么保证、恢复的时候哪些该存哪些该重新提供。这些边界问题才是工程的主体。说起来也没什么黑科技。一个五状态的状态机一个待写队列一棵只追加的树。但每一样都在划同一条线能确定恢复的和必须重新提供的分开现在能写的和必须攒着的分开。线划清楚了中断之后再打开还能接着聊就成了理所当然的事。最后还有个挺有意思的观点。有人说真正束缚模型的往往不是模型本身是我们给它套的这套框架、写的这些提示词。模型能力升级了框架还是老一套等于亲手把模型的能力按住了。所以啊架构做得扎实很重要懂得适时松绑也很重要。给模型足够的权限、足够的上下文、足够的时间。剩下的交给智能自己涌现就好。P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。