微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 当用户说"算了,换个方案"时,AI agent到底在听谁的话

当用户说"算了,换个方案"时,AI agent到底在听谁的话

2026-10-28 12:09
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-10-28 12:09 • 科技行者

你有没有遇到过这种情况:跟客服聊了半天,先说要退货,又改口说只换货就行,最后决定还是退货但要加急处理。结果对方给你处理的方案里,居然混进了你中途提过又明确否认的要求。

你肯定会觉得这人没在认真听你说话。

现在把"客服"换成"AI agent",这个问题突然变得严重起来。因为AI agent不只是聊天,它还会真的去执行操作,调用工具,写代码,查数据库。如果它记混了你到底想要什么,后果可能是生成了错误的代码,或者在数据库里改错了字段。2026年9月挂到arXiv上的一篇论文,专门研究了这个现象,给它起了个名字,叫intent drift。

**意图漂移**:用户的意图在多轮对话中发生了变化,但AI仍然被已经过时、被用户推翻的旧意图影响,导致最终答案或操作出错。

这篇论文出自港科大、港中文和Tencent LIGHTSPEED的研究者之手,他们做的事情说起来简单,做起来却挺讲究:先搞清楚这个问题到底有多严重,然后试着去修。

这事到底有多难,难在哪儿

先说说这个问题为什么不是个新鲜事,但又一直没被真正量化过。

之前已经有研究注意到,模型在多轮对话里会"迷路"。比如2025年的一篇研究发现,如果把一个任务的信息拆成好几块,分批告诉模型,模型就容易丢三落四,完不成任务。这叫sharded-instruction(分片指令)场景,说白了就是信息喂得太碎,模型消化不良。

2026年还有一篇更接近的工作,叫Tack等人的evolving-intent研究,专门测试了意图在对话中被揭示、修改、切换的情况,而且保留了原始的打分标准。这已经很接近intent drift要研究的问题了。

但问题出在哪儿呢。这些研究测的是"模型最终有没有跟上任务",却没法区分清楚,模型出错到底是因为被旧意图带偏了,还是因为别的什么多轮对话常见毛病,比如单纯记性不好、注意力分散。这就好比你去医院,医生告诉你"你生病了",但没告诉你是感冒还是过敏,这两种病的治疗方法天差地别。

要把这个问题研究透,你需要一个很明确的参照系:必须知道用户最终真正想要什么,也得知道哪些信息是"过时但听起来依然合理"的,而且这些过时信息一旦被误用,必须真的能改变任务的对错判断。否则你怎么证明模型是被旧信息带偏了,而不是别的原因导致的失误?

这就是INTENTFLUX要解决的事情。

INTENTFLUX:把一个任务拆成会变化的对话

INTENTFLUX的核心思路挺巧妙的。它拿一堆"本来就有标准答案、能自动打分"的任务,比如写代码、做数学题、写SQL查询、生成文本摘要,然后把这些任务改造成一段多轮对话,对话里用户会不断修改自己的要求。

**源任务**:指那些原本已经有现成评测标准的任务,比如LiveCodeBench的编程题、GSM8K的数学题、Spider的SQL查询、BFCL的工具调用任务,这些任务涵盖了代码、数学、数据库、文本生成、摘要和工具使用。

关键的地方在于,这个对话不是随便编的,背后有一套严格的"意图状态"机制在控制。研究者把一个任务的要求拆解成一组一组的"原子目标",每个目标都是一句话能说清楚的要求,比如"用Python实现"或者"包含调试信息"。整个对话过程,就是这些目标被添加、删除、替换的过程。

论文里专门设计了两种"过时信息",来模拟真实对话里用户改主意的场景。

**VARIANT(变体)**:用户先提出一个看似合理的备选值,后来又换成了最终确定的值,比如先说用Java写,后来改成用Python写。

**DECOY(诱饵)**:用户先提出一个限制条件,后来又撤回了这个条件,但这个诱饵只有在"如果AI真的遵守了它,会导致最终答案判错"的情况下才会被保留进测试集。

这个"只保留会影响判分的诱饵"的设计特别关键。你想啊,如果用户随口提了一句无关紧要的话又收回去了,AI没听进去也不影响结果,那这根本不叫失误。只有那种"你要是真听了它的,整个任务就全错了"的诱饵,才真正能测出AI有没有被旧意图带偏。

