📖 项目讲解 — Agentic RL × 记忆检索

这个项目在做什么

训练一个会自己决定「什么时候检索记忆、什么时候克制」的 Agent。 用强化学习(多步 TRACE)优化"是否检索"这个决策,而不是靠固定阈值门控。

业务背景:从一个真实痛点开始

LLM 的记忆困境

大模型没有"经历"。企业里真正值钱的知识——团队踩过的坑、技术选型背后的原因、 系统演进的来龙去脉——都躺在私有记忆库里。A-MEM 把记忆的读写做成了基础能力, 但关键不是"有没有记忆库",而是"什么时候该用它"

检索不是免费的:每次调用有成本与延迟;而向量相似度检索在跨域时并不可靠 (中文 SBERT 对无关文本的相似度也能到 0.5~0.7),无脑检索会把金融/医疗等 干扰记忆灌进答案,反而拉低质量。所以"要不要检索"本身就必须被聪明地决定。

业务主体:某互联网公司的数据平台部(2024)

这个 Agent 是数据平台部的私有知识问答助手(内部 Portal 上的问答 Copilot), 背后挂着 A-MEM 记忆库——沉淀的是部门 2024 全年的工程记忆: 数据血缘(Apache Atlas)、慢查询优化(p99 145ms / 88ms)、等保二级渗透测试电商中台回退单体又重构推荐冷启动与排序模型数据治理下架 2100 张表……

谁在用:数据工程师、算法工程师、安全工程师、中台架构师、平台负责人。

业务价值:新同学 / 跨组同学问部门私有事实能直接答对(省去翻 wiki / 问人);平台汇报与决策有数据依据;该克制时克制,省 LLM 调用成本。

业务风险:A 类漏检 → 私有事实答不出、误导决策;B 类误检 → 金融 / 医疗 / 旅游干扰记忆污染答案,还白花检索成本。

两类查询:该检索 vs 该克制

评测按这两类判定设计:A 类测"该检索时能不能检索到",B 类测"该克制时能不能不检" (30 条训练评测 A+B 各半;独立评测集 50 条为 B 类泛化验证)。

一个典型问答长什么样(3 动作业务走查)

用户在 Portal 提问 策略决策:检索 / 遗忘 / 作答 逐条核对候选记忆(不对的 forget 掉) 保留正确记忆作答

这个"什么时候该动记忆、动错了怎么收回来"的多步决策,就是本 Agent 学的核心能力—— 也是它和"无脑 RAG"最本质的区别。

谁在用:角色 × 场景(数据平台部 2024)

角色什么时候问典型问题得到
数据工程师搭跨源血缘 / 答新同学 / 写周报血缘二期覆盖哪些数据源?覆盖率多少?MySQL+PostgreSQL+Hive,87%
平台负责人季度汇报 / 经营决策数据治理下架了多少张表?每月省多少?2100 张闲置表,月省 12 万
中台架构师新项目选型 / 技术评审中台二期最终技术栈?一期为何回退单体?FastAPI+Vue3+PostgreSQL+RabbitMQ;7 人驾驭不了微服务
安全工程师合规文档 / 安全审计等保二级覆盖哪几类控制域?5 大类 58 项控制点
算法工程师增长方案评估 / 模型迭代邀请有礼获客成本与 ROI?28 元/人 vs 广告 85,ROI 3.04

业务价值与复用

一个会"审时度势 + 自我纠错"的记忆 Agent:该检索时检索(答对私有问题)、该克制时克制 (不被干扰污染、省成本)、检索错了能自己收回来(forget 清场)。没有它:私有问题要么翻 wiki 搜半天、 要么打断资深同事问;有它:秒答 + 附上记忆里的硬数字 (治理下架 2100 张表月省 12 万、p99 980→145ms、CTR 3.2%→7.8%),平台汇报和决策 就有了数据依据。四本价值账:

诚实注:30 条记忆的 toy 环境,金额 / 效率为方向性示意,不是精确 ROI;但收益机制是真实的—— 检索决策的正确性乘在每一次问答上。该决策底座按项目规划复用给 AI 面试官 Agent (评估候选人回答、选下一题 / 追问 / 结束面试)——同一个"何时动记忆 / 该不该追问"的决策能力。

