你有没有过这样的经历?用 AI 帮你整理公司的知识库,搜了几十份文档,聊了快 30 轮,本来想让它帮你把所有性能优化的内容汇总成一份报告,结果聊着聊着,AI 突然告诉你:“抱歉,上下文超限了,我记不住之前的内容了。
更糟的是,有时候它连报错都没有,直接 “失忆”—— 忘了你之前已经改过的文档,把你刚整理好的内容给覆盖了,就像你和朋友吐槽了半小时工作,结果朋友突然抬头问:“你刚才说你要做什么来着?”
那种崩溃,相信很多和 AI 打过长期交道的人都懂。
你有没有过和 AI 聊到一半,它突然 “失忆”?
这其实就是知识库 Agent 最头疼的问题:上下文窗口不够用。
我们做的袍子 AI,是一个长在知识库上的 Agent,用户用它来做知识管理:读文档、搜内容、改文件、写报告,一次任务下来,可能要经历:
几十次文件读取,翻遍整个知识库的目录
大范围的关键词搜索,一次 grep 就能返回几十万字符的结果
批量的文件操作,每一次都有执行输出
30 多轮的对话,越聊内容越多
就算是 200K 的大窗口模型,聊个 15-20 轮,也就快顶到上限了。这背后藏着四个绕不开的矛盾:
工具输出太能吃了:一次全库搜索的结果,直接就能吃掉半个上下文窗口
信息要完整,但空间不够:你需要 AI 记住所有的文件列表做决策,但它的脑子装不下这么多
对话要连续,但压缩会失忆:把旧对话删了,AI 就忘了之前做过什么,容易重复干活
不同 AI 脑子还不一样大:64K 窗口的小模型和 200K 的大模型,没法用同一套规则
我们的解法:给 AI 加个 “随身储物柜”
null
说白了,就是把信息分成了两层:
「热存储」:上下文窗口,只放你现在正在用的、最常用的内容,保证 AI 能快速拿到
「温存储」:文件系统,所有暂时用不上的大输出、旧对话,都存在这里,一点都不会丢
这样一来,背包永远不会被撑爆,而储物柜里的东西,你什么时候需要,什么时候就能取出来,完美解决了容量不够的问题。
大输出别乱删,先存柜!
第一个要解决的,就是那种 “一次输出就把背包塞满” 的情况。
比如你让 AI 搜整个知识库的“性能优化”,结果出来 150KB 的匹配内容,换算成 token 差不多 3.7 万,直接占了 200K 窗口的 18.5%。要是搜个更常用的词,比如“用户”,出来的结果能直接把整个窗口都塞满。
换作以前,很多产品的做法是直接把后面的内容砍掉,但是这样 AI 就看不到完整的结果了,很容易漏关键信息。
我们的做法很简单:不删,先存柜!
把这些太大的输出,全部存到储物柜(也就是我们的隔离文件目录)里,只给 AI 留两个东西:
一张 “取件小票”:也就是这个文件的路径,告诉 AI“完整内容在这,需要的时候来取”
一点点预览:前 2KB 的内容,让 AI 先大概知道这里面有什么
就这么一下,原来 3.7 万 token 的大输出,直接压缩到了 500 个 token,省了 98% 的空间!
AI 要是觉得预览不够,需要看完整的结果,随时可以凭这个小票,调用 Read 工具去储物柜里把完整的内容拿出来,就像你存了包之后,需要的时候再去取一样,完全不用一直扛着那个大箱子。
而且这个储物柜是隔离的,平时 AI 做搜索的时候,不会扫到这些存起来的工具结果,不会搞出“搜索结果里全是之前的工具输出”的干扰,完美解决了干扰的问题。
旧对话别全丢,做个“摘要便签”
解决了单次大输出的问题,还有累积的问题啊。
就算每个工具输出都做了截断,聊了 20 多轮之后,所有的消息加起来,还是会把上下文窗口塞满。这时候怎么办?
很多人的第一反应是:把旧的对话删掉不就行了?
那可不行,删了 AI 就全忘了,之前改了什么文件、做了什么决策,全没了,很容易就重复干活,甚至把你之前的成果给覆盖了。
我们的做法是:旧对话别全丢,做个“摘要便签”!
我们不会直接删掉旧消息,而是把太久之前的几十轮对话,浓缩成一张结构化的摘要便签 —— 我们叫它 Session Memory。
这张便签不是随便写的,是固定的 9 项结构,把所有关键的信息都给你列清楚:
你一开始的需求是什么
这次对话里的关键技术点有哪些
你操作过哪些文件
之前遇到过什么错误、怎么解决的
问题解决到哪一步了
你所有的提问原文(防止忘了你的需求)
还有什么待办的任务
你现在正在做什么
接下来打算做什么
就这么一张小小的便签,把几十轮对话的关键信息全装下了,AI 就算看了这个,也能记得所有的大事,不会失忆。
而最近的几轮对话呢?我们原封不动地保留,因为这些是你当下正在做的事,需要完整的细节,不能压缩。
而且这个便签是滚动更新的,每次我们只拿上一次的便签,加上这一轮新增的对话来更新,永远不会越变越大,不管你聊多少轮,做摘要的输入永远不会超限。
偷偷在后台帮你 “提前整理”
说到做摘要,很多人会问:做这个摘要不是要调用 AI 吗?那要压缩时,用户不得等个半天?
没错,以前要是同步做的话,用户得等 5-15 秒,AI 弹出个 “请稍等,我正在整理记忆”,聊得正嗨呢,突然卡了,这体验谁受得了?
我们想了个绝的:偷偷在后台帮你提前整理!
你每聊完一轮,我们不会闲着,在后台开个小任务,偷偷帮你把摘要便签给更新了。你在思考下一句要问什么、打字的时候,后台的小助手已经在默默把之前的对话整理成摘要了。
等你聊到要压缩的时候,摘要早就做好了,直接拿来用就行,整个过程不到 1 秒,你完全感觉不到!
就像你去餐厅吃饭,你吃这道菜的时候,厨师已经在帮你准备下一道了,等你吃完,下一道直接上,不用等。
我们还加了各种防坑的设计:比如加了锁,防止多个整理任务冲突;加了版本号,防止后台的旧任务把新的结果给覆盖了。
现在我们的生产数据里,90% 以上的压缩,用户都完全没感觉,只有第一次压缩的时候,因为还没来得及做预更新,需要等一下,之后的所有压缩,都是丝滑的,你根本不知道 AI 偷偷帮你整理过记忆。
不管重启还是压缩,都能无缝衔接
你有没有过这种情况?和 AI 聊到一半,关掉了网页,过了半天再打开,之前的对话全没了,得重新来一遍?
或者压缩完上下文,AI 就像变了个样,之前的状态全乱了?
我们的解决方案是:不管是压缩还是重启,都用同一套方法,从文件快照里恢复!
我们把组装好的上下文,全部存成一个 JSONL 的文件快照,不管是我们做了上下文压缩,还是你关掉了网页、环境被回收了,下次要恢复时,直接读这个文件,把上下文重新组装起来就行。
就像你玩游戏,存档了,关机再开,直接读档,之前的进度、道具、任务,全都在,不用重新来一遍。
你完全感觉不到 AI 做了压缩,也感觉不到你重启过网页,就像对话从来没断过一样,无缝衔接。
连 “技能列表” 都要省着用
你以为只有对话占空间吗?还有 AI 的技能啊!
我们的 AI 支持技能扩展,用户可以装各种技能:搜文件、改文档、做表格、发邮件,要是把所有技能的完整说明都塞给 AI,30 个技能就能占掉 15K 的字符,直接把存储空间占了一大块。
这就像你手机里有 100 个 APP,你不会把所有 APP 都放到桌面,那样桌面早就满了,你会把不常用的都收进文件夹,桌面只放常用的几个。
我们也是这么做的:
平时只给 AI 看技能的名字和简单的介绍,只占上下文的 1% 的空间
等 AI 需要用某个技能的时候,再把这个技能的完整说明拿出来
这样一来,未调用的技能,永远不会占你的上下文空间,只有你要用的时候,它才会进来。
就算是你已经调用过的技能,我们也会控制空间:最近用的才保留,太久的就收起来,单个技能最多留 5K token,所有技能加起来最多 25K,不会越堆越多,把空间占满。
最后:最好的 AI 工具,其实都是最朴素的
折腾了这么多,回头看我们的整个方案,其实核心就一句话:截断不丢弃,压缩不失忆,恢复不重复。
我们没有搞什么复杂的黑科技,就是用了最朴素的思路:把大的内容都放在上下文外面,只留一个轻量的索引,把判断权交给 AI 自己 —— 你需要什么,自己来取。
工具输出的路径是索引,会话快照是索引,技能列表是索引,摘要便签也是索引,全都是同一个思路:信息的“存在”和“可见”是分开的,存在文件系统里的内容,只有被 AI 主动拿进来的时候,才会占用上下文的空间。
就这么简单的文件系统 + Read 工具,就解决了 AI 失忆的大问题。原来很多看似复杂的问题,回到最基础的工具上,往往就能得到最简单、最稳固的答案。
你有没有遇到过 AI 聊着聊着就 “失忆” 的情况?比如改文档改到一半忘了之前的要求,或者聊了几十轮之后它突然答非所问?你最烦的是哪一种?