这就像在玩一个叫"大家来找茬"的游戏,但规则更残酷:如果你找错的地方根本不影响最终画面好不好看,那找错了也没关系;只有找错了会导致整幅画崩掉的那种茬,才算数。

为了让这套系统更有说服力,论文区分了好几个数据池子。有一个627个任务的校准池,专门用来测试"随着难度增加,模型表现会不会变差";有一个502个任务的训练池,专门喂给后续的训练实验;还有两个固定的测试集,一个叫GENERAL-TEST(125个任务),一个叫INTERACTIVE-TEST(100个来自VitaBench的真实工具调用任务)。这种划分方式让整套实验显得很规矩,不会出现"拿训练过的数据又去测试"这种自我证明式的循环论证。

难度一调高,模型就开始翻车

接下来研究者做的第一件事,是验证这套对话构造方式,是不是真能可控地制造出难度差异。

他们设置了三档难度,easy、medium、hard,分别对应1、3、5的变体/诱饵预算。预算越高,对话里混进去的"过时信息"就越多,对话轮次也相应变长,从easy档平均13.2轮涨到hard档平均37.1轮。

结果呢,在627个任务的校准池上,平均任务得分从easy档的0.476一路跌到hard档的0.384,跌幅接近两成。这个趋势挺干净的,几乎是单调下降,说明这套压力测试机制确实有效。

但光是校准池上的单一模型测试还不够有说服力,万一只是校准用的模型碰巧比较差呢。于是研究者又找来八个主流模型,包括Claude Opus 4.7、DeepSeek V4 Pro、Gemini 3.5 Flash、GLM 5.2、GPT-5.4、HY3、Qwen3.6 Plus和Qwen3.5-122B,在固定的125任务测试集GENERAL-TEST上跑了一遍完整对比。

**CAR(current-ground-truth-intent alignment rate)**:指在"直接把最终真实意图告诉模型"和"让模型自己从对话里推断出最终意图"这两种条件下,模型完全答对的比例。

**IDG(intent-drift gap)**:指同一个任务、同一个模型,在"清清楚楚直接给出最终要求"和"藏在对话里让模型自己理清"这两种情况下的得分差距,差距越大说明意图漂移的影响越严重。

结果是,八个模型无一例外,在hard难度下的IDG都是正的,而且普遍不小。表现最好的Qwen3.6 Plus,清晰条件下能拿0.640的CAR,但在hard drift条件下只剩0.192,差距高达0.448。换句话说,将近一半的完全正确率,就这么因为"意图藏在对话里需要自己猜"而蒸发掉了。

这里有个特别值得琢磨的细节。研究者担心这个现象只是"对话变长了,模型记性不好"导致的,而不是真的被旧意图带偏了。于是他们专门做了一个turn-matched(轮次匹配)的对照实验:把真实的最终要求在第一轮就直接告诉模型,后面所有轮次都只是无意义的"确认没有变化",轮数和字数都跟真正的drift对话对齐。

结果这个对照组的得分是0.734,跟单轮直接给任务的0.778相差不大,而真正的drift对话只有0.469。这个0.265的差距说明了一件事:单纯对话变长,不是罪魁祸首,真正让模型翻车的是那些被撤回又反复出现的、相互矛盾的旧信息。

这就好比你让一个人记住一份购物清单,如果清单很长但从头到尾没改过,他记起来问题不大;但如果清单上的东西被反复划掉又加上,加上又划掉,哪怕最终清单长度差不多,这个人出错的概率会直线上升。真正难的不是"信息多",而是"信息在打架"。

有意思的是,不同任务类型对这个压力测试的反应完全不一样。写代码(LiveCodeBench)、做数学题(GSM8K)在难度提高后掉分最猛,但BFCL(工具调用判断)反而在难度提高后分数还涨了一点。研究者去翻了具体的失败案例,发现了两种典型错误模式:一种是用户明确说"不要某个要求了",但模型最后答案里还是把这个已删除的要求塞了进去;另一种出现在BFCL里,用户替换了某个参数值,但模型把新值绑到了错误的函数参数槽位上,算是另一种形式的"记混了"。