为什么用强化学习

规则门控是单步阈值:相似度低就检索——方向一错就是 A 全 skip / B 全检索(见下方擂台)。 训练采用 SFT → TRACE RL 两阶段SFT 行为克隆先学会主要判别: 训练查询上已达 A 命中 100% / B 误检 0% / avg_R 9.15,与 RL 完全相同;RL 在未见查询上做小幅修正。 消融(data/ablation_sft_vs_rl.json,2026-08-13,2 动作基线):50 条未见概念题上 SFT-only 检索率 12%、 RL 8%(McNemar p=0.50,不显著),且 RL 检索的 4 条 ⊆ SFT 的 6 条。诚实结论:判别大部分来自 SFT + 域分离特征,RL 在本环境只提供小幅且统计上不显著的泛化增益——λ-return 的长程信用分配 需要更长轨迹 / 更大记忆池才有发挥空间(3 动作扩展已把轨迹拉长到 4~10 步,见下方"3 动作 MDP"小节)。

数据来源:手写训练数据 + 真实 HF 独立评测集

训练数据全部手工编写(无合成 pipeline);评测数据除训练集外, 另用 HuggingFace 真实问答构建独立评测集(训练时完全未见过)。

数据位置规模用途
场景数据集data/amem_rl_dataset.json 8 个场景 / 31 条记忆 A-MEM 场景溯源(golden_answer / 最优动作 / 必需记忆)
规范记忆池src/envs/real_mem_env.py 30 条记忆 + 30 条查询 RL 训练与评测共用的环境数据
GLM 测试集scripts/compare_direct.py 30 条(15 A + 15 B) 端到端答案质量三方对比
独立 B 类评测集data/testset_b_real.json 50 条概念题 泛化验证:训练未见过、换知识子域的 C 语言概念问答(中文 StackOverflow,经 hf-mirror 下载)

规范记忆池构成(真正喂给 RL 的数据)

类别数量示例
正确记忆(A 类私有事实)15 条 血缘基于 Apache Atlas · p99 从 980ms→145ms · 等保二级 5 大类 58 项控制点 · DeepFM 替换 Wide&Deep · 裂变获客 ROI 3.04
干扰记忆(跨域无关)15 条 冠心病 · 番茄炒蛋 · 浅草寺 · 国债 · 抑郁症…(金融 / 医疗 / 旅游 / 教育)
A 类查询15 条 「数据血缘追溯系统依赖哪个开源工具实现?」(按 low / mid / high 词汇重叠度分档)
B 类查询15 条 「什么是 CAP 定理?」「TCP 和 UDP 的核心区别是什么?」(纯世界知识)

记忆的业务归属(业务线 / 负责组 / 时间)

规范数据文件:data/business_context.json。15 条私有记忆全部有业务归属:

业务线负责组记忆(示例)
数据工程数据血缘组 / 数据治理组 / 数据库组血缘 Atlas 二期 · 治理下架 2100 张表 · MySQL 慢查询 p99 88ms · 质量评分 61→79
算法推荐推荐组 / 增长组冷启动 CTR 3.2%→7.8% · DeepFM 替换 Wide&Deep · 邀请有礼裂变 ROI 3.04 · Q2 OKR
安全合规合规组 / 安全组等保二级(8 月)· 渗透测试(高危 3 + 中危 12)
中台架构中台组一期 Spring Cloud 回退单体 · 二期重构完成(FastAPI+Vue3+PG+RabbitMQ)· 单体拆分四大领域
工程效能性能组 / 质量组接口 p99 980→145ms · 自动化覆盖率 45%→89%

2024 时间线(记忆中的可验证锚点)

