最近在研究Pi的源码,发现Pi保存的上下文在Session,只是模型的其中一个视角。
我现在才发现以前对 Agent Context 的理解还是太简单了。
1、Pi 保存的 Session 本身就是一棵树
Pi 的每条 Session Entry 都会记录自己的 id 和 parentId,所以一次任务并不是只能一直往后聊。
比如你已经尝试了一套方案,做到一半发现方向不对,可以直接回到前面的某个节点重新开始。之前那条路线不会被删除,而是继续保留在 Session 里面,新的方案则形成另外一个分支。
这里最有意思的一点是,Pi 保存的不是最终答案,而是 Agent 完整的工作过程。
2、但是模型每次并不会看到整棵树
这也是我觉得设计比较巧的地方。
Pi 会根据当前所在的节点,一路往前寻找父节点,最后得到当前这条分支真正有效的历史,再用这些内容去构建本轮 Context。
所以 Session 和 Context 其实不是同一个东西。
Session 更像完整的历史资产,而 Context 是从这些历史里面临时选择出来,给模型使用的一份工作记忆。
3、Compaction 本质上也没有修改这些经历
当 Context 越来越长以后,Pi 会把比较早的一部分内容总结成 Compaction Summary,然后继续保留最近的原始消息。
但是原来那些 Tool Call、对话、文件探索并没有因此从 Session 消失,被压缩掉的其实不是“记忆”,而只是模型当前查看这些记忆的方式。
这也是我现在越来越喜欢把 Session 和 Context 分开理解的原因。
4、甚至一条失败的分支,也不一定毫无价值
Pi 在切换 Session Tree 分支的时候,还可以对即将离开的路线生成 Branch Summary。
也就是说前面虽然走错了,但是找到的 Bug、试过的方法、修改过哪些文件、哪些方案已经证明不可行,这些经验依然可以被带到新的路线里面。
看到这里我才慢慢意识到,Session Tree 这个设计真正有价值的地方,可能不是让你可以随时 /tree 回去。
研究下来,我发现我研究的还是太浅薄了,有一些地方一定要深入到源码,或者是配合ai的解析,才能读懂里面的内容。
如果只是简单的知道概念,但是具体的实现不去了解,很难有较深的感悟。推荐大家,如果想深度学习,一定要去拆解源码。