而且这个现象不只出现在"生成最终文字答案"这种静态任务里。研究者还在VitaBench这个真实的工具调用环境里做了测试,模拟外卖、门店、在线旅行代理这种跨领域的真实任务场景。他们发现,如果在对话收尾时不明确重申一遍最终要求,模型的部分得分(partial-credit score)会比清晰条件低0.103分。这说明意图漂移这个毛病,不只是测试题会中招,真实的工具调用场景里一样会出问题。

光靠压缩历史记录,救不回来

发现问题之后,自然要问:现有的那些"管理长对话历史"的技术手段,能不能顺手把这个问题解决掉?

毕竟现在很多AI agent系统都有一套机制,专门应付对话变长之后超出模型处理能力的问题,常见做法是滚动摘要,或者分阶段压缩对话内容。

研究者挑了两种现成的方案来测试。一种叫Deep Agents,用的是滚动摘要(rolling summarization)的办法;另一种叫OpenHarness,用的是两阶段压缩(two-phase compaction)。在同样的medium难度对话轨迹上,用同一个模型Qwen3.5-122B去跑,结果Deep Agents只拿到0.354分,OpenHarness拿到0.392分,而什么都不做、裸跑多轮对话反而有0.367分。

这个结果挺打脸的。压缩历史记录这套常规操作,不但没有显著改善意图漂移问题,甚至还可能比啥都不做更差。

为什么会这样呢?研究者给出了一个挺有洞察力的解释:压缩历史,解决的是"记不住"的问题,但没解决"分不清哪些是真的"的问题。

一段被压缩过的对话摘要,完全可能同时保留了一个过时的值和它后来被替换成的新值,模型拿到这样的摘要,照样得自己判断到底该信哪个。更麻烦的是,一个已经被撤回的要求,可能在对话早期已经衍生出了一堆中间结论,比如模型基于某个用户随后删掉的要求,已经做出了某些规划或选择。即便原始要求被删掉了,这些衍生出来的结论可能依然残留在压缩后的摘要里,看起来逻辑通顺,实际上立论的根基已经不在了。

这就像你把一堆购物收据揉成一张总结表,表上写着"买了3斤苹果",但其实你中途取消了苹果的采购,改买了橙子。如果做摘要的人只是机械地把所有出现过的条目都罗列一遍,而不去判断"这条到底还作不作数",那这张总结表看起来再工整,也是错的。

研究者把这个问题总结成一句很精炼的话:历史管理问的是"该保留什么信息",而真正要解决的是"哪些信息现在依然有效"。这两个问题看似接近,实际上完全是两码事。

STATEFORGE:先理清楚状态,再动手干活

基于这个洞察,研究者提出了STATEFORGE这套方案。

**STATEFORGE**:一个不需要重新训练模型的辅助系统,核心思路是在每一轮用户说话之后,专门用一个追踪器(tracker)把当前真正有效的要求整理成一份清晰的"当前状态",再把这份状态交给负责干活的主模型,而不是把一整段杂乱的对话历史直接丢给它。

这套系统的设计里有个细节特别值得说道。当某个要求被删除或替换的时候,STATEFORGE不只是把这条要求本身从状态里抹掉,还会把依赖这条要求衍生出来的结论也一并清除。也就是说,它会区分"用户直接说过的要求"和"模型自己根据要求推导出来的结论",一旦源头要求失效,所有建立在它之上的推论都会被连带清理。

在具体实现上,这份整理好的"当前状态"会被插在"缓存的历史对话"和"当前这一轮用户输入"之间,这样既能保持前面的对话内容可以复用缓存,又能确保最新最准的信息离生成答案的那一刻最近。此外还有一个专门的格式追踪器维护输出格式的一致性,以及一个最终检查关卡,在答案生成之后对照着当前状态再核验一遍,发现不对劲就触发重新生成。

效果怎么样呢?在GENERAL-TEST上,裸跑多轮对话的平均得分是0.367,用了STATEFORGE之后涨到了0.467,提升了整整0.1分,而且这个提升的置信区间是[0.030, 0.171],说明这不是巧合。跟前面提到的两个现成历史压缩方案一比,STATEFORGE的0.467也明显超过Deep Agents的0.354和OpenHarness的0.392。