干扰记忆故意跨域(金融 / 医疗 / 旅游 / 教育),B 类检索采用域分离: 候选池只含干扰记忆,保证"检索必拿跨域无关内容"的奖励语义成立。embedding 用 多语言模型(paraphrase-multilingual-MiniLM-L12-v2,384 维)——all-MiniLM-L6-v2 是英文模型,对中文相似度虚高不可靠(A 类统一池 top-1 命中仅 5/15,真实检索拿不到 正确记忆),换多语言模型后 A 类命中 15/15,"评测用真实检索 top-1 决策"才成立。

诚实局限:训练查询与评测查询同源(同出自这 30 条)。2026-08-12 已建独立评测集data/testset_b_real.json,50 条训练未见过、换知识子域的 C 语言概念问答):TRACE 检索率 8%(4/50)、 分数 ≈NoRet 基线(Δ=-0.02,p=0.564)——B 类克制泛化已验证;A 类无真正独立的测试集 (依赖部门私有记忆,无法从 HF 获取),用决策级探针补了同域换问法证据(15/15 全检索), 但答案质量级泛化仍未独立验证。

data/ 下其余文件均为产物而非输入training_runs.json(2 动作训练日志)、 arena_results.json(2 动作评测结果)、trace_policy_real_emb.pt(2 动作策略); 3 动作扩展的对应产物为 training_runs_3act.jsonablation_3act.jsontrace_3act_*.jsontrace_policy_3act*.pt

为什么需要"学会检索"

Agent 背后挂着一个 A-MEM 私有记忆库时,同一个"要不要检索"的问题,答案因查询而异:

查询类型示例应该原因
A 类 · 私有事实 「数据血缘追溯系统依赖哪个开源组件?」 必须检索 答案只在公司私有记忆里,LLM 凭通用知识答不出
B 类 · 世界知识 「什么是 CAP 定理?」 应该克制 检索反而拿到金融/医疗等干扰记忆,污染答案

单步阈值在分布层面确实可分:多语言模型 + 域分离后 A 类命中相似度 ≥ 0.464、 B 类干扰 ≤ 0.295,不重叠;独立评测集 50 条经同款校验:干扰池 top-1 相似度 0.108~0.302(mean 0.209), 与训练 B 类同分布。但固定阈值规则必须选对方向:AEE_RG 基线用「相似度低就检索」 (quality < 0.40 就检索),方向恰好相反——A 类命中 ≥ 0.464 被判 skip、B 类干扰 ≤ 0.295 反被检索, 实测 A 全 skip / B 全检索(见下方擂台)。且真实决策是多步顺序的:correct_mem 位置随机、 每步检索扣成本、要判断"检索到命中为止"。这超出单步阈值能表达的范围,需要 RL 奖励信号教策略权衡。

核心方法:一个 2 动作决策策略

把"要不要检索"建模成 1 个分类决策,交给一个 3 层 MLP 策略网络:

state = query embedding(384 维) + [下一候选质量, 命中标志]386 维
action = 0=retrieve 检索 1=skip 克制

两阶段训练:SFT → 多步 TRACE RL

Phase 1 · SFT 行为克隆

专家轨迹做监督预热,给 RL 一个可泛化起点:

Phase 2 · TRACE 式多步 RL(长程信用分配)

每 episode 策略逐轮决策,直到克制或候选队列耗尽:

决策 retrieve 注入下一条候选记忆(扣成本 0.5) 再决策… skip / 队列耗尽 → 终局多档奖励
场景终局奖励
A 检索命中必需记忆+10(再扣检索成本)
A 一次都没检索−3.5 漏检
B 克制不检索+10
B 检索到干扰记忆−8.5 错误类别

关键在 λ-return:终局奖励是稀疏的,lambda_returns() 把它沿轨迹 反向传播成每步不同的 advantage —— 离终点越近的步骤拿越多信用。 这正是"长程信用分配":归因到底是哪一步检索 / 哪一步克制带来了终局成功, 不需要训练价值网络(critic-free),也不用人工标注过程标签。

扩展:3 动作 MDP(retrieve → forget → answer)

2 动作只回答"检不检";A 类最长轨迹 6 步,λ-return 在 ≤5 步轨迹上退化为近似 MC。 扩展为 3 动作后,A 类干净最优轨迹变成 4~10 步(平均 7.3 vs 2 动作 4.4), 给 λ-return 真正的信用分配空间:

