想象一下这样的场景:你跟一个电影推荐助手说“我最近不想看斯派克·李那种风格的片子”,它信誓旦旦地记住了。结果聊了五分钟,它又给你推了一部斯派克·李的电影。你是不是想顺着网线过去敲它脑壳?这种场景在如今的“对话式推荐系统”里其实并不罕见,哪怕背后驱动的是大语言模型。原因说起来也简单:模型确实“听”到了你的话,但并没有把你的偏好记进一个结构化的、能持续更新的“小本本”里。多数系统的做法,就是把整段聊天记录像倒垃圾一样倒进Prompt,指望模型自己从中提炼关键信息。一旦对话长了、信息杂了,模型就开始“选择性失忆”,甚至把用户随口一说的模糊表述理解偏了。来自四川大学、新加坡国立大学和新加坡管理大学的研究者们,盯上的正是这个痛点。他们发表在EMNLP 2026主会议上的新工作,提出了一个名为DREAMS的框架:用双节点蒙特卡洛树搜索(Dual-node Monte Carlo Tree Search)把对话上下文变成显式的、用于决策的结构化偏好状态,从而同时优化对话式推荐最核心的两件事——向用户提问以获取偏好(preference elicitation)和用偏好搜索合适物品(preference exploitation)。论文的实验结果相当能打,平均成功率相对最强基线提升7.43%,代码也已经开源。
对话推荐系统的"记忆困境":为什么上下文越长反而越糊涂?
对话式推荐系统(CRS)的目标很明确:在跟用户一来一回的聊天中,逐步摸清用户喜欢什么、不喜欢什么,然后在合适的时机把最合适的物品推给对方。看似简单,但真正落地时会发现一个坎:用户的偏好并不是一次性说完的,而是藏在多轮对话的只言片语里。举个论文里的例子。用户说了一句“我不是斯派克·李风格的粉丝”(not a big fan of Spike Lee’s style),这句话其实在表达一个对导演的负面偏好。这个偏好如果没被系统记住,那么后续推荐时系统很可能还会继续推这位导演的作品,用户只能一次次拒绝,体验直接跌入谷底。问题出在哪?论文开篇就把矛头指向了现有大模型会话推荐系统的上下文建模方式。很多系统是直接拿“整段自由文本对话历史”去填充大模型的提示词,让模型判断下一步是继续问还是直接推荐。这种方式有两个硬伤。第一,信息过载。对话历史越长,有效信号越容易被淹没在寒暄和废话里。第二,噪声检索。当需要给用户找物品时,如果直接用整段对话去向量库做检索,那些跟偏好无关的闲聊内容就会成为干扰项,把真正有用的偏好埋掉,使得检索结果“货不对板”。有人可能会说,那把对话结构化成JSON不就行了吗?确实有研究这么干,但论文指出,现有JSON式方法通常是“每轮一个独立的状态快照”,没有建起状态之间的演变依赖关系。换句话说,它把这些偏好状态当作一堆孤立的记忆碎片,而不是一个有前因后果的“动态剧本”。为了验证这个判断,论文专门做了一项“摸底考试”。他们设计了一系列基于错误的指标,仔细考察现有会话推荐系统在偏好询问和偏好利用上的具体翻车点。结果显示,不光是直接把对话文本丢给大模型的InterCRS容易犯错,采用JSON结构化上下文的RA-CRS,以及使用蒙特卡洛树搜索的SAPIENT-LLM、T-EPL也各自存在明显的“迷惑行为”。这些系统的共同问题在于:它们要么有结构化状态但不会基于状态做长线规划,要么有搜索规划但没有把用户偏好本身作为树节点里的显式语义表示。结果就是偏好跟踪这件事做不扎实——问问题时抓不住重点,推荐时又容易选错目标。DREAMS就是把“结构化偏好状态”和“蒙特卡洛树搜索规划”拧到了一起。下面这张表是论文的初步实验结果。可以看到,现有系统在最基本的“该问还是该推”上都存在大量误判,CGE²(粗粒度询问误差)最高能到0.570。这意味着系统有57%的概率在错误的时机做了错误的事——比如明明已经可以推荐了还在问东问西,或者检索质量不合格就贸然推荐。
DREAMS的全称是Dual-node conversational RecommEndAtion system using Monte carlo tree Search。名字很长,但核心思想并不难懂。它把整个对话过程看成一颗不断生长的树:树上的每个节点都保存了一份结构化的偏好状态,节点与节点之间的边则代表一次状态转移。这份偏好状态不是简单堆几行对话摘要,而是用类似JSON的键值对,把用户对导演、演员、类型等属性的喜欢、不喜欢、还没问到、被纠正过的信息全都清晰记录下来。在树上跑的,是两类分工明确、但共享同一份偏好状态的节点。这两类节点可以被想象成一台机器的“双核处理器”,各管一摊,但又通过共享的偏好状态紧密协作。第一类节点叫ELNode(偏好询问节点),负责“套话”。当系统拿不准该问什么、要不要追问被拒绝的推荐时,ELNode会调用蒙特卡洛树搜索,把未来几轮对话可能出现的状况都“脑补”一遍,再挑一个最有助于补全用户偏好画像的对话动作去执行。它可以问用户喜欢哪种类型(GenreInquiry),可以问喜欢哪位演员(StarInquiry),可以问喜欢哪个导演(DirectorInquiry),也可以在用户拒绝推荐后复盘原因(FailureReflection),或者判断时机已到,转入推荐环节(ItemRec)。第二类节点叫EXNode(偏好利用节点),负责“干活”。一旦ELNode认为信息收集得差不多了,决定向用户推荐物品,EXNode就会被激活。它接过ELNode更新后的偏好状态,把散落在多轮对话中的碎片化偏好整合成一段适合检索的查询语句,再交给向量检索模块去物品库里捞货。这里的关键在于,EXNode不会直接用原始对话当查询,而是会尝试把“用户不喜欢斯派克·李”这类口语化表达,转换成类似于“导演:不喜欢斯派克·李”这种显式的机器可读约束,最大程度消除闲聊噪声。这两类节点的衔接颇有讲究。ELNode里有一个专门的“转向推荐”动作,一旦选中,就触发EXNode执行检索。检索完推荐出去,用户接受了自然皆大欢喜;如果用户拒绝了,这个负面反馈又会被写回偏好状态,ELNode再次激活,启动“失败反思”去修正或补充偏好。这就形成了一条“提问—推荐—反馈—再提问”的闭环,偏好状态像一条连续的河流,而不是一潭死水。