LongMemEval:当对话历史超过百万 token,ChatGPT 的记忆还靠谱吗?


本文来自 UCLA 和腾讯 AI Lab 西雅图团队,合作者包括 UC San Diego 的研究者。一作 Di Wu,通讯作者为 UCLA 的 Kai-Wei Chang 和腾讯的 Dong Yu。

该团队提出了 LongMemEval——一个专门评测聊天助手长期记忆能力的基准。500 道人工编写的题目,嵌在可自由扩展的对话历史中,最长可达 150 万 token。评测覆盖五项核心能力:信息抽取、多轮推理、时间推理、知识更新和拒绝回答。GPT-4o 在这上面准确率暴跌 30%-60%。

论文链接:https://arxiv.org/abs/2410.10813

代码:https://github.com/xiaowu0162/LongMemEval

现有记忆评测的问题:要么太短,要么太窄

聊天助手要变得「懂你」,光靠当前对话的上下文远远不够。你需要它记住上周提过的饮食偏好、上个月讨论的旅行计划、甚至半年前随口一提的宠物名字。这就是长期记忆(Long-Term Memory)的战场。

但现有的评测基准有几个硬伤。

第一,对话历史太短。MemoryBank 只有 5K token 的历史长度,LoCoMo 也才 10K。GPT-4o 光上下文窗口就有 128K,这些基准根本摸不到它的上限。

第二,问题覆盖太窄。大多数基准只考察「你说了什么,模型能不能复述出来」。但在真实场景中,记忆远不只是背诵。

你需要跨多轮对话综合推理(「我最常去的两家餐厅分别是什么」),需要感知信息的更新(「我上周说喜欢日料,但这周改主意了」),还需要处理时间线索(「上个月你推荐的那本书叫什么」)。这些能力,LoCoMo、PerLTQA 都没有系统评测。

第三,对话类型不真实。很多基准用的是人人对话(MSC、LoCoMo),或者纯开放域闲聊。但现实中,用户跟 AI 的对话大量是任务导向的——问保险、查菜谱、写代码。这种差异直接影响记忆系统的设计。

LongMemEval 试图一次性解决这些问题。

五项核心记忆能力,七种问题类型

研究者的思路很清晰:先定义「记忆」到底包含哪些能力,再围绕这些能力设计问题。

五项核心能力如下:

  • 信息抽取(IE):从长对话历史中回忆特定信息,包括用户和助手双方说过的内容
  • 多轮推理(MR):综合多个 session 中的信息做聚合、比较
  • 知识更新(KU):识别用户信息的变化并动态更新
  • 时间推理(TR):利用对话中的时间戳和元数据做时间相关的推理
  • 拒绝回答(ABS):对历史中从未出现的信息,正确地拒绝回答

围绕这五项能力,LongMemEval 设计了七种问题类型。单轮用户信息、单轮助手信息、单轮偏好测试考察基础记忆。多轮推理、知识更新、时间推理考察复杂能力。另外从前面几类中抽了 30 道题改写成「错误前提」问题,测试模型会不会胡编。

LongMemEval 的七种问题类型示例

这个设计的关键在于:每道题的「证据」被巧妙地嵌入在多个对话 session 中,而不是直接摆在那里等你找。

用户 LLM 被指示以间接方式透露关键信息——比如要传达「用户上个月买了新车」,对话可能从车险问题开始,不经意间带出这个事实。这让问题难度大幅提升。

数据构建:可控、可扩展、够真实

LongMemEval 的数据构建流程分三步。

第一步,定义用户属性体系。研究者手工构建了 164 个用户属性,覆盖人口统计、生活方式、情境上下文、生活事件和物品拥有五大类。每个属性对应一个具体的用户背景段落。

第二步,生成问题。对每个属性,用 LLM 生成种子问答对,然后人工改写。这里有个细节值得注意:LLM 生成的种子问题往往缺乏深度和多样性,最终只有约 5% 的题目被保留。每道题的答案被分解成多个「证据陈述」,带可选时间戳,分别嵌入不同的对话 session。

第三步,组装历史。证据 session 和无关 session 混合在一起,组成一段连贯的对话历史。无关 session 来自 ShareGPT、UltraChat 和模拟对话的混合。整个过程的关键设计是历史长度可自由配置

数据构建流程

为此,LongMemEval 提供两个标准设置:

  • LongMemEvalS_S:约 115K token(约 50 个 session)
  • LongMemEvalM_M:500 个 session,约 150 万 token

150 万 token 是什么概念?大约相当于一个用户和 AI 连续对话好几个月产生的文本量。

先来看看现状有多惨

在提出优化方案之前,研究者先拿现有系统测了一圈。结果相当令人警醒。

商业系统:记忆不如直接阅读

研究者从 LongMemEval 中随机抽取 97 道题,构建了一个比 LongMemEvalS_S 短 10 倍的简化历史(3-6 个 session),然后在 ChatGPT 和 Coze 上手动测试。

先看一个对比数字:GPT-4o 在「直接阅读完整历史」模式下准确率 91.8%。但同样是这个模型,通过 ChatGPT 的记忆功能在线记忆并回答时,准确率掉到 57.7%。Coze 更惨,只有 33.0%。

这意味着什么?模型的阅读理解能力没问题,但把信息存到记忆里、再从记忆里找出来这个过程中,大量信息丢失了。

有意思的是,两种系统的失败模式不一样。ChatGPT 倾向于「先记住,后覆盖」——它会在对话中即时记录用户信息,但随着 session 增多,压缩历史时会修改甚至丢弃之前的记忆。