state = query embedding(384 维)+ [下一候选质量, 上一步质量, 命中标志, 残留数]388 维
action = 0=retrieve 检索 1=forget 遗忘(LIFO 弹出栈顶) 2=answer 作答

新增的 上一步质量 last_q 是判别关键:A 类命中 correct 相似度 ≥0.464、干扰 ≤0.271, 策略凭它判断"刚拿到的是干扰还是正确答案 → 要不要 forget"。终局多两档: 污染(命中但残留干扰)+7,干净(恰 = 正确记忆)才 +10 → forget 真正必要; 忘对(曾命中却把 correct forget 掉)−8.5 最严重。

版本A 类(15 题,10 分制)B 类(15 题)
NoRet 不检索7.208.00
AEE_RG 固定门控7.27(检索率 0%)8.00(检索率 100%)
TRACE_3act7.53(检索 100%、干净 100%) 8.13(检索 0%)

决策级(data/ablation_3act.json):A 命中 15/15、清洁 15/15、平均步数 7.33 vs 2 动作 4.4; 独立 50 条 B 测试集 3act 检索率 6%、干净作答 50/50(检索到的 3 条也被 forget 清理——误检索恢复)。 作答级(data/trace_3act_testsetb.json):TRACE_3act 8.00 = NoRet 8.00(Δ=0.00)、 而 AEE_RG 7.92(检索率 100%,Δ=−0.08)——固定阈值在未见 B 上反而有害。GLM 作答级方向全部正确 (A 检索 + 干净、B 克制),arena 增益 +0.13~+0.33 分未达显著 —— 与 2 动作同一条 诚实结论:RL≈SFT,3 动作的交付物是更长异构链锻炼 λ-return + forget 机制, 而非 RL 超越 SFT。oracle 上界核对(scripts/oracle_3act.py,零 GLM 成本):RL 与 SFT 在扩池 envs 上都 精确触达理论最优 avg_R 8.506、总 headroom=0、165/165 env 触及 oracle(30 池亦 30/30)—— RL≈SFT 不是 RL 失败,而是任务已被 SFT 行为克隆解到理论最优,无奖励余量可挖

端到端数据流

查询 query 决策策略(检索 / 克制) 注入记忆 / 空上下文 GLM-4-Flash 作答 四维 rubric 评分 多档 reward

训练阶段用语义规则判定奖励(零 GLM 成本);评测阶段才真实调用 GLM-4-Flash 对比 NoRet / 固定门控 AEE_RG / TRACE 策略三方的答案质量。

当前成果

100%
A 类命中率(私有事实必须检索到)
0%
B 类误检索(世界知识应克制)
+9.15
多步贪心平均 reward / 10(2 动作基线)
3.67
A 类平均检索步数 · 命中即停 = 最优(2 动作基线)

注:以上 4 项均指2 动作基线,SFT-only 上同样达到(消融 2026-08-13,data/ablation_sft_vs_rl.json); RL 的差异在未见查询的泛化上(检索率 12%→8%,McNemar p=0.50 不显著)。 3 动作扩展的数字另见下方"3 动作 MDP"小节(A 命中 15/15、清洁 15/15、平均步数 7.33、avg_R 8.817)。

TRACE 策略 vs 基线data/arena_results.json,四维 rubric 平均分,2 动作基线):

版本平均分说明
NoRet 不检索7.67纯靠 LLM 通用知识
AEE_RG 固定门控 (0.40)7.73A 全 skip / B 全检索——固定阈值把方向搞反了
TRACE 策略7.90A 检索 100% / B 误检 0%——该检索时检索、该克制时克制

3 动作扩展的 GLM 作答级评测见 data/trace_3act_direct.json(arena 30 条)与 data/trace_3act_testsetb.json(独立 50 条 B 测试集),结论与 2 动作一致:RL≈SFT。

局限与下一步

风险评估(诚实清单)

