AI 忘事不怪记性差,怪没人把话说清楚

假设你让 AI 写一个批量重命名工具。

要求一开始就交代得很清楚。

只用 Python,只在本机跑,不接外部服务,原文件必须留着。

前几轮都挺顺。

后来你们又聊了文件夹选择,聊了命名规则,聊了界面和报错提示。

聊到某一句,它忽然给出一套新方案。

接一个云端接口,处理完把原文件删掉。

你大概会觉得前面白说了。

一个 AI工具 每次都答“明白了”,下一轮照样犯。

你还能把聊天记录翻出来,一个字一个字指给它看。

这种毛病,大家习惯叫 AI 忘事。

要治它,先得分清是哪一环掉的链子。

页面上还留着,这一轮未必读到

(上下文窗口)

常见的大模型应用,一次回答可以拆成两件事。

应用先拼一份材料,模型照着材料说话。

材料里有这一轮的问题,有历史消息,有平台给它的规矩,有工具返回的结果,还有从文件里抠出来的段落。

模型一次能读的量有上限,这就是上下文窗口。

它和训练时灌进去的知识,是两码事。

第一处误会就出在这。

我们看到的是整页聊天记录。

模型收到的是应用重新拼过的那一份。

中间可能被摘要,可能被筛掉,也可能只留最近几轮。

怎么拼,取决于产品怎么做。

所以,翻得到某句话,不等于这一轮它读到了。

一段 AI对话 跑到几十轮,这件事就更明显。

你以为的“全都记得”,其实是“页面全都留着”。

拿开会打比方最清楚。

两小时的录音完整存在硬盘里。

接手的人手上只有一页纪要。

录音里说过,和纪要里留下,是两个问题。

所以“我跟你说过”完全可能是真的。

同一时刻,模型手里确实没有那条信息。

这两件事能同时成立。

塞进去了,也不一定用得上

(长文的中间)

那是不是把窗口开得越大越好,全塞进去就完了。

还差一层。

塞进去以后,它得在几千字里准确找到那一句,找到以后还得照着做。

2023 年有篇论文专门测过位置的影响。

在它测的那些模型和任务里,关键信息落在长输入中段时,表现往往不如放在开头或结尾。

这是特定条件下的结果,不能给今天所有模型套一条死规律。

但它说明了一件事。

读得下长文,和用得住细节,是两种能力。

回头看那个重命名工具。

几十轮里,下面这些东西同时存在过。

最开始的本地方案。

它自己提过又被你否掉的云端方案。

一段后来作废的代码。

你贴进去的别家教程。

最新定下来的保留规则。

它们都跟任务有关,效力却不一样。

“讨论过”和“定了”,要分开。

昨天的代码和刚改完的代码,也要分开。

状态没交代清楚,回答就会把已经放弃的做法捡回来。

这种返工最耗人。

不是它笨,是材料里没有主次。

还有一种情形更直接。

要求在输入里,模型也读到了,就是没照做。

只凭一次错误回答,通常判不出是哪一种。

这也是为什么,让它复述一句“我记住了”,帮助有限。

它记得住那句话。

它记不住那句话后面的取舍。

摘要最容易丢的,恰好是限制

(上下文压缩)

长任务一直跑下去,一些系统会把前面的对话压成摘要。

Anthropic 的文档里写过这种压缩,用摘要替掉较早的几轮对话。

办法很实用。

麻烦在于,摘要得决定留下什么。

原来的要求可能是这样。

做一个本地 Python 工具,只处理选中文件夹,默认保留原文件,重名就跳过,不覆盖,也不自动加编号。

压完以后,只剩一句。

用户需要一个 Python 批量重命名工具。

方向还在。

几条关键限制已经没了。

后面交出来的程序看着挺完整,做法全不对。

这种情况在 AI编程 里最常见,因为代码对前提特别敏感。

所以做摘要的时候,除了写清在做什么,还得留住四样东西。

定了的决定。

不能碰的限制。

当前版本。

还没做完的事。

“不能覆盖文件”只有五个字。

它对结果的影响,可能比前面几千字都大。

自己整理交接也能拿这个标准过一遍。

删掉这句话,下一个接手的人会不会做错。

记忆有好几种,别混着说

(四种存放位置)

很多产品都宣称有记忆。

为什么还是会这样。

因为记忆这个词,盖住了好几样不同的东西。

当前上下文,放正在聊的问题,正在改的代码,这一轮的具体要求。

它会长,也会被压缩。

对话摘要,放阶段进度,关键决定,还有待办。