Coze 则是「根本没记下来」——对于间接表达的信息,它常常压根没有捕捉到。

长上下文模型:一样不行

也许你会想,那直接把 115K token 的历史全部喂给模型呢?研究者也试了。

结果:即便只跟只提供证据 session 的「oracle」设定相比,GPT-4o 在 LongMemEvalS_S 上准确率下降了 30.3%,Llama 3.1 8B Instruct 更是下降了 55.1%。

而且 LongMemEvalS_S 才 50 个 session。随着历史变长,性能只会更差。

统一视角:三阶段、四控制点

面对这些问题,研究者提出了一个统一的记忆系统框架。

统一记忆系统框架

记忆被抽象为一个大规模的键值存储,三个阶段分别是索引(把对话存进去)、检索(根据问题找到相关记忆)、阅读(让 LLM 基于检索结果生成回答)。四个控制点则是:

  1. Value:记忆项的粒度——存整个 session,还是拆成单轮对话,还是进一步压缩成事实?
  2. Key:索引键的设计——用原文做键,还是用摘要/关键词/用户事实扩展?
  3. Query:检索查询的优化——面对时间相关的查询,怎么缩小检索范围?
  4. Reading:阅读策略——拿到检索结果后,怎么让 LLM 更准确地提取信息?

接下来逐一看实验发现。

拆得越细,读得越好

第一个发现来自 Value 的选择。

研究者比较了三种粒度:完整 session、拆成单轮(round)、进一步压缩成事实或摘要。在 LongMemEvalM_M 上,把 session 拆成 round 后,用 GPT-4o 做阅读器,准确率显著提升。原因是 round 粒度更细,检索时更容易命中目标信息。

但进一步压缩就不一定好了。用摘要或事实替换原始内容,虽然节省 token,但会丢失细节——模型可能知道「用户喜欢看书」,但忘了「用户上周二在咖啡馆提到了一本叫《暗数据》的书」。

有一个例外:多轮推理题。把内容压缩成事实后,跨 session 的聚合和比较反而变容易了。研究者推测,这是因为事实提取把不同 session 中的同类型信息统一成了简洁、一致的格式,方便 LLM 做比较。

另外一个有趣的发现是:不同能力的阅读器需要的 token 预算差异巨大。Llama 3.1 8B Instruct 超过 3K token 就开始混乱,而 GPT-4o 给到 20K+ 还在持续提升。

索引扩展:多条路径通向目标

第二个优化在 Key 这端。

直觉上,用摘要或关键词替代原文做索引,语义更集中,检索应该更准。但实验结果出乎意料:用压缩信息单独做键,检索效果反而不如直接用原文。

原因在于,现代嵌入模型(如 Stella V5)已经能很好地处理长文本语义。压缩信息丢失了原文的丰富上下文,得不偿失。

研究者的解法是文档扩展(Document Expansion)——把提取出的用户事实拼接到原文前面,一起做索引键。这样既保留了原文的完整语义,又给检索提供了额外的匹配路径。

效果如何?以 round 做粒度、用户事实做扩展,Recall@5 从 0.582 提升到 0.644,Recall@10 从 0.692 提升到 0.784。端到端的问答准确率也提高了约 5 个百分点。

时间感知:给检索加上「时间滤镜」

第三项优化针对时间推理题。

这类问题在 LongMemEval 中占比不小:「上周末你推荐的那家餐厅叫什么?」「三个月前我提到的那个项目进展如何?」面对这种问题,纯语义检索基本无能为力——「上周末」和「周六晚上」的语义距离很远,但它们指向同一时间段。

研究者的方案简单有效:索引时额外记录每个事件的时间戳,检索时先用 LLM 从问题中提取时间范围,再只在这个范围内的记忆项中搜索。

时间感知查询扩展

效果:时间推理子集的 Recall@5 提升了 7%-11%。不过这个方法有个前提——提取时间范围的 LLM 得够强。GPT-4o 能准确推断出「上周末」对应哪个时间段,但 Llama 3.1 8B Instruct 经常搞错或遗漏时间线索。

先提取再回答:阅读策略也很关键

最后一项优化在阅读阶段。

LongMemEval 的很多题需要综合多个 session 的信息。即便检索完美,把十几条记忆项丢给 LLM,它也不一定能准确提取出关键内容。

研究者用了两招。一是 Chain-of-Note(CoN):让 LLM 先逐条阅读记忆项,提取关键信息写成笔记,再基于笔记回答问题。这把一个复杂的长上下文推理任务拆成了「复制粘贴」和「短文本推理」两个简单步骤。二是用 JSON 结构化格式呈现记忆项,帮 LLM 明确区分每条记忆的边界。

两项加在一起,在 oracle 检索设定下(即检索结果完全正确),不同模型提升了最多 10 个绝对百分点。

写在最后

LongMemEval 的贡献可以概括为三点。

首先,它定义了一个全面的长期记忆能力框架。五项能力、七种问题类型,覆盖了之前所有基准忽略的盲区——助手侧信息回忆、知识更新、时间推理、拒绝回答。

其次,基准本身设计精巧。164 个用户属性、500 道人工编写的题目、间接证据嵌入、可自由扩展的对话历史。这些设计让 LongMemEval 既难又真实。

最后,基于三阶段四控制点的统一框架,研究者给出了实用的设计建议:round 粒度存储、事实扩展索引、时间感知检索、先提取再回答。每一招都有实验数据支撑。

论文作者在 GitHub 上开源了全部数据和代码。对于正在做对话记忆系统的团队来说,这是一个有实际参考价值的基准。未来,如何在更长的时间跨度、更多模态的信息上管理记忆,仍然是开放问题。