风险等级现状 / 缓解
A 类检索泛化(部分验证) 决策级探针(scripts/probe_a_generalization.py):15 条未见过的私有域新问法全判检索(15/15,0 漏检); 仍是决策级证据(同域换问法,非跨域独立测试集),未含 GLM 作答质量验证
训练 reward 是代理(hit_fraction →"能答对") 实测缓解:A 类 15/15 检索正确记忆后 GLM 判分均 ≥7,0 例代理失效(检索了正确记忆仍判分<6); 但代理是二进制(hit_fraction>0)、样本仅 15 条,检索到"相关但误导"记忆的负向失效未覆盖
训练 / 评测检索语义不一致 实测分布重叠:训练 A 队列 correct 位置 quality(0.464~0.876)与评测 A top-1(0.464~0.876)完全重叠, 评测 A 决策状态=训练里"下一候选即正确记忆"的那一步,转移成立;B 类干扰簇(~0.05~0.22)与评测 B (0.108~0.302)同量级,克制成立。残余边界:B 类查询若干扰池 top-1 意外冲高(医疗/金融类)可能误检,50 条测试集 max=0.302 未触界
记忆池规模小(原 30 条手写)中(已扩池) 已用 GLM 合成扩到 ~200 条并重训(§8.8,pool_expanded.json):扩池训练查询 100% 判别、 legacy30 旧策略跨池仍 114/115,判别技能跨池迁移;但 RL≈SFT 结论未翻转(第三次证实)
单一 embedding 模型过拟合 换 embedding 模型 quality/hit_flag 分布全变,策略大概率失效;换模型需三端同步
judge 噪声(GLM 打分方差) 温度 0.1 已压低,但 50 条小差异可能淹没在打分噪声里,削弱 Wilcoxon 显著性
reward hacking(零 RM 语义奖励) ActionGuard 挡已知循环,但策略可能找到 Guard 之外的"伪进展"漏洞
安全 / 隐私(私有问答部署) 密钥 gitignore + serve 白名单;真实部署中 A 漏检误导决策、B 误检污染答案有业务后果
前端数字与代码过时 约定"不重训";一旦重训或改环境,arena/dashboard 数字需同步刷新

三条结构性风险已全部用评测/探针证据缓解至"中"(A 类探针 15/15、B 类克制 92%、 reward 代理 0 失效、训练/评测 quality 分布重叠);均为小样本证据,放大样本仍是下一步。后六条属工程可缓解。 独立 B 类评测集已实测(2026-08-12):50 条未见过的概念题上 NoRet 8.02 / TRACE 8.00(检索率 8%, Δ=-0.02,p=0.564)/ AEE 7.94(固定阈值 100% 检索,Δ=-0.08)——证明"换知识子域后策略会克制", 但不等于"业务端到端可用",请勿把两者混为一谈。

与真实 Agent RL 的四大约束对比

真实 Agent RL 有四个公认痛点:轨迹长(10^5~10^6 tokens)、环境随机、动作异质(点击/API)、 中间状态难验证。本项目把四点全部简化,才让 λ-return 干净展开、训练稳定收敛—— 它验证了 TRACE 机制,但迁移到真实长轨迹 Agent 时还要逐一攻破。

约束真实 Agent RL本项目(2 动作基线)
轨迹长度10^5~10^6 tokens≤5 步决策(极致简化);3 动作扩展已拉长到 4~10 步
环境随机高(结果不确定)候选队列确定性(已消除)
动作异质点击 / API / 文本混合二元同质 {retrieve, skip};3 动作扩展引入 {retrieve, forget, answer} 异构链
中间状态难以验证(无过程奖励)人造"命中标志"提供可验证信号(规避)
Agentic RL · A-MEM 记忆检索决策 · SFT → 多步 TRACE RL · 2 动作数据见 data/training_runs.jsondata/arena_results.json,3 动作扩展见 data/ablation_3act.jsondata/trace_3act_*.json
京ICP备2024087118号-1
🎁 大厂面试真题精选 免费领 · 私信「资料」30 秒到手 去小红书领免费资料 →
×