[Agent Memory / 强化学习] MemPO源网学习笔记 — (3)— リリース思路 – 罗西的性感
0x00の概要
高度な学習に基づく既存の記憶管理手法には、記憶内容を更新して最適化する効果的な仕組みが欠けていることが多く、記憶内容の品質を保証することが困難です。
MemPO(Personal Memory Policy Optimization) 使用品はメモリ電子効果を使用しますが、以下に携帯情報をダウンロードできる MemPO
MemPO のユニークな分点:モデルに記憶を持たせ、毎日それを書き込ませます。
MemPOの情報は以下の通りです。
このセクションでは、いくつかのロールアウト設計を検討します。
リリース 0x01 ダウンロード コンテンツ
1.1 タイムライン
MemPO のタイムラインは次のとおりです。ロールアウトの段階がわかります。
![[Agent Memory / 强化学习] MemPO源网学习笔记 — (3)— リリース思路 – 罗西的性感 [Agent Memory / 强化学习] MemPO源网学习笔记 — (3)— リリース思路 – 罗西的性感](https://img2024.cnblogs.com/blog/1850883/202609/1850883-20260906192339457-92611372.png)
1.2 リリース
段階的な発売
Launch = 電影院迹 + 電影性感の電影、すなわち AgentLoopManager.generate_sequences() 本体部分の機能:
纯 Rollout 阶段(生成 token + 工具交互):
B6 AgentLoopManager.generate_sequences ← 调度器,启动16条并发
A4 _handle_generating_state ← 每轮生成后收集 位置和内容
C3 ToolParser.parse ← 解析 / 标签
C4 AsearcherSearchTool.execute ← 调用 RAG 检索
B5 RewardManagerWorker.compute_score ← 轨迹完成后异步触发(与rollout并行)
└→ B1 NaiveRewardManager.__call__ ← 解码+调用评分
└→ B2 compute_score ← 主评分入口
├→ C2 extract_solution ← 提取
├→ B3 validate_format ← 格式校验
└→ B4 em_check ← 精确匹配
後電影を起動(まだ上明電影内にありますが、すべてのトラックはすでに完了しています):
A1 _postprocess ← 额外前向,计算 P_mem-P_full
不安全な打ち上げステージ
MemPO 一部コンテンツが混在しております。例: ans_mask と Threshold は起動ステージに属し、AgentLoopSequences.(generate_sequencesManager.) 関数で、延長時間の実行完了後に 16 条すべてが起動されます。
しかし、実際には、ans_mask と Threshold は「純粋なリリース」段階 (トークン生成) ではなく、「純粋な報酬」段階 (B 纯em_check) でもなく、起動完了後のメモリ報酬計算段階 (A1) にあります。つまり、まだ内部関数の起動中です。
B4-algo compute_grpo_outcome_advantage ← PPO 更新前的 advantage 归一化
A2 compute_grpo_memory_advantage ← PPO 更新前的 advantage 归一化
A3 compute_advantage ← 叠加
A5 AgentMemory.prepare_prompt ← 评估专用,训练不调用
したがって,我们本篇不路会介绍纯リリース段階では、ans_mask とこれらのしきい値も導入します「跨〆」は介,我们本篇不路会介绍纯
1.3 バッチ計算
アドバンテージはロット内のトラックごとに計算されます。
重要な点:归一化は、完全な全動的な問題ではなく、電気効果のある音声文字です。 ✅
一个 batch(假设3个question × 16条轨迹/question = 48条):
Question Q1: traj_1, traj_2, ..., traj_16
Question Q2: traj_17, traj_18, ..., traj_32
Question Q3: traj_33, traj_34, ..., traj_48
Outcome Advantage:
Q1 组:scores = [1,0,1,1,0,...] → mean=0.6, std=0.5
adv_1 = (1-0.6)/0.5 = +0.8
adv_2 = (0-0.6)/0.5 = -1.2
...
Q2 组:独立计算 mean/std
Q3 组:独立计算 mean/std
→ outcome_adv [48, seq_len] 每条轨迹一个值,广播到其所有token
Memory Advantage:
Q1 组:所有16条轨迹的所有轮次 mem_reward 池化(~48个值)
→ 统一 mean/std
→ 每条轨迹的每轮 区间各自赋值
→ mem_adv [48, seq_len] 每条轨迹的 区间各有不同值
最终:
final_adv [48, seq_len] = outcome_adv + mem_adv
→ 每条轨迹、每个 token 位置都有一个确定的 advantage 值
→ 全部送入 PPO loss 一起更新
1.4 転送
在前向電影(分前向電影の電影時間)MemPO に加えて、MemPO も前向電话前向山电影海流)の前にもう 1 回あります、教師在前向电影(得点前余分。教師採点の电影全名电影的ストーリー情主讲述了:
- この compute_log_prob 呼び出しは切り離されています (無電影 P PO の逆方向呼び出し)。アドバンテージに入る常数係数として、mem_reward 値を計算するためにのみ使用されます。
- 二是:对「すでに好用回答案が生成されています」確率を再計算する前の余分なパス、より多くの電気、P_memおよびP_fullの计の讇ではなく「完全な余裕」、である「指定されたテキストの確率を計算する」
- 推理(推論) = 自表自己这これら新トークン(自自電子数字)
- 前向電影(Forward Pass) = 与えられたテキストを与えて、各トークンの確率を計算します。
実際の練習
compute_log_prob は、A1 で 2N 個のストリング入力を同時に処理する 1 回の調整を介して行われますが、実質的には 2 回の独立した前方向ではなく、1 回の前方向の転送割り当てです。
- マージスキーム(実際の使用法):1次前方向、バッチ=2N→高GPU使用率
- 拆分電影(没である):2 回前方向、各バッチ = N→二十安全弆、そしてこの日は KVcache を使用
A1 の実践は次のとおりです。
1. トレーニング開始段階: モデルはすでにトラックを生成しています (
2. 2 種類の「入力コンテキスト」を用意します。
- full_traj(完全なトラック): システム プロンプト + 元の質問 + 第 1 轮轮 + 検索結果 + 第 2 轮ダウンロード + 搜瞴 + 结???第 T 轮会记
- mem_traj(ニーモニックコンテキストのみ): システムテレチャージ+
第T轮のメモリ内容
3.「正視答案Z」を時間内に取得し、モデルに確率を計算させます。
P_full = P(Z| full_traj)
P_mem = P(Z| mem_traj)
次のように
# 把full_traj 和 mem_traj拼成一个大 batch
traj_input.input_ids = pad([
full_1, full_2, ..., full_N, ← N条完整上下文
mem_1,mem_2,..., mem_N, ← N条仅含摘要
J)
#answer 重复两遍
traj_input.responses =[ans_1,...,ans_N, ans_1,...,ans_N]
#一次前向传播(batch size=2N),同时算两种上下文的 logp
log_probs = model.compute_log_prob(traj_input)
#拆分结果
full_logp = log_probs[:N] # ←前半:完整上下文→答案的 log 概率
mem_logp = log_probs[N:2N] # ←后半:mem 摘要→答案的 log 概率
# 关键:这是一次batch前向传播,GPU同时处理2N条序列。之所以这样做而不是分两次调用:
図
生成されたトラックを起動(已安全):
Q -> [mem1][think][search] ──► 结果 ──► [mem2][think][answer Z]
MemPO 使用天事 (不电影新内容、只算確率):
状況 A: 正視電影、回答 Z の確率はどのくらいですか?
┌───────────────────────────┐ ┌─┐
│Q + 完整对话历史 (full_traj) │ ──►│Z│ P_full = 0.72
└───────────────────────────┘ └─┘
状況B:のみ
┌────────────────────────────────┐ ┌─┐
│sys_prompt + 记忆内容 │──► │Z│ P_mem=0.68
└────────────────────────────────┘ └─┘
mem_reward = P_mem – P_full = 0.68 – 0.72 = -0.04
1.5 トラックの起動
Release は 1 種類のトラックのみを生成します。one-one-one の完全な多轮ダイアログ track.ful l_traj と mem_traj がこのトラックから抽出/構築されます。
本番イベントの打ち上げステージ:
B6:同一个 question 发给 SGLang 16次
→ 16条独立的并发轨迹(每条走状态机GENERATING>TOOL_CALLING>...)
→ 因为LLM采样有随机性(temperature),16条轨迹内容各不相同
单条轨迹的生成过程(多轮示例):
Round 1:LLM生成 → .:....query → 工具返回结果
Round 2:LLM生成 → ......query → 工具返回结果
Round 3:LLM生成 → :.....xxx → 结束
这就是唯一生成的"轨迹"→response_ids
A4在每轮生成后"顺便"提取:
Round 2生成后:
full_traj[0]=deepcopy(raw_input_ids) ← 当时的完整上下文快照
mem_traj[0]=mem_sys_prompt_ids + "R2摘要 " ← 手工拼接
Round 3生成后:
full_traj[1]=deepcopy(raw_input_ids) ← 更长的完整上下文
mem_traj[1]=mem_sys_prompt_ids + "R3摘要 " ← 手工拼接
主要な部門:
- 生成トラック: 1 種類のみ (16 個の完全なダイアログ トラック、LLM によって実際に生成されたトークン)
- データの抽出/構築: full_traj は画像快乐、mem_traj はストーリー情拥报の短電影
- full_traj和mem_trajはLLMを通じてではなく、既存のデータから生成されます
0x02 full_traj のビルドメソッド
2.1 エクスプレス
快乐
full_traj は完全なトラックではなく、特定のサイクルの開始前の「コンテキスト スナップショット」です。
假设一条5轮轨迹:
Round 1:[system + question] → R1 response
Round 2:[system + question + R1 + tool_result_1] → R2 response
Round 3:[system + question + R1 + tool_result_1 + R2+ tool_2] → R3 response
Round 4:[...更长] → R4 response
Round 5: [...最长] → R5 (answer)
full_traj_list收集的是(仅Round 2+且有的轮次):
full_traj[0] = [system + question + R1+ tool_result_1] → R2前的上下文
full_traj[1] = [system + question + R1 + tool_1+R2+ tool_2] → R3前的上下文
full_traj[2] = [system + question + R1 + tool_1+R2+tool_2+R3+tool_3] → R4前的上下文
↑ 每个都是当轮生成前的完整prompt(deepcopy(raw_input_ids))
↑ 不包含当轮生成的response
所何かfull_traj=”これまでの今日までの完全な対話履歴(不含当轮出力)”、答えに使用されます:「モデルがこれまでのすべての会話を見た場合、正解の確率はどの程度であるかを予測できます。」比較してください、mem_traj=”システムのみ+質問 +
比較する
実は、full_traj この名前は分かりやすく、full_traj は「フル」で「完全な最終トラック」という意味ではなく、「完全なコンテキスト」を意味します。
最终的轨迹(rollout产出的真正轨迹):
= prompt_ids + response_ids
= [system + question]+[R1 + tool_1 + R2+ tool_2+ R3 +..+ R5_answer]
← 包含所有轮次的完整对话,是PPO Update使用的数据
full_traj[k](A4收集的):
= 第k+2轮生成前的上下文快照
← 不是最终轨迹,是中间的"截面"
← 仅用于A1 Memory Reward计算
← 不用于PPO Update
最終トラックと full_traj の関係は次のとおりです。
最终轨迹(response_ids):
[R1_tokens | R2_tokens | R3_tokens | R4_tokens |.R5_tokens] ← 这是PPO训练的对象
full_traj[]:
full_traj[0]= 到R2开始前的上下文 ← 是最终轨迹的"前缀截取"
full_traj[1]= 到R3开始前的上下文 ← 更长的前缀
full_traj[2]= 到R4开始前的上下文 ← 更长的前缀
← 仅用于MemoryReward的概率对比
計算
最後のトラックが 5轮,我们不不可对对5轮全设设计,了”の場合
5 輪の一般的な状況:
┌─────────┬─────────────────────────┬────────────────────────────────────┐
│ Round 1 │ 第一轮,没有历史 │ → 不产生 → ✗ 不计算 │
│ Round 2 │ 有 │ → ☑ 计算 mem_reward_R2 │
│ Round 3 │ 有 │ → ☑ 计算 mem_reward_R3 │
│ Round 4 │ 有 │ → ☑ 计算 mem_reward_R4 │
│ Round 5 │ 最后一轮给 answer │ → 可能有也可能没有 │
│ │ │ 如果有 → ☑ 计算;如果没有 → ✗ 不计算 │
└─────────┴────────────────────────┴─────────────────────────────────────┘
プロセスは次のとおりです。
A1: 对有的3-4轮各计算mem_reward
A2:所有mem_reward跨轨迹跨轮次池化→归一化
A3:归一化后的mem_adv写入final_adv的对应...<\/mem>区间
final_adv [seq_len]:
[R1 tokens | R2 | other R2 | R3 | other R3 | ...]
[outcome_adv | outcome+adv_2 | outcome | outcome+adv_3 | outcome | ...]
↑ 写入 不写 ↑ 写入 不写
主なルール:
validate_format の设计8安全每轮都写
2.2 使用方法
すべての full_traj は A1(メモリ報酬計算) で使用されます。注: full_traj はメモリ報酬の計算にのみ使用されます。注: full_traj はメモリ報酬の計算でのみ使用され、PPO 更新では使用されません。 PPO アップデートでは、リリースされた元の response_id が使用されます。
改条ロット=3 个質問 × 16 条ダウンロード迹/質問=48 条ダウンロード迹,每条ダウンロード迹有 3 轮进
A1的输入:
concat_fu1l=48条轨迹×3轮=144个full_traj (全部拍平)
concat_mem=48条轨迹×3轮=144个mem_traj (全部拍平)
→ 拼成 2×144=288 条 → 1 次 compute_log_prob 前向
→ 得到 144 个 P_full 和 144 个 P_mem
→ 144个 mem_reward = P_mem - P_full
重组回轨迹:
轨迹1的mem_rewards = [r_R2, r_R3, r_R4]
轨迹2的mem_rewards = [r_R2, r_R3]
...
→ 全部用于A2的advantage 归一化
→ 最终影响 PPO loss 中 token 的梯度方向
A1 計算時間、各 full_traj[k]これは事出一mem_reward:
full_traj[0] + answer → P_full_R2 ─┐
mem_traj[0] + answer → P_mem_R2 ─┤→ mem_reward_R2 = P_mem_R2 - P_full_R2
full_traj[1] + answer → P_full_R3 ─┐
mem_traj[1] + answer → P_mem_R3 ─┤→ mem_reward_R3 = P_mem_R3 - P_full_R3
full_traj[2] + answer → P_full_R4 ─┐
mem_traj[2] + answer → P_mem_R4 ─┤→ mem_reward_R4 = P_mem_R4 - P_full_R4
→ mem_rewards = [mem_reward_R2, mem_reward_R3, mem_reward_R4]
→ 3 个值全部进入 A2 归一化
A2 归一化后写入 final_adv 的不同区间:
final_adv: [R1_tokens | R2 tokens | ... | R4 tokens | R5]
0 mem_adv_R2 ... mem_adv_R4 0
すべてのフルトラジ[k]1日に相当する
0x03 mem_traj の構築方法
構築プロセス(A4ステージコレクション)は次のとおりです。
假设第3轮生成了:
"之前搜索发现HurtLocker获得2010最佳影片 现在搜导演... .."
mem_traj を構築する
mem_traj_ids = mem_sys_prompt_ids + response_mem_ids
↑ ↑
system prompt + 原始question response截取到为止
具体拼接:
[system: "You are a helpful assistant."]
[user: "Who directed the 2010 Best Picture winner?"]
[assistant:"之前搜索发现HurtLocker获得2010最佳影片 "]
↑截断,后面的think/search 全丢弃
对比 full_traj:
[system + question + Round1完整对话 + Round2完整对话 + Round3开头...]
↑ 完整的多轮历史上下文(非常长)
マスクがありますか?
answer_ids = tokenize("\n...\n \n\nKathryn Bigelow\n ") ans_mask: [0,0,0,0,1,1,1,1,1,1,1,1, 0,0, 0, 0]
↑Kathryn Bigelow 的token ↑\n的4个token
含义:只关注"核心答案内容"的 log_prob,忽略/ 标签token
しきい値フィルターマスクもあります。これは、全用法开「完全没运動」のトークンを意味します。
- 一部のトークンはコンテキストと互換性がありません。
- それらをすべて除外し、モデルのみが信頼トークンを持ちます。
- したがって、P_mem-P_full の方が安定しています。
full_ans_mask = ans_mask AND (full_logp > log(0.5))
mem_ans_mask = ans_mask AND (mem_logp > log(0.5))
完全な図は次のとおりです。
mem_traj(输入):[sys_prompt| question|摘要 ] ← 无mask
full_traj(输入):·[sys_prompt|question|全部多轮历史...] ← 无mask
answer(目标):[\n...\n\n{gt}\n ]
model.compute_log_prob(input, answer): → log_prob[2N,ans_len]←每个答案token 的条件概率
过滤:ans_mask x (logp > threshold)
→ 只保留核心答案 token 中置信度高的部分
→ P = exp(mean(filtered_logp))
段階的に見てみましょう。
0x04 メモリ圧縮メカニズム
本小节電影AgentMemory・prepare_prompt() メモリ圧縮メカニズムの詳細な分析。
4.1 論理コア
def prepare_prompt(self):
# 1. 固定保留:系统提示+原始问题
prompt = [{"role": "system", "content": "You are a helpful assistant."}]
# 原始问题永不丢失
prompt.append({"role": "user", "content": self.memory[0].text}) # initial prompt
# 2. 从未尾向前扫描,找"截断点 i flag = 0
flag = 0
for i in range(-1, -len(self.memory)-1, -1):
r = self.memory[i]
if r.type == "prompt": #到头了
flag = 2
elif r.type in ["search_results", "webpage"]: # 每遇到一个工具结果+1
flag += 1
elif r.type == "llm_gen": #跳过llm生成
continue
else:
raise RuntimeError(f"Unknown record type: {r.type}")
if flag == 2: #第二个工具结果→截断
break
for j in range(i + 1, 0): # 3. 只保留截断点之后的内容
r = self.memory[j]
if r.type in ["search_results", "webpage"]: # 工具结果用摘要
prompt.append({"role": "user", "content": r.short_text})
elif r.type == "llm_gen": #llm生成用全文
prompt.append({"role": "assistant", "content": "" + r.text})
else:
raise RuntimeError(f"Unknown record type: {r.type}")
return prompt
4.2 特定のケース
4 メモリ配列の内容:
[0] prompt = "原始问题"
[1] llm_gen_1 = "记忆1 ... ... ""
[2] search_1 = "information>搜索结果1(完整,可能很长)"
[3] llm_gen_2 = "记忆2 .."
[4] search_2 = "搜索结果2(完整) "
[5] llm_gen_3 = "记忆3 .."
[6] search_3 = "搜索结果3(完整) " ◄─── short_text = 前100字
[7] llm_gen_4 = "记忆4 ..."
[8] search_4 = "搜索结果4(完整) " ◄─── short_text = 前100字
戻る 電影(電影第5轮時):
i=-1:search_4 → flag=1 (不停)
i=-2:llm_gen_4 → skip
i=-3:search_3 → flag=2 ← BREAK! 截断点 =i=-3
前方拼装間隔 (-2.0)=[-2,-1]:
memory[-2] = llm_gen_4 → assistant:"记忆4 . "
memory[-1] = search_4 → user:short_text (前100字)
LLM の最終プロンプト:
System: You are a helpful assistant.
User: 原始问题
Asst: 记忆4 ... ... <- 只有最近1轮
User: 搜索结果4 (前100字) <- short_text 压缩
Asst: <- 模型继续生成
完全視聴不可:round1、round2、round3の内容!
4.3 設計分析
これは、「カタツムリ バック シェル」タイプのメモリ圧縮設計です。
"蜗牛背壳" 式记忆压缩设计
────────────────────────────────────────────────────────
Round 1: [Q] -> [Mem1] -> [search] -> [结果1(全)] -> 生成
Round 2: [Q] + [结果1(短)] -> [Mem2]
↑ 只看到上轮结果摘要,其余全靠 Mem1
Round 3: [Q] + [结果2(短)] -> [Mem3]
↑ 同上,靠 Mem2 携带 Mem1 + round1 的信息
Round T: [Q] + [llm_gen_{T-1}] + [结果_{T-1}(短)] -> 生成
↑仅露出最近 1 轮,强制模型做 "记忆蒸馏"
その仕組みは次のとおりです。
| 機構 | 詳細 |
|---|---|
| 粉砕粒度 | 付安全電影の设设计,第2计计计下載全成断用 |
| ツールの結果 | short_text (検索結果前100字、ウェブページ前100字) |
| 生成されたモデル | 全文+前机用 |
| 元々の問題 | 永遠に抱きしめて(記憶[0],不戦断) |
| 強制効果 | 各モデルは、元の質問+上轮最术+上轮検索要約のみ見ることができます |
メモリ圧縮チェーン
次の図に示すメモリ圧縮リンク。クラス比: 各ステーションは車両に「概要カード」を 1 枚だけ搭載できます。車両には過去のものは含まれません。
これが MemPO を使用する必要がある理由です
Round1 知识 --> Mem2 --> Mem3 --> ... --> Mem_T
↑每轮记忆必须覆盖所有历史,否则信息丢失
short_text の本当の意味
2 種類の short_text
# prepare_llm_query():
short_text = job.get("short_text", job["text"])
# ↑如果没有 short_text 字段,fallback 到完整 text
公司電影:
| ツールの結果の種類 | 文章 | ショートテキスト |
|---|---|---|
| 検索結果 | 全検索結果(5篇×每篇前5000字) | =text(無し开别I!) |
| ウェブページ | 免费网站分页(每段25000字) | 前100字(実際に圧縮) |
結論:
- 検索結果:short_text は完全なコンテンツに相当、圧縮なし
- 网站内容:short_text のみ 10o 字前前字,ストーリー情下下載
截断电影の本当の意味
戦点は对”文字内容”の戦断ではなく、むしろ对”推生轮次”の战断:是以已进褼已通过4臬彮行4臬5:
memory =[
[0] prompt
[1] llm_gen_1 "round1记忆 ... ... "
[2] search_1 topk=5篇完整搜索结果
[3] llm_gen_2 "round2记忆 ..."
[4] search_2 topk=5篇完整搜索结果
[5] llm_gen_3 "round3记忆 ..."
[6] search_3 topk=5篇完整搜索结果
[7] llm_gen_4 "round4记忆 ..."
[8] search_4 topk=5篇完整搜索结果 ← 刚放入
]
バックスキャン、いくつかのツールの結果:
search_4 → flag=1(还没截够)
llm_4→跳过
search_3 → flag=2截断点在这里!
組み立てプロンプトは、次の内容のみを取得します。
llm_gen_4 + search_4
最後に LLM は次のプロンプトを表示しました。
System: You are a helpful assistant.
User: 原始问题 <- 永远保留
Asst: round4记忆 <- 仅最后一轮
...
...
User: [round4的完整搜索结果] <- short_text(搜索=全文)
Asst: <- 等待模型继续生成
ラウンド1、ラウンド2、ラウンド3→完全アニメーション!
直观研究:「テキスト圧縮」ではなく「履歴を捨てる」:
Round 1 Round 2 Round 3 Round4 Round5
[llm][搜] [llm][搜] [llm][搜] [llm][搜] ?
xxx xxx xxx √√√
x = 完全丢弃(不放进prompt)
√ = 放进prompt(搜索结果用short_text,llm 输出前缀)
モデルはround4のものです
4.4 設計一致検証
我们是視题 mem_reward 与prepare_prompt()ダウンロード设计印证?
仮定を確認する
先電影全電影の「仮説」。
prepare_prompt() で余裕表示モデルの場合:
- sys_prompt
- 原始问题(memory[0])
- 上一轮llm 输出(记忆 ...
- 上一轮搜索结果(short_text)
mem_live(トレーニング時間计算P_mem)
mem_sys_prompt_ids = deepcopy(prompt_ids) + response_mem_ids(当前轮... 内容)
# prompt_ids = 完整的初始prompt,包含系统提示 + 原始问题(这是rollout开始时的 input)
両者の比較
prepare_prompt()(推理) mem_traj(训练信号)
─────────────────────────────────────────────────────────────────────────────
系统提示 √包含 包含(prompt_ids的一部分)
原始问题 √包含 包含(prompt_ids的一部分)
当前轮 √包含(上一轮的记忆) 包含(当前轮的记忆)
上一轮搜索结果 √包含(short_text) X不包含
历史对话 X不包含(窗口截断) X不包含
結論:ほぼ同意ですが、重要な違いが 1 つあります:
- 一个在線上(性性技术对齐): 両方が強調されます:「只度」
+ 電影问题”就可能電電 → mem_reward 電影 = 現実的な制約のときの余裕 √ - 違い:prepare_prompt() は「上一轮金属電影のshort_text」(100字)も表示しますが、mem_trajにはこれが含まれません
インパクト:
P_mem的计算条件比 推理时实际条件更严苛(推理时还能看到 100 字搜索摘要,训练奖励却假设只能看记忆)
-> 这意味着训练信号实际上是"高标准版"
-> 如果模型的 通过了这个高标准,推理时(还能看到搜索摘要)
表现应该更好
電気効果電気効果性これらの図

一言要約:この 2 つは確かに相互証明です。prepare_prompt() は「制限」、mem_reward は「動機」、都电影计管理设计:设
0x05 潜在的な問題の分析
我们下載是电影电影电影电影,切是电影会电影设计在电影电影?
5.1 コア情報モデル
毎回、モデルには次のプロンプトが表示されます。
原始问题(永久保留) + 上轮的(上一轮llm输出的完整文本) + 上轮搜索结果(full text或100字)
それから:
5.2 問題 1:限られたスペース,写不完全安全机
- トレーニング設定:max_response_length = 4096トークン(run_train.sh有効設定)
- 評価構成:最大出力モデル(制限なし、ただしmodelctx制限あり)
一轮 llm 输出 = ++
もし
5轮对话积累的知识要压缩进一个:
Round1发现:A是某公司创始人(需记)
Round2发现:A公司成立于1998年(需记)
Round3发现:1998年某行业政策(相关背景,是否记?)
Round4发现:竞争对手信息(是否记?)
→ 5轮知识 → 500 token,必须选择性遗忘
注意事項: モデルの中間の事実は「重要ではないようです」として無視できますが、これらの事実は追跡分析の鍵となる可能性があります。
5.3 問題点 2:写是上轮全文,非抄
# prepare_prompt()
prompt.append({"role":"assistant","content":"" + r.text})
# ↑全文!
# r.text = 上轮完整 llm 输出,包括 , 等标签
上轮llm输出(r.text)结构:
第4轮记忆摘要
这次搜索到了xxX,结合之前的YYY...
查询词
本轮prompt中看到的:
+ 上述全文 = 第4轮记忆摘要 ... .
模型需要从嵌套的...结构中提取信息
潜在的な忘れ: 入れ子構造により情報抽出が難しくなり、モデルは外側の層にしか従うことができなくなります。
5.4 問題 3:多迷滞在链断裂
典型的なマルチジャンプ問題:
Q:"X的创始人在哪所大学取得博士学位?"
Round 1:搜索"X公司"→发现创始人是John
Round 2:搜索"John 教育背景"→发现 John 在 MIT 读博
Round 3:准备回答,应包含:(a)X的创始人=John(round1发现) (b)John 在MIT(round2发现)
但 round 1 的搜索结果在 round 3 已经丢失!
忘れたこと:予備银条の中間ノード
確率分析:
- 每轮要布去生游戏 → 開始店遗忘れ随轮数单了
- 8轮(设计) VS 64议(设计)→ 简件時遗忘电影远全设计设计!
5.5 質問 4: 8 回のトレーニングと 64 回のトレーニングの分布
電視方法事生63次报動力手机 → 深山最地失效
これは次のようになります。 トレーニング時間打5关电影、テスト時間要打64关 → 後期手机安全没有手机信有手机
5.6 問題 5: 検索結果 short_text の非分成電視
search_results.short_text = full_text # 搜索:全文 (可能很长)
webpage.short_text = page[:100] # 网页:仅前100字
Web ページの種類については、次のように分析します。
当前轮:prompt包含网页全文(25000字)
下一轮:prompt中这个网页只有100字(截断99.6%!)
100字约等于3~4句话→极度压缩
网页中的关键段落(位于第3段)→ 完全消失
この要件、モデルはキーコンテンツを記述する必要があります
5.7 汇总:情報忘れリスクマトリックス
| 情報の種類 | 忘れる確率 | 原因 |
|---|---|---|
| 検索結果の詳細 | 高い | プロンプトから完全に削除します |
| Webページコンテンツの開始部分以外の部分 | 极高 | short_text のみ 100 文字が予約されています |
| 中間ノード | 中~高 | モデル選択の圧縮 |
| 問題の原文 | ゼロ | 永遠に記憶に保存される[0] |
| 上一轮 |
ゼロ | プロンプトに直接入力 |
| 数値精度(人名、日期学) | 中 |
5.8 MemPOの解決方法
MemPO 報酬信号:mem_reward = P_mem(正解答 I のみ
トレーニングプレッシャー:
制限:
- 報酬のみ、最高の回答を参照してください。滞在期間に影響はありません
- 報酬は每轮の粒度で、「第 2 轮時間间计第 5 轮滞在」の期間名をキャッチできません
- トレーニングはわずか8日間で、モデルは現場を見ていない
