☰
LongMemEval索引扩展5大技巧:摘要、关键词与用户事实如何提升记忆召回率
2026/10/15 17:09:15 网站建设 项目流程
  • 模型评测
  • AI 评测
  • 人工智能
  • 大模型

【免费下载链接】LongMemEval

Benchmarking Chat Assistants on Long-Term Interactive Memory (ICLR 2025)

项目地址:https://gitcode.com/gh_mirrors/lo/LongMemEval
点击查看免费下载

LongMemEval 是 ICLR 2025 发布的长期交互记忆基准,用于测试聊天助手的长期记忆能力。本文将带你掌握它的索引扩展(Index Expansion)机制——会话摘要、关键词抽取、用户事实提取、轮级扩展与时间感知剪枝这 5 大技巧,并说明如何用一条命令把它们接入检索流程,显著提升记忆召回率。

1️⃣ 为什么需要索引扩展:记忆召回的"大海捞针"难题

LongMemEval 包含 500 道高质量问题,覆盖信息抽取、多会话推理、知识更新、时间推理和拒答 5 种核心能力。其中longmemeval_m.json的历史记录包含约 500 个会话——真正的证据会话往往埋在海量填充会话之中,正如官方数据集示例图所示:

直接用 BM25 或稠密向量在原始对话文本上检索,会面临两个问题:

  • 词汇鸿沟:用户问"我上次买的相机镜头是什么型号",但会话里可能只出现了品牌缩写;
  • 语义噪声:一个长会话里混杂大量无关寒暄,稀释了关键信息。

索引扩展的思路是:在构建检索索引前,先用 LLM 为每个会话(或轮次)生成"检索友好的别名"——摘要、关键词、用户事实等,让检索器能更精准地命中证据位置。所有扩展代码位于 src/index_expansion/ 目录。

2️⃣ 五大技巧总览:一张表看懂全部方案

技巧粒度作用生成脚本
会话摘要(session-summ)session生成聚焦用户诉求的短摘要batch_expansion_session_summ.py
会话关键词(session-keyphrase)session生成分号分隔的关键词列表batch_expansion_session_keyphrases.py
用户事实(session-userfact)session抽取个人信息、事件与偏好batch_expansion_session_userfact.py
轮级扩展(turn-keyphrase / turn-userfact)turn同上,但定位到单轮对话batch_expansion_turn_keyphrases.py、batch_expansion_turn_userfact.py
时间感知剪枝(Temporal Pruning)session按时间范围缩小检索空间temp_query_search_pruning.py

3️⃣ 技巧一:会话摘要(session-summ)——给长对话"瘦身"

摘要脚本用一个简单提示词让 LLM 把整个会话压缩为一段短摘要,提示词中有两个关键设计:

  • 要求"as concisely as possible in a short paragraph",输出上限仅 500 token;
  • 明确强调focus more on what the user mentioned or asked for——因为长期记忆评测中,证据大多藏在用户话语里。

摘要作为索引 key 时,长会话的噪声被大幅压缩。如果 join 策略带split后缀(如split-separate),摘要还会被 sent_tokenize 拆句,每句话各自成为一个检索单元,进一步提高命中粒度。

4️⃣ 技巧二:关键词扩展(session-keyphrase)——实体命中更精准

关键词脚本让 LLM 为会话生成以分号分隔的 keyphrase 列表(输出上限仅 100 token),加载时用;切分成独立词条。

它的价值在于实体与专有名词的归一化:对话里零散提到的"Sony A7R IV""24-70mm f/2.8 lens"等型号,会被集中提炼成显式关键词,弥补 BM25 等词法检索器的词汇匹配短板。轮级版本 batch_expansion_turn_keyphrases.py 则对每一轮对话单独抽取关键词,适合把证据定位到具体轮次。

5️⃣ 技巧三:用户事实提取(session-userfact)——结构化"记住你是谁"

这是针对用户信息类问题最有效的一招。其系统提示词要求:

  • 抽取所有与用户相关的个人信息、生活事件、经历和偏好,且必须保留具体数字、地点、日期等细节;
  • 每条事实写成一句独立陈述(json 列表),并消除指代(代词替换为真实实体);
  • 若会话无个人信息,则输出空列表,避免污染索引。

