训练一个会自己决定「什么时候检索记忆、什么时候克制」的 Agent。 用强化学习(多步 TRACE)优化"是否检索"这个决策,而不是靠固定阈值门控。
大模型没有"经历"。企业里真正值钱的知识——团队踩过的坑、技术选型背后的原因、 系统演进的来龙去脉——都躺在私有记忆库里。A-MEM 把记忆的读写做成了基础能力, 但关键不是"有没有记忆库",而是"什么时候该用它"。
检索不是免费的:每次调用有成本与延迟;而向量相似度检索在跨域时并不可靠 (中文 SBERT 对无关文本的相似度也能到 0.5~0.7),无脑检索会把金融/医疗等 干扰记忆灌进答案,反而拉低质量。所以"要不要检索"本身就必须被聪明地决定。
这个 Agent 是数据平台部的私有知识问答助手(内部 Portal 上的问答 Copilot), 背后挂着 A-MEM 记忆库——沉淀的是部门 2024 全年的工程记忆: 数据血缘(Apache Atlas)、慢查询优化(p99 145ms / 88ms)、等保二级、 渗透测试、电商中台回退单体又重构、推荐冷启动与排序模型、 数据治理下架 2100 张表……
谁在用:数据工程师、算法工程师、安全工程师、中台架构师、平台负责人。
业务价值:新同学 / 跨组同学问部门私有事实能直接答对(省去翻 wiki / 问人);平台汇报与决策有数据依据;该克制时克制,省 LLM 调用成本。
业务风险:A 类漏检 → 私有事实答不出、误导决策;B 类误检 → 金融 / 医疗 / 旅游干扰记忆污染答案,还白花检索成本。
评测按这两类判定设计:A 类测"该检索时能不能检索到",B 类测"该克制时能不能不检" (30 条训练评测 A+B 各半;独立评测集 50 条为 B 类泛化验证)。
这个"什么时候该动记忆、动错了怎么收回来"的多步决策,就是本 Agent 学的核心能力—— 也是它和"无脑 RAG"最本质的区别。
| 角色 | 什么时候问 | 典型问题 | 得到 |
|---|---|---|---|
| 数据工程师 | 搭跨源血缘 / 答新同学 / 写周报 | 血缘二期覆盖哪些数据源?覆盖率多少? | 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"小节)。
训练数据全部手工编写(无合成 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 下载) |
| 类别 | 数量 | 示例 |
|---|---|---|
| 正确记忆(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% |
干扰记忆故意跨域(金融 / 医疗 / 旅游 / 教育),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.json、ablation_3act.json、trace_3act_*.json、
trace_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 奖励信号教策略权衡。
把"要不要检索"建模成 1 个分类决策,交给一个 3 层 MLP 策略网络:
state = query embedding(384 维) + [下一候选质量, 命中标志] → 386 维
action = 0=retrieve 检索 1=skip 克制
用专家轨迹做监督预热,给 RL 一个可泛化起点:
每 episode 策略逐轮决策,直到克制或候选队列耗尽:
| 场景 | 终局奖励 |
|---|---|
| A 检索命中必需记忆 | +10(再扣检索成本) |
| A 一次都没检索 | −3.5 漏检 |
| B 克制不检索 | +10 |
| B 检索到干扰记忆 | −8.5 错误类别 |
关键在 λ-return:终局奖励是稀疏的,lambda_returns() 把它沿轨迹
反向传播成每步不同的 advantage —— 离终点越近的步骤拿越多信用。
这正是"长程信用分配":归因到底是哪一步检索 / 哪一步克制带来了终局成功,
不需要训练价值网络(critic-free),也不用人工标注过程标签。
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.20 | 8.00 |
| AEE_RG 固定门控 | 7.27(检索率 0%) | 8.00(检索率 100%) |
| TRACE_3act | 7.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 行为克隆解到理论最优,无奖励余量可挖。
训练阶段用语义规则判定奖励(零 GLM 成本);评测阶段才真实调用 GLM-4-Flash 对比 NoRet / 固定门控 AEE_RG / TRACE 策略三方的答案质量。
注:以上 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.73 | A 全 skip / B 全检索——固定阈值把方向搞反了 |
| TRACE 策略 | 7.90 | A 检索 100% / B 误检 0%——该检索时检索、该克制时克制 |
3 动作扩展的 GLM 作答级评测见 data/trace_3act_direct.json(arena 30 条)与
data/trace_3act_testsetb.json(独立 50 条 B 测试集),结论与 2 动作一致:RL≈SFT。
data/ablation_sft_vs_rl.json)synthesize_pool.py 用 GLM-4-Flash 把池扩到
~200 条(115 correct + 30 同域混淆干扰 + 45 跨域干扰 + 115 A 查询 + 50 B 查询,data/pool_expanded.json),
A 类队列换成逐查询最混淆的同域干扰(gap 0.05~0.25,检索真正需要判别);决策级消融(ablation_pool.json)
显示 RL≈SFT 第三次证实——RL 与 SFT 在全部训练查询上决策完全一致,仅未见查询上 RL 更克制
(检索 6% vs 10%,n=50 不显著)。更大池 + 更难检索没有翻转 RL≈SFT;
oracle 上界核对(oracle_3act.py)给出更强的收束证据:RL 与 SFT 都精确触达 oracle avg_R 8.506、
总 headroom=0、165/165 env 触及——任务被 SFT 解到理论最优(§8.8),RL 无余量可挖| 风险 | 等级 | 现状 / 缓解 |
|---|---|---|
| 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 有四个公认痛点:轨迹长(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} 异构链 |
| 中间状态 | 难以验证(无过程奖励) | 人造"命中标志"提供可验证信号(规避) |
data/training_runs.json 与 data/arena_results.json,3 动作扩展见 data/ablation_3act.json 与 data/trace_3act_*.json