但这还没完。研究者又做了一个很较真的实验:如果不让STATEFORGE自己去猜当前状态,而是直接把标准答案级别的"真实最终意图"喂给模型,会怎么样?

结果这个"开天眼"版本的得分涨到了0.549,比STATEFORGE自己估计出来的状态还要高出0.082分。但即便开了天眼,这个分数依然低于完全干净的单轮对话条件(0.778),中间还差了0.229分。

这个结果挺耐人寻味的。它说明两件事:第一,STATEFORGE自己去估计当前状态这件事,确实还存在误差,这部分误差是可以通过改进追踪器来弥补的;第二,就算状态估计做到完美,模型依然没法完全恢复到"从一开始就把任务讲清楚"时的表现,说明除了状态估计误差之外,还有别的东西在拖后腿,比如模型在面对冗长对话历史时本身的处理能力限制。

这就好比你请了一个特别靠谱的秘书,每次开会前都会帮你把最新议程整理清楚放在你面前,这当然比你自己从一堆往来邮件里现翻要靠谱得多。但即便秘书整理得完美无缺,你还是得花时间消化这份议程,而且你脑子里可能还残留着之前那些已经作废的讨论片段,这些干扰不会因为秘书给你的清单是对的就自动消失。

把这套本事教给更小的模型

发现STATEFORGE有效之后,研究者又往前推进了一步:这套"整理状态"的能力,是不是非得靠一个超大模型才能做好?

他们测试了不同参数规模的追踪器模型,从2B(20亿参数)一路测到122B(1220亿参数)。结果显示,2B和4B的小模型表现明显不如122B,但9B规模的追踪器,和122B相比在统计上已经看不出显著差异了。

这个发现挺实用的,因为它意味着"整理当前意图状态"这件事,并不需要动用一个跟主力模型同等量级的大家伙去干,一个中等规模的模型就够用了。这就跟工厂里不需要让总工程师去检查每一个零件的尺寸是否合格一样,专门配一个熟练的质检员就够了,质检员不需要懂得怎么设计整条生产线。

研究者接着又用了一种叫做**OPD(on-policy distillation,在线策略蒸馏)**的训练方法,让一个2B的小追踪器在122B大模型的监督下不断改进自己的输出。

OPD的大致思路是:小模型先自己尝试给出一个状态更新,大模型看了之后给出纠正意见,小模型再根据这个纠正意见调整。经过一轮这样的训练,2B追踪器的表现从0.266直接跳到了0.445,几乎翻倍,逼近了122B追踪器在同样评测协议下0.428的水平。

除了训练一个独立的小型追踪器,研究者还尝试了另一条路:能不能直接把"整理状态"这个本事,内化到主力模型自己身上,不再需要额外配一个追踪器?

他们用了**思维蒸馏(thinking distillation)**的方法,让一个35B的标准模型去学习教师模型在推理过程中怎么显式地做状态更新。训练完之后,这个35B模型在GENERAL-TEST的drift条件下,得分从0.296提升到了0.461,而且这次完全没有依赖任何外部的追踪器或者历史管理系统。

不过这条路也不是毫无代价的。蒸馏之后的模型在完全干净、没有意图漂移干扰的条件下,得分反而从0.745小幅下降到了0.718。这说明让模型多操心"状态有没有过时"这件事,可能会在一定程度上牺牲它处理简单任务时的效率,有点像一个人一旦养成了凡事多想一步的习惯,面对特别简单直白的事情时反而会显得没那么干脆利落。

这两条路径各自解决的问题不太一样。一条路是把状态维护这件事做成一个可以独立插拔的模块,另一条路是把这个能力彻底焊进模型本身。研究者没有说哪条路一定更好,而是把两条路都摆出来,留给后续研究去做更系统的比较。

这事到底可靠不可靠

研究做到这一步,自然得回头问问:这套用LLM去扮演用户、模拟对话的测试方式,本身靠谱吗?

因为整套benchmark里负责扮演"改主意的用户"的,也是一个LLM,叫DeepSeek-V4-Flash,它既要演用户说话,还要在需要主观判断的地方当裁判。如果这个"演员兼裁判"自己说话就前后矛盾,或者编造一些根本不在剧本里的要求,那整个测试体系的地基就不稳。

