- 模型评测
- AI 评测
- 人工智能
- 大模型
【免费下载链接】LongMemEval
Benchmarking Chat Assistants on Long-Term Interactive Memory (ICLR 2025)
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 提供了一条"先扩展、后剪枝"的组合拳:
- 离线扩展:用 batch_expansion_session_temp_event.py 从每个会话抽取带日期的用户事件,输出为
{"date": "YYYY/MM/DD", "event": "..."}结构(无法推断时间的事件会被丢弃); - 查询时推断:temp_query_search_pruning.py 先让 LLM 根据问题和提问日期推断相关时间范围(无时间参照的问题直接判为 N/A 跳过);
- 剪枝排序:将事件日期落在时间范围内(前后各放宽 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关键参数速查:
| 参数 | 可选值 |
|---|---|
| RETRIEVER | flat-bm25、flat-contriever、flat-stella、flat-gte |
| GRANULARITY | turn或session |
| EXPANSION_TYPE | session-summ、session-keyphrase、session-userfact、turn-keyphrase、turn-userfact |
| JOIN_MODE | separate、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)
相关推荐
All-in-RAG索引优化技巧清单:如何提升Milvus向量检索的速度与召回率
All in RAG索引优化技巧清单:如何提升Milvus向量检索的速度与召回率 本文是 All in RAG 索引优化技巧清单,面向 RAG 新手与普通用户:
示例工程教程人工智能大模型RAG开发你的第一个Jumpcut插件:扩展剪贴板功能的完整指南
开发你的第一个Jumpcut插件:扩展剪贴板功能的完整指南 Jumpcut是一款专为macOS设计的极简剪贴板管理工具,它能帮助用户轻松管理和快速访问剪贴板历史
终极OpenCombine调试指南:3个LLDB类型摘要技巧提升开发效率
终极OpenCombine调试指南:3个LLDB类型摘要技巧提升开发效率 OpenCombine作为Apple Combine框架的开源实现,让开发者能够在多平
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考