喂了AI 100轮对话,第50轮开始选择性失忆,第70轮自己编故事
我把DeepSeek喂吐了,它开始胡言乱语
上周三凌晨两点,我看着DeepSeek API返回的第97轮对话结果,直接笑出声。它把我之前说的“我喜欢吃苹果”记成了“我是一颗苹果树”。
不是bug。是赛博老年痴呆。
所以我决定搞个测试——这个号称128K上下文的家伙,到底在第几轮开始精神分裂。测试过程中,我用的模型版本是deepseek-chat-67b,temperature设0.3,top_p设0.9,确保不是随机抽风。理论上上下文窗口是128K,我准备了100轮对话,每轮大概800到1000个token。
按道理,这还在舒适区里。
但道理就是个锤子。
测试:让AI记住一只猫
测试思路很简单:虚构一只叫“码农”的橘猫,不断喂它的生活细节,然后每隔10轮问一次“码农最近在干什么”。
第一轮,我告诉它:“码农是一只3岁的橘猫,住在我家阳台,喜欢吃三文鱼。”
第10轮,问它码农的情况,回答完美:“码农是您的橘猫,3岁,住在阳台,最近在吃三文鱼。” 还加戏说它“看起来很开心”。行,这时候还像个靠谱的实习生,问啥答啥。
第30轮,我开始往对话里塞噪音——聊Kubernetes的pod调度、聊杭州这破天气、聊中午外卖点啥。然后在第31轮突然问:“码农最近怎么样?”
它说:“码农最近好像不太爱吃东西了。”
?
我从来没说过。这是它自己脑补的。记忆开始裂了。
第50轮:选择性失忆
到第50轮,已经喂了大概45000个token。理论上只占上下文的35%,但它已经开始选择性遗忘。
我在第45轮特意强调:“给码农买了个新的猫爬架,蓝色的,三层高。”
第50轮问它:“码农的新玩具有什么?”
它答:“您最近给码农买了一些新玩具,包括一个逗猫棒和几个小球。”
猫爬架呢? 三层蓝色那个?被AI吃了。
更骚的是,它把我在第12轮提到的“逗猫棒”和第23轮的“小球”翻出来了。完全忽略了更近期的信息。
这说明什么?它不是按时间远近在遗忘。
它按某种诡异的优先级丢东西。就像你老板只记得你三年前迟到过,但忘了你上周通宵上线的事。那个猫爬架,大概属于优先级最低的那档,直接被GC回收了。
第70轮:开始编故事
到第70轮,彻底失控了。
我在第65轮说:“码农最近胖了,兽医说要减肥。”
第70轮问它码农的健康状况,它回:
“码农最近健康状况不太好。您带它去看了兽医,发现它有牙齿问题,需要做清洁。另外您提到它在吃一种新的减肥猫粮。”
牙齿问题? 我从来没说过。减肥猫粮? 它编的。
这时候的DeepSeek像个过度热情的实习生——记不住你交代的事,但为了显得自己有用,开始自己脑补细节。而且脑补得特别合理,不仔细核对根本发现不了。
我翻回去检查了第50到70轮的所有对话,确认“牙齿问题”从未出现过。这是纯粹的幻觉。用我们的行话说,hallucination rate已经开始指数级上升了。
等等,这里我要更正一下——也不完全是指数级。更准确地说,从第60轮开始,每次查询的准确率大概下降8到10个百分点。第70轮的时候,关键信息的召回率只剩60%左右。
嗯...这个比较复杂。因为“准确率”本身就很难定义。有些回答是半对半错,比如它记住了“去看了兽医”,但自己加了“牙齿问题”这个戏份。这算对还是错?
算了,不纠结这个。
第90轮:彻底疯球了
第90轮,我问:“码农最近在干什么?”
它答:“码农最近在适应新家。您提到它刚被领养,还在熟悉环境,对阳台的花盆很感兴趣。”
刚被领养?
我在第1轮就说了码农3岁,一直住我家阳台。到第90轮,它把这只猫的整个人生重启了。
更离谱的是,我在第80轮刚说过“码农把花盆打翻了”。它记住了“花盆”,但把时间线完全搞混,认为这是“刚被领养”的猫在探索新环境。
这就是长上下文模型的致命伤:它记得碎片,但拼不起来。
我奶奶就这样。她记得我小时候爱吃糖,但现在每次见我都问“上初中了吧”——我明明已经30了。
为什么会这样?
我从工程角度掰扯一下。这不是DeepSeek一家的问题,据我了解,Claude、GPT-4都有类似的毛病。这是Transformer架构的结构性缺陷。
注意力稀释
Transformer的注意力机制在长上下文里会变“散”。想象你在一个100人的嘈杂酒吧里试图听清一个人说话——即使你听力再好,干扰也客观存在。DeepSeek的注意力权重在超过50K token后,对早期信息的聚焦能力明显下降。我看过一篇2024年3月的论文,具体叫什么忘了,大概是讲attention entropy随着context长度增加会线性增长。
内部RAG退化
长上下文模型本质上在做内部RAG——从上下文中检索相关信息再回答。但当上下文太长,它的检索准确率会断崖式下跌。我的测试里,第70轮后,检索准确率大概只有40%。
中间信息黑洞
最诡异的是:模型最容易忘记的不是最早的信息,也不是最新的信息,而是中间部分。
第30到60轮的信息丢失率最高。这就像你复习考试,开头和结尾的章节记得最牢,中间那几章全是浆糊。有个术语叫“lost in the middle”,2023年就有论文验证过这个现象。一年多了,这个问题在工程上基本无解。
我的踩坑实录
说个真事。
去年12月,我用DeepSeek API给一个SaaS产品做客服Bot,场景是用户可能连续聊2到3个小时,中间穿插大量上下文。模型版本是deepseek-chat-67b,后端用的LangChain v0.1.8,加了Memory模块。
第一版上线后,用户反馈Bot“胡言乱语”。我查日志,发现当对话超过60轮后,Bot开始把用户A的问题和用户B的历史混在一起回答——跨会话污染。日志里有一条特别离谱:用户C问“怎么退款”,Bot回答“您的猫咪最近胃口不好吗”。这是用户D在另一个会话里聊的内容。
我修了三件事:
1. 强制摘要压缩:每30轮自动把前文压缩成结构化摘要,prompt里写死了“只保留关键事实,丢弃情感描述”。用了LangChain的ConversationSummaryMemory,但改了点源码,让摘要长度控制在500 token以内。
2. 关键信息打标:对用户姓名、需求等关键信息做显式标记,用标签包裹。这个trick是从一个Github issue里学的,具体哪个repo我忘了,大概是个做RAG的开源项目。
3. 主动重置机制:当检测到回答置信度下降时,主动说“让我确认一下之前的信息”。置信度下降怎么判断?我设了个简单规则——如果回复里出现超过3个模糊词(“最近”、“一些”、“某个”),就触发重置。
第二版上线后,准确率从67%提升到89%。但这个方案很笨重,而且增加了30%的token消耗。每个月的API费用多了快2000块。
给你的建议
如果你在用DeepSeek API做长对话应用,记住几点:
别信128K的营销数字
128K是理论值。实际可用窗口,我觉得大概在40K到60K之间。超过这个范围,做好它会“脑补”的心理准备。
关键信息要反复喂
别指望它记住第3轮说的用户姓名,到第80轮还能准确召回。重要信息要么定期重复,要么做外部存储。我自己是存在Redis里,每次查询之前用RAG捞一下。
设计“记忆锚点”
每隔20到30轮,用一句话总结当前状态。比如:“总结一下,码农现在是一只3岁橘猫,正在减肥,最近打翻了花盆。” 这能帮模型重新锚定上下文。
监控“具体度”
如果模型开始用模糊词汇,说明它记不清了。这时候该触发摘要或重置逻辑。
说句得罪人的话
现在所有大模型厂商都在卷上下文长度。128K,256K,1M,数字一个比一个大。
但长度不等于质量。
就像手机像素,从1200万到1亿,数字好看了,实际拍照体验提升多少?长上下文也一样,128K里真正能稳定用的可能就前40K。
别被营销数字忽悠。
自己测了才知道。
你遇到过AI记忆断片的情况吗?我特别想知道有没有人在生产环境里测过超过100轮的对话稳定性。如果有做过类似极限测试的,评论区留个数据,我们把这问题搞透。
#DeepSeek #API测试 #长上下文 #大模型幻觉 #AI工程实践
读者评论 3