研究者为此专门做了一次人工审计,随机抽查了100条模拟用户在"修改意图"阶段说的话,用两个标准去核查:一个叫**保真度**,检查这句话有没有准确地落实到它该执行的那个编辑动作(添加、替换、删除),有没有提前泄露了后面才该出现的内容,或者自相矛盾;另一个叫**连贯性**,检查这句话在指代关系、状态一致性和对话流畅度上有没有问题。

结果保真度达到96%,连贯性达到97%,算是相当高的水准。剩下那一小部分不完美的地方,主要集中在一些重复啰嗦的表述,而不是凭空编造了根本不存在的要求。

这个审计结果给整套benchmark的可信度打下了基础,但研究者自己也挺坦诚地指出了这套系统的局限。比如那个难度校准实验,变体预算和诱饵预算是绑在一起增加的,没法单独拆出来看到底是变体影响更大还是诱饵影响更大;那个消融实验里,带门控的完整版STATEFORGE跟一个匹配过调用次数和token预算的简化版本相比,差距在统计上没有显著区分出来,这意味着目前还不能百分之百断言"一定是那个显式的状态表示在起作用",也可能是别的辅助机制在发挥效果。

这种坦诚挺让人意外的。一篇论文愿意在自己最核心的方法上标注"这里的证据其实还不够硬",这在学术写作里不算常见,但恰恰是这种态度,让整篇论文的可信度反而更高了。

写在后面

读这篇论文的时候,有一个细节让我反复琢磨:那个"历史压缩反而比不压缩更差"的实验结果。

这完全违背了一种很直觉的想法,就是"对话太长肯定是因为信息太多,所以压缩总是对的"。但这篇论文的数据告诉我们,压缩本身解决不了"判断真假"这件事,有时候压缩出来的摘要看起来干净利落,实际上把矛盾的信息糅合进了一句话里,反而更难察觉出问题。这让我想起整理一个混乱的文件夹时,如果只是把文件按日期排好,不去看每个文件是不是已经过时,那整理完之后文件夹看起来很整齐,但依然是一堆废纸和有用文件混在一起。

另一个让我觉得有意思的地方是,论文把"状态估计"和"任务执行"这两件事刻意拆开来研究。很多时候我们讨论AI能力的时候,习惯把它当成一个黑箱整体去评价,好不好、强不强。但这篇论文的做法提醒我们,一个复杂任务里的失败,完全可以拆解成好几个独立的子问题,每个子问题可能需要完全不同的修补方式,有的靠一个小模块就能解决,有的得靠改变整个模型的训练方式。这种拆解思路,其实在很多工程领域都通用,但在评价AI系统的时候,反而经常被忽略。

论文结尾那个开放性的留白也挺真实:即便用上了标准答案级别的真实意图,模型表现依然追不上从一开始就讲清楚的单轮对话。这个差距到底是什么造成的,论文没有给出答案,只是老老实实承认"这个差距说明状态估计误差只能解释一部分问题"。

这反倒让人好奇:如果状态已经理清楚了,剩下那部分差距,到底是模型在面对冗长对话历史时某种难以名状的"分心",还是别的什么我们现在还叫不出名字的东西?

Q&A

Q1:intent drift(意图漂移)是什么意思?

A:指用户在多轮对话中改变了自己的要求,但AI在生成最终答案或执行操作时,依然受到已经被用户推翻、过时的旧要求影响,导致结果出错的一种失败模式。

Q2:STATEFORGE能完全解决意图漂移问题吗?

A:不能完全解决。STATEFORGE能把GENERAL-TEST上的平均任务得分从0.367提升到0.467,但即使给出标准答案级别的真实意图也只能到0.549,依然低于单轮清晰对话的0.778分,说明问题只被部分修复。

Q3:为什么现有的对话历史压缩技术解决不了意图漂移?

A:因为压缩历史解决的是"记不住全部内容"的问题,而不是"哪些内容现在还有效"的问题。压缩后的摘要可能同时保留过时值和新值,或者保留基于已撤回要求推导出的结论,模型依然要自己判断该信哪个。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-