脚本内置了zero-shot 与 ICL(上下文学习)两种模式,ICL 模式携带了精心构造的 few-shot 示例,覆盖"有事实"与"无事实"两类情形,抽取质量更稳定。这样,自由对话被转换成了结构化的事实陈述(如"The user bought a $100 gift card for their brother's graduation in May."),检索"我五月给兄弟买了什么"这类问题时召回率显著提升。

6️⃣ 技巧四:三种合并方式——separate / merge / replace

扩展结果如何融入原始语料,由 join 模式决定,核心逻辑在 index_expansion_utils.py 的resolve_expansion函数中:

模式行为适用场景
separate扩展内容作为独立的 (key, value) 条目加入索引,与原条目共同指向同一会话保留原文同时新增检索入口,最稳妥
merge扩展内容拼接在原文前形成新 key希望两者一起参与打分
replace用扩展内容替换原文索引空间有限、噪声严重时

三种模式还可与split组合(如split-separate:先按句/词切分扩展内容,再逐条作为独立条目)。

7️⃣ 技巧五:时间感知查询剪枝——用时间范围"缩小包围圈"

针对 temporal-reasoning 类问题,LongMemEval 提供了一条"先扩展、后剪枝"的组合拳:

  1. 离线扩展:用 batch_expansion_session_temp_event.py 从每个会话抽取带日期的用户事件,输出为{"date": "YYYY/MM/DD", "event": "..."}结构(无法推断时间的事件会被丢弃);
  2. 查询时推断:temp_query_search_pruning.py 先让 LLM 根据问题和提问日期推断相关时间范围(无时间参照的问题直接判为 N/A 跳过);
  3. 剪枝排序:将事件日期落在时间范围内(前后各放宽 2 天)的会话移到排序列表最前面,其余移到最后,从而在不删除信息的前提下提升 Recall@k 与 nDCG。

脚本还会自动输出剪枝前后的 recall_all@5/10 与 ndcg_any@5/10 对比指标,效果一目了然。

8️⃣ 上手实践:一条命令接入索引扩展

索引扩展与检索的整合入口是 src/retrieval/run_retrieval.sh,完整参数说明见 README.md 的 "Index Expansion" 小节。

第一步:下载官方预生成的扩展结果缓存文件,解压到index_expansion_logs/目录(官方已提供,无需自己跑 LLM 批量生成)。

第二步:运行带索引扩展的检索:

cd src/retrieval bash run_retrieval.sh longmemeval_s.json flat-bm25 session session-userfact merge index_expansion_logs/xxx.session-userfact.ICL.json

关键参数速查:

参数可选值
RETRIEVERflat-bm25、flat-contriever、flat-stella、flat-gte
GRANULARITYturn或session
EXPANSION_TYPEsession-summ、session-keyphrase、session-userfact、turn-keyphrase、turn-userfact
JOIN_MODEseparate、merge、replace(可加split-前缀)
CACHE与 EXPANSION_TYPE 对应的缓存文件路径

第三步:查看检索指标:

python3 src/evaluation/print_retrieval_metrics.py retrieval_logs/你的日志文件

注意:检索评测会自动跳过 30 个 abstention 实例(它们指向不存在的事件,无标准答案位置)。

第四步(可选):拿到检索结果后,可用 src/generation/run_generation.sh 进行检索增强问答,走完整的"检索 → 生成"闭环。

9️⃣ 总结:按问题类型选对扩展技巧

  • 📝会话冗长、噪声多→ 用session-summ摘要瘦身;
  • 🔑问题含实体、型号、专有名词→ 用session-keyphrase关键词扩展;
  • 🙋问用户个人信息、生活事件→ 用session-userfact,收益最大;
  • 🎯需要精确定位证据轮次→ 切到turn粒度配合轮级扩展;
  • ⏰问题带时间参照(上周/上个月)→ 叠加时间感知剪枝。

索引扩展的本质是在"索引侧"做一次低成本的信息重构,让检索器看到更适合被匹配的表达。结合 src/retrieval/run_retrieval.py 中灵活的 join 模式,你可以快速实验不同组合,找到适合自己记忆系统的最佳召回方案。

  • 模型评测
  • AI 评测
  • 人工智能
  • 大模型

【免费下载链接】LongMemEval

Benchmarking Chat Assistants on Long-Term Interactive Memory (ICLR 2025)

项目地址:https://gitcode.com/gh_mirrors/lo/LongMemEval
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询