如何运行 MemPalace 的 MemBench(ACL 2025)检索基准并解读各难度类别得分?
【免费下载链接】mempalaceThe best-benchmarked open-source AI memory system. And it's free.项目地址: https://gitcode.com/GitHub_Trending/me/mempalace
MemPalace 仓库的benchmarks/目录内置了多个记忆检索基准脚本,其中 membench_bench.py 对应 MemBench(ACL 2025)数据集:8,500 个多轮对话 QA 条目,覆盖 10 个难度类别。这篇文章说明如何在本机运行这个基准,复现仓库公布的 80.3% R@5(hybrid 模式、top-5),并逐类别解读得分含义。整个过程不需要 API key、不需要 LLM、不需要 GPU,只需要提前把数据集下载到本地。
先确认指标口径:检索召回率,不是问答准确率
MemBench 每个条目包含一段多轮对话(message_list)和一道选择题(question、choices、ground_truth、target_step_id)。脚本的评分方式是:
- 把该条目的所有对话轮次建入临时 ChromaDB 集合(
EphemeralClient,跑完即弃); - 用问题做检索,取 top-K 候选;
- R@K = 答案相关轮次(
target_step_id)是否出现在 top-K 检索结果中。
这一点在 BENCHMARKS.md 的 "Notes on Reproducibility" 中有明确界定:这些分数衡量的是"正确会话/轮次是否在 top-K 里",即 retrieval recall,不是端到端 QA 准确率(由 LLM 用检索结果生成答案是否正确)。两者不能直接比较,解读得分时先记住这个口径。
准备:安装依赖与获取数据集
安装环境
在 mempalace 仓库根目录执行(来自 benchmarks/README.md 的 Setup 一节):
uv sync --extra dev # or: pip install -e ".[dev]"benchmarks/README.md 列出的要求是:
- Python 3.9+
chromadb(唯一依赖)- 基准运行期间不需要联网(数据下载完成后)、不需要 API key、不需要 GPU
下载 MemBench 数据
membench_bench.py 的文档头写明数据来源于import-myself/Membench仓库,用法示例把数据目录放在/tmp/membench/MemData/FirstAgent。克隆到该位置即可对上示例路径:
git clone https://github.com/import-myself/Membench.git /tmp/membench克隆后,MemData/FirstAgent目录下应包含各类别的 JSON 文件(simple.json、highlevel.json、knowledge_update.json、comparative.json、conditional.json、noisy.json、aggregative.json、highlevel_rec.json、lowlevel_rec.json、RecMultiSession.json、post_processing.json)。注意脚本对缺失的文件是静默跳过的——某个类别文件不在,该类别就不会出现在结果里,也不会报错。如果数据放在别处,把下面命令的第一个参数改成你的FirstAgent目录即可。
运行基准
先用 --limit 做冒烟测试
脚本用法示例中给出的快速测试命令(只跑 50 条):
python benchmarks/membench_bench.py /tmp/membench/MemData/FirstAgent --limit 50确认能正常输出检索进度和结果后再跑全量。
完整默认运行
python benchmarks/membench_bench.py /tmp/membench/MemData/FirstAgent这条命令对应仓库公布的 80.3% 参考结果:默认--mode hybrid、--top-k 5、全部类别、movie 主题外加数据文件中的 roles/events 题目,共 8,500 条。
可选参数(来自脚本的 argparse 定义):
| 参数 | 默认值 | 用途 |
|---|---|---|
--category | 全部类别 | 只跑单个类别,如--category highlevel,可选值即上表 11 个类别文件对应的名称 |
--topic | movie | 主题过滤:movie、food、book |
--top-k | 5 | 检索 top-k |
--limit | 0(全量) | 限制条目数,用于快速测试 |
--mode | hybrid | raw为纯嵌入检索;hybrid先取 3 倍 top-k 候选,再用谓词关键词重合度重打分取前 top-k |
--out | 自动命名 | 结果 JSON 输出路径,默认形如benchmarks/results_membench_{mode}_{category}_{topic}_top{k}_{时间戳}.json |
单类别示例(脚本 docstring 中的原示例):
python benchmarks/membench_bench.py /tmp/membench/MemData/FirstAgent --category highlevel如果你想对比纯嵌入检索的效果,可加--mode raw。注意仓库公布的 MemBench 参考分数是 hybrid + top-5 口径,要复现 80.3% 就用默认参数。
输出长什么样
运行中每 50 条打印一次进度:
[ 100/8500] running R@5: 81.0%(以上为按脚本打印格式示意的一行,数值会随你的运行进度变化。)
结束时打印汇总块,结构如下——数值部分为仓库公布的参考结果(BENCHMARKS.md "MemBench (ACL 2025)" 一节,并已核对提交在仓库的结果文件):
RESULTS — MemPal on MemBench (hybrid mode, top-5) Overall R@5: 80.3% (6828/8500) By category: aggregative 99.3% (993/1000) comparative 98.4% (984/1000) knowledge_update 96.0% (960/1000) simple 95.9% (959/1000) highlevel 95.8% (479/500) lowlevel_rec 99.8% (499/500) highlevel_rec 76.2% (381/500) post_processing 56.6% (566/1000) conditional 57.3% (573/1000) noisy 43.4% (434/1000)脚本是确定性的——文档明确说明"same data + same script = same result",嵌入同样可复现,所以同样的数据与参数应得到同样的数。结果 JSON 默认写入benchmarks/下,仓库已提交一份完整结果文件 results_membench_hybrid_all_movie_top5_20260414_1656.json:其中 8,500 条记录逐题包含 question、ground_truth、target_sids、retrieved_sids 和 hit 标志,可以逐题审计而不是只看汇总。
如何解读各难度类别的得分
BENCHMARKS.md 给出的各含义说明:
| 类别 | R@5 | 含义 |
|---|---|---|
| aggregative | 99.3% | 组合多轮信息 |
| comparative | 98.4% | 跨轮次比较两个对象 |
| lowlevel_rec | 99.8% | 推荐类——低层 |
| knowledge_update | 96.0% | 随时间变化的事实 |
| simple | 95.9% | 单轮事实召回 |
| highlevel | 95.8% | 需要聚合的推理 |
| highlevel_rec | 76.2% | 推荐类——高层 |
| conditional | 57.3% | 条件推理 |
| post_processing | 56.6% | 后处理类任务 |
| noisy | 43.4% | 混入干扰项/无关信息 |
| Overall | 80.3% | 6828/8500 |
解读时按文档给出的结论分三档看:
- 强项(aggregative / comparative / lowlevel_rec):MemPalace 对多轮事实组合处理得很好,这是它的核心设计(逐字原文存储 + 嵌入检索)覆盖的场景;
- noisy(43.4%)是设计上的最难类别:题目刻意混入与信号在嵌入层面无法区分的干扰信息,文档明确称这是"verbatim storage 的设计硬场景"——噪声与信号在嵌入层面不可区分时,检索就会退化。如果你的运行里 noisy 落在 43% 上下,这是文档记录的预期行为,不是配置错误;
- conditional / post_processing(57.3% / 56.6%):属于推理密集型类别,文档的表述是"retrieval alone is insufficient"——纯检索本身不够,这解释了为什么它们停在 50%–60% 区间。
如果某个类别分数明显偏离上表,文档支持的核对方向是:确认数据目录里对应类别的 JSON 文件齐全(缺失会被静默跳过)、运行参数与参考口径一致(默认 hybrid + top-5),然后打开结果 JSON 逐题比对retrieved_sids与target_sids。
限制
- 全程无 LLM:MemBench 这条基准只测检索召回,不需要任何 API key;这与 LongMemEval 等脚本中可选的
--llm-rerank流程不同。 - 80.3% 是 hybrid 模式 + top-5 的口径。换成
--mode raw或不同--top-k,分数会不同,仓库没有公布这些口径的 MemBench 参考值,无法直接对照。 - 主题过滤只影响 topic-keyed 文件(movie/food/book);数据中按 roles/events 组织的条目会始终被加载,所以默认一次运行就是全部 8,500 条。
继续深入
- 基准总分、其他基准(LongMemEval / LoCoMo / ConvoMem)的复现命令:benchmarks/README.md 与 benchmarks/BENCHMARKS.md
- hybrid 评分细节(关键词重打分公式等):benchmarks/membench_bench.py 的
run_membench - 逐题审计入口:
benchmarks/results_*.json结果文件,每个文件包含每一题的检索明细
【免费下载链接】mempalaceThe best-benchmarked open-source AI memory system. And it's free.项目地址: https://gitcode.com/GitHub_Trending/me/mempalace
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考