它可能漏细节。

外部笔记,放稳定偏好,项目约定,长期任务的记录。

写进去以后,还得有人在合适的时候读它。

项目文件和知识库,放规范,文档,完整资料,实际代码。

要找得到正确的那一份,还得是当下生效的那一版。

这是方便理解的分法。

具体产品常常几种混着用。

Anthropic 还讲过另一种思路,把任务状态放在上下文外面,用到的时候再读回来。

这里其实有两步。

存进去。

取出来。

一条偏好写进了笔记,这一轮它得被找到。

资料存得再全,也得确认这次读到了哪几段。

对使用者来说,最省事的做法是把稳定和临时分开。

“回答尽量用中文”是稳定偏好,写一次就够。

“这个项目今天换了接口,旧的暂时留着”是临时状态,得跟着项目动。

临时状态不更新,比不写还糟。

它会让后面每一轮都建在过期信息上。

与其反复提醒,不如写一份交接

(可复制的做法)

真碰上它开始跑偏,先别急着加功能。

把当前状态理一遍。

写代码尤其如此。

后面的要求都长在前面的版本上。

它连以哪份代码为准都没弄清,你再加五条新要求,只会更难查。

还是那个重命名工具。

可以发这样一段。

先停一下,别加新功能,按下面的信息继续。

当前目标,做一个本地运行的 Python 批量重命名工具。

当前有效要求,只处理选中的文件夹,默认保留原文件,重名跳过并记下原因,不调外部服务,不上传文件,这轮只改命名规则。

当前版本,以本轮附上的代码为准。

之前讨论过但没采用的方案,不算当前需求。

这轮要做的,修好带多个句点的文件名被截断的问题。

动手之前先说清,你准备改哪里,怎么验证。

缺代码就直接说要哪几段。

这段话的作用,是把任务边界重新画一遍。

它也方便你验收。

如果它的修改计划里还写着上传云端,或者删除原文件,你在代码被动之前就能拦住。

不过复述只是一次检查。

它能准确复述,不代表后面一定做对。

程序交付以后,还是拿几个有代表性的文件跑一遍。

原文件在不在。

重名有没有跳过。

文件名有没有按规则处理。

最后看结果。

什么时候值得开一个新对话

(判断标准)

不用按固定轮数清空。

更该看的是,这段对话里还剩多少有效信息。

只是补一个相关条件,接着聊更省事。

如果目标换过几次,废版本混在一起,它开始频繁引用旧方案,那就值得整理完重开。

开新对话,别只留一句“接着上次的继续”。

这等于把活儿交给另一个人,却没告诉他做到哪了。

交接的骨架可以照这个填。

目标,这事最终要完成什么。

当前状态,已经做完什么,还差什么。

有效决定,哪些方案定了,哪些放弃了。

必须遵守,什么不能改,什么不能做。

当前资料,以哪份文件为准,什么版本,什么日期。

下一步,这轮只做什么,怎么算做完。

再补两句。

资料缺失或者互相冲突,先指出来。

已经确认的事实,和还没验证的判断,分开写。

填完再看一遍。

有时它会把“建议这么做”写成“已经这么做了”,把“准备验证”写成“验证通过”。

这种状态带进新对话,后面全建在错的前提上。

所以交接里,“做了什么”和“证实了什么”最好分两行写。

资料太多,就让它去查

(检索增强)

一个任务几十份文档,每轮贴全文不现实。

知识库,文件搜索,检索增强生成,都是可以走的路。

最后那个的思路,是回答的时候先去外面取资料,再结合模型自己的知识来写。

用的时候把要求写具体一点。

先查当前版本的项目规范,列出跟这次修改有关的条款,再给方案。

这样好验收。

它找到了哪份资料。

用的是哪个版本。

依据是什么。

规范已经更新,它搜到的还是旧版,回答再顺也没解决问题。

文件名,日期,版本号,还有“当前生效”这几个字,都值得维护。

小任务也不必非得建知识库。

一份持续更新的项目说明,加上最新文件,往往就够。

下次再遇到它忘事,先看三个地方。

这条要求进没进这一轮的输入。

中途有没有被摘要丢掉。

它是不是看到了,却没照做。

然后补上当前目标,有效限制,最新资料。

让它继续做一件范围明确的事。

要求它“永远记住所有对话”,基本上没法验证。

一份检查过的交接记录,加上能证明任务跑通的结果,比这句话可靠得多。

AI 忘事 上下文 摘要 长期记忆 示意图

图面写着四件事:AI 忘事,上下文,摘要,长期记忆