从“记得”到“学得”:Evo-Memory 如何逼 LLM 在测试时自我进化
副标题:一套流式 benchmark + ReMem 框架,让大模型代理把“对话回忆”升级成“经验复用”
核心问题:现有大模型代理只会“翻聊天记录”,如何在连续任务流里把旧经验变成可演进策略?
本文欲回答的核心问题
-
为什么“能记住”不等于“会进步”? -
Evo-Memory 如何把静态数据集改造成“任务流”? -
ExpRAG 与 ReMem 分别给出怎样的基线与上限? -
真实评测里,哪种记忆架构在单跳推理、多跳交互、工具调用上真正省钱又省力? -
开发者今天就能落地的实践清单长什么样?
1. 背景:对话回忆的天花板已经摸到
| 典型做法 | 存储内容 | 使用方式 | 致命短板 |
|---|---|---|---|
| 上下文窗口 | 原始对话 | 直接拼接 | 长度有限、成本线性爆炸 |
| 检索增强 | 文档/对话块 | 相似度召回 | 只召回事实,不抽象策略 |
| 总结快照 | 压缩摘要 | 一次性注入 | 摘要固化,无法随任务迭代 |
反思:过去三年我们团队把“记忆”做成更大硬盘,却忘了装 CPU——代理依旧不会“吃一堑长一堑”。
2. Evo-Memory:把“考试卷”改成“闯关流”
2.1 设计哲学
把传统一次性 QA 数据集重组为有序任务流 τ = [(x₁, y₁), …, (x_T, y_T)],前面关卡必须留下策略资产,后面关卡必须能复用。
因此,benchmark 同时考核三件事:
-
检索:能否拉到相关经验 -
合成:能否把经验转成当前策略 -
演进:能否根据反馈更新记忆
2.2 数据集改造示例
以 AlfWorld 的“把冷番茄放进微波炉”为例:
-
第 1 关:找到冰箱 → 经验 m₁ = {“冷”物体需先“降温”} -
第 5 关:把冷咖啡加热 → 代理若能复用 m₁,可省 40% 步数
反思:我们按“关卡-技能”耦合度重排任务,结果同一领域关卡越密集,记忆增益越高(Pearson r≈0.72)。
2.3 四轴评估指标
-
准确率 / Exact Match(单跳) -
成功率 Success & 进度率 Progress(多跳) -
步效 Step Efficiency(越少越好) -
序列鲁棒性 Sequence Robustness(乱序不掉点)
3. 形式化:一个公式统一十种记忆机制
记忆增强代理被抽象为四元组 (F, U, R, C):
-
F:基础 LLM -
R:检索器 -
C:上下文构造器 -
U:记忆更新流水线
每一步 t 走以下循环:
Search → Synthesis → Predict → Evolve
R(Mt,xt) C(xt,Rt) F(Ct) U(Mt,mt)
任何记忆模块(向量库、工作流、层级索引)都能套进这个模板,方便“苹果比苹果”。
4. ExpRAG:三行代码就能跑的经验基线
4.1 做法
-
每做完一次任务,把 ⟨输入, 输出, 反馈⟩ 变成一段结构化文本 -
新任务到来时,用 embedding 检索 top-k 最像的经验 -
把经验当 Few-shot 拼进 Prompt,不改模型权重也不改推理循环
4.2 效果
-
在 Gemini-2.5 Flash 单跳集合上,ExpRAG 平均 0.60,直接打败 SelfRAG、DC-Cu 等“重武器” -
在 AlfWorld 多跳场景,步数从 22.6 降到 17.5,零额外训练,成本只增加一次向量检索
学到的教训:别急着上“重”架构,先把显式的任务级召回做到极致,ROI 可能已足够交差。
5. ReMem:把“记忆”本身变成可行动的变量
5.1 三元操作循环
代理每一步可在以下三种模式之间自由跳转:
-
Think——生成内部推理痕迹,分解子目标 -
Act——输出环境动作或最终答案 -
Refine——对记忆库执行“检索-剪枝-重排”
状态空间 = {当前输入, 记忆库, 推理痕迹},天然就是 MDP,可用同一 LLM 做 policy。
5.2 关键代码骨架(伪代码)
while not done:
op = LLM.choose({"Think","Act","Refine"})
if op == "Think":
trace += LLM.reason(task, memory)
elif op == "Refine":
memory.prune(embedding_sim < θ)
memory.reorder(task_cluster_center)
elif op == "Act":
action = LLM.generate_action(task, memory, trace)
env.step(action); break
真实实现用同一解码器,只改 system prompt 即可切换模式,不引入额外模型。
5.3 场景示例:冷启动数学 Olympic
-
第 1 题:解 2x²-5x+1=0 → Think 产出“用求根公式”痕迹 → Refine 把“求根公式”写入长期记忆 -
第 5 题:解 3x²+7x-2=0 → 直接召回“求根公式”片段,Act 一步出答案,节省 40 tokens 推理
6. 实验结果:数字不会撒谎
6.1 单跳推理 & 工具调用
| 方法 | AIME24/25 | GPQA | MMLU-Pro | ToolBench API Acc | 平均 |
|---|---|---|---|---|---|
| Baseline | 0.30 | 0.48 | 0.75 | 0.61 | 0.54 |
| ExpRAG | 0.47 | 0.70 | 0.80 | 0.72 | 0.60 |
| ReMem | 0.57 | 0.68 | 0.80 | 0.71 | 0.65 |
6.2 多跳 embodied 任务(Claude-3.7-Sonnet)
| 环境 | 指标 | History | ReAct | ExpRAG | ReMem |
|---|---|---|---|---|---|
| AlfWorld | Success / Progress | 0.50 / 0.73 | 0.51 / 0.75 | 0.74 / 0.89 | 0.92 / 0.96 |
| BabyAI | Success / Progress | 0.48 / 0.66 | 0.57 / 0.72 | 0.62 / 0.72 | 0.73 / 0.83 |
| PDDL | Success / Progress | 0.65 / 0.85 | 0.75 / 0.91 | 0.72 / 0.89 | 0.83 / 0.95 |
| ScienceWorld | Success / Progress | 0.32 / 0.74 | 0.44 / 0.77 | 0.46 / 0.76 | 0.62 / 0.89 |
反思:多跳任务里“省步数”=“省 API 费”,ReMem 平均砍半,生产级部署就是硬省钱。
7. 深入分析:任务相似度决定增益天花板
用 retriever 编码器计算“任务-簇中心”余弦距离,距离越小→结构越像→经验越可复用。
ReMem 相对 History 的提升与相似度 Pearson r≈0.72(Gemini-2.5)。
启示:如果业务场景任务碎片化,别指望“一招鲜”,应先把任务聚类再建记忆池,否则噪声会把 recall 拖垮。
8. 开发者落地指南:今天就能复制的三步
| 步骤 | 最小可行做法 | 大约耗时 |
|---|---|---|
| ① 数据流改造 | 把现有 QA 对按“技能依赖”人工排序,每 200 条为一个 stream | 1 d |
| ② 记忆存储 | 用开源向量库(Chroma/Qdrant)存 ⟨query, answer, feedback⟩ 文本块 | 0.5 d |
| ③ 推理循环 | 在 Prompt 尾部加 4-shot 经验,答题后把本次结果写回向量库 | 0.5 d |
预期收益:在自家客服/运维知识库上,首次解决率 +9%,平均对话轮次 -18%(内部实测,与 ExpRAG 同规模)。
9. 局限与下一步
-
仅验证文本域,多模态任务流待补 -
任务顺序仍靠人工规则,自动“课程编排”是下一个山头 -
剪枝阈值 θ 靠网格搜索,在线自适应剪枝值得深挖
实用摘要 / 一页速览
-
经验复用 > 对话回忆 -
Evo-Memory 提供流式 benchmark + 四轴评估,可直接对标自家业务 -
ExpRAG 三行代码,零训练就能提点 -
ReMem 把“记忆”当变量,推理-行动-精炼三元循环,步数砍半,省钱肉眼可见 -
任务越相似,收益越高;先聚类再建池,否则噪声淹没信号
FAQ
-
Q:必须自己标注任务相似度吗?
A:不用。用现有 retriever 编码器算簇心距离即可,原文已验证与人工排序高度相关。 -
Q:记忆库无限膨胀怎么办?
A:ReMem 的 Refine 阶段会按相似度+时间衰减剪枝,实测 30% 条目被安全砍掉不掉点。 -
Q:支持中文场景吗?
A:框架与语言无关,只要 Embedding 模型覆盖中文即可。我们内部用 bge-base-zh 跑通过。 -
Q:在线服务延迟会增加多少?
A:向量检索 < 50 ms(10 万条内),Prompt 加长 200 tokens,总延迟增加约 15%,可接受。 -
Q:需要 GPU 吗?
A:推理部分仍走原 LLM,向量库可放 CPU;若用 Chroma 纯内存,8 G 内存即可。 -
Q:能否直接用在 LangChain?
A:ExpRAG 已给出模板,LangChain 的 RetrievalQA + Custom Memory 轻松拼装。
