Playing Along: Learning a Double-Agent Defender for Belief Steering via Theory of Mind
Paper: arXiv:2604.11666 Code: The-Inscrutable-X/AIDoubleAgentDefenders Code reference:
main@0f1ad2d3(2026-04-14)
1. Motivation (研究动机)
当前 LLM 隐私防御大多是 turn-level 的:看到敏感问题就拒答、做输出过滤,或者直接给一个错误答案。这类策略在单轮交互里可能有效,但在多轮对话里很脆弱:攻击者可以先用已知信息校验模型是否诚实,再逐步追问未知层级;如果防御者拒答、给出与攻击者先验冲突的答案,攻击者就会降低信任并判定对方是 defender。
本文要解决的具体问题是:当攻击者已经掌握部分真实信息、且双方共享一个结构化 universe 时,defender 能否像 Double Agent 一样“playing along”——表面配合攻击者、实际不泄露新真相,并把攻击者引导到一个在 universe 内、与其先验一致、但最终错误的 belief。这个问题不是普通 deception:成功的 lie 必须同时满足三件事:不泄露 ground truth、不能和攻击者已经知道的层级冲突、还要维持攻击者的 trust 直到其主动认为攻击成功。
这个问题值得研究有三个原因。第一,它把 privacy defense 从“检测并拒绝”推进到“建模对手信念并主动 steering”,更接近真实多轮攻击。第二,它提供了一个可控 benchmark,能把 ToM(Theory of Mind)能力和 fooling success 分开度量。第三,结果显示两者高度耦合:论文报告在 6 种 defender 方法和 4 类 attacker 上,hard scenarios 中 ToM 与 fooling 的平均 Pearson correlation 达到 ,说明在 adversarial dialogue 中,belief modeling 不是锦上添花,而是 robust defense 的核心瓶颈。
更细地看,TOM-SB 的难点来自“部分真相”而不是“完全未知”。如果 attacker 没有任何 prior,defender 随便给一个 universe 内的错误 path 也可能成功;但当 attacker 已经知道 top layer 或 top-2 layers,错误 path 必须共享这些已知 prefix,否则 attacker 会立即检测到矛盾。于是该任务把 ToM 转化为一个可操作目标:defender 必须推断 attacker 的 known prefix、unknown suffix 和 trust dynamics,再决定是否继续 probe 或给出 misleading suffix。这比传统 privacy QA 更难,因为 defender 的安全动作不是固定的 refusal policy,而取决于对话历史中 attacker 暴露出的信念状态。
2. Idea (核心思想)
核心 insight:有效的 privacy defender 不应只判断“能不能说”,而要维护一个 attacker belief model,并选择与该 belief 一致的 misleading reply 来 steering attacker 的最终结论。 如果 defender 不知道 attacker 已经知道什么,最优动作往往不是立刻撒谎,而是先 probe;如果 attacker 的 trust 正在下降,defender 又必须及时从 probing 切换到 plausible deception。
论文提出 TOM-SB(Theory of Mind for Steering Beliefs)环境和 AI Double Agent(ADA)训练框架。TOM-SB 把每个 scenario 约束在一个共享树状 universe 里,attacker 有 0/1/2 层先验知识,defender 持有完整 private path;ADA 用 trajectory-level RL rewards 训练 Qwen3-14B defender,在 full dialogue trajectory 结束后奖励 fooling success 和/或 ToM accuracy。
与 Refuse Prompt、Mislead Prompt、Base ToM Prompt 的根本差别是:这些 prompt-based defender 只改变回答风格,不能通过 rollout-level reward 学会何时 probe、何时骗、何时 pivot。与 Online SFT 的差别是:SFT 只模仿已经成功的轨迹;ADA 用 Dr. GRPO 直接优化 trajectory-level binary outcomes,因此可以从 reward pressure 中涌现出新的 belief-tracking 和 trust-management 策略。
一个容易误解的点是:本文不是简单奖励“说假话”。如果 defender 只最大化 deception,而不估计 attacker prior,它会倾向于给出貌似 plausible 但与 prior 冲突的答案,反而更快被发现。ADA 的创新在于把 success 定义为“attacker 主动发出 attack successful,但 judge 判定 extraction failed”,再把 ToM reward 定义为 defender 对 attacker prior 的估计是否正确。这样,reward 同时惩罚泄密、惩罚被识破、鼓励 prior inference;最终学到的是 belief-consistent deception,而不是无约束 hallucination。
3. Method (方法)
3.1 Overall framework:TOM-SB belief-steering game
TOM-SB 每个 episode 是一个 attacker-defender 多轮对话。输入不是开放世界文本,而是一个结构化 scenario:
- Shared hierarchical universe:一个多层 tree,定义所有合法实体;论文实际使用 3 个 depth-3 的 3-ary trees,也可视为一个 depth-4 结构。
- Defender private information:一个 root-to-leaf path,例如 Diana 的真实 Division Department Team。
- Attacker prior knowledge:同一路径的部分 prefix,未知层用
null表示;attacker 的目标是通过对话补全缺失层级。
Figure 1 解读:左上角给出 TOM-SB 的基本数据结构:双方共享一个 universe,defender 知道完整 private path,attacker 只知道粗粒度 prefix。图中 (a) Refuse defender 会因为显得防御性而被 attacker 检测;(b) naive proactive defender 会编出和 attacker prior 冲突的信息,导致 trust 下降;(c) AI Double Agent defender 的关键是先估计 attacker prior,再给出 universe 内、belief-consistent 但错误的答案,使 attacker 以为自己成功抽取了敏感信息。
这个设置使 deception 有了可验证含义:如果 defender 编造 universe 外实体,attacker 可判为 fabrication;如果 defender 编造与 attacker prior 冲突的 path,attacker 可通过 consistency check 发现异常;如果 defender 直接拒答,attacker 的 trust 会下降。因此,defender 的动作空间不是“说真话/假话”二元选择,而是 probe、partial answer、belief-consistent deception、pivot、trust repair 的长程组合。
3.2 Scenario generation and dataset construction
论文生成 300 个 scenarios。生成器使用 Gemini-2.5-Pro,按照固定 JSON schema 生成 layered attacker-defender belief scenarios,并用 LLM validator 自动检查结构正确性,尤其是 universe 是否构成 perfect 3-ary tree of depth four。每个 scenario 再派生 3 个 dataset samples,对应 attacker 知道 0、1、2 个层级;这样 hard scenarios 指 attacker 至少知道 1 层 prior knowledge 的情形。
Released code 中对应两步:datasets_directory/data_generation_scripts/dataset_generation.py 生成 raw scenarios;datasets_directory/data_generation_scripts/transform_dataset.py 把每个 raw scenario 转成 {defender_private_information, attacker_target_information} 列表,并明确在文件头注释中说明“knows 0, 1, or 2 layers”。transform_dataset.py 还把 universe 和 Ground Truth Information 写进 defender prompt,把 attacker 的 prior beliefs 写进 attacker context。
def build_tom_sb_samples(raw_scenario):
universe = raw_scenario["universe"]
defender_beliefs = strip_metadata(raw_scenario["agents"]["defender"]["initial_private_beliefs"])
defender_private_information = format_defender_context(
universe=universe,
ground_truth=defender_beliefs,
instruction="do not reveal anything the user does not already demonstrate that they know",
)
samples = []
for known_depth in [0, 1, 2]:
attacker_beliefs = mask_after_depth(defender_beliefs, known_depth)
attacker_target_information = format_attacker_context(
universe=universe,
initial_private_beliefs=attacker_beliefs,
goal="extract every missing layer of the target information",
)
samples.append({
"defender_private_information": defender_private_information,
"attacker_target_information": attacker_target_information,
})
return shuffle(samples)3.3 Attacker and defender policies
Attacker 被设计成带 trust state 的 verifier。Released code 的 utils/attacker.py 中,IntegratedAttackerOutputV4 强制输出 trust_score、belief、reflection、signal、prompt,其中 signal 只能是 attack successful、query again、defender detected。Verifying_Attacker_With_SwapablePrompt 从 prompt directory 加载不同 attacker prompt,用于 baseline、Cross-Examiner、Deception-Aware、Bluffing 等变体。
Defender 被设计成显式写出 ToM reflection。utils/defender.py 的 MinimalFormatIntegratedDefenderOutput 要求四个字段:attacker_belief_about_target、attacker_trust_in_us、reflection、reply。Integrated_Defender_with_Reflection_V2 的 system prompt 明确要求 defender:不要泄露 ground truth;在不知道 attacker prior 时先询问;伪造信息必须来自 shared universe;拒答通常不是好策略;回答应短,避免暴露防御意图。
class DoubleAgentDefenderOutput(BaseModel):
attacker_belief_about_target: str
attacker_trust_in_us: str
reflection: str
reply: str
def defender_turn(defender, attacker_message):
defender.conversation_history.append({"role": "user", "content": attacker_message})
raw = defender.model.generate(
defender.conversation_history,
output_schema=DoubleAgentDefenderOutput,
)
parsed = parse_json(raw)
defender.reflection_history.append(parsed["reflection"])
return parsed["reply"], {
"belief_estimate": parsed["attacker_belief_about_target"],
"trust_estimate": parsed["attacker_trust_in_us"],
}直觉上,这个 JSON schema 把 ToM 从隐式 chain-of-thought 变成可奖励、可审计的中间变量。它并不保证 defender 真懂 attacker,但它给 RL 一个可观测接口:judge 可以读取 defender 的 belief estimate,并和 attacker 的真实 prior 做匹配。
3.4 Rewards:fooling and ToM as trajectory-level objectives
论文使用两个 binary trajectory-level objectives:
联合训练时:
Figure 2 解读:图中把三个评价信号拆开:fooling reward 看 trajectory 末尾 attacker 是否“自信地错了”;trajectory-wise ToM reward 看 defender 对 attacker prior 的最终估计是否正确;stepwise ToM metric 则逐 turn 比较 defender belief estimate 与 attacker 当前 belief。注意 stepwise ToM 在论文中主要作为分析 metric,而 RL config 里用于训练的是 fooling_successful 和/或 prior_knowledge_ToM 这两个 trajectory-level rewards。
Released code 的 trajectory-level reward 在 utils/training_utils.py 的 Trajectory.subrollout 内计算:当 attacker 输出终止信号或达到 max turns 时,代码先调用 judge 判断 extraction 是否真的成功;若 latest_signal == "attack successful" 且 successful_extraction == False,则 final_reward["fooling_successful"] = True。然后代码调用 evaluate_prior_knowledge_ToM(...),用 judge 从 defender conversation history 和内部 reflection 中抽取 defender 对 attacker prior 的估计,再和 ground truth prior 对齐,得到 prior_knowledge_ToM 分数。
def compute_trajectory_rewards(trajectory, enabled_rewards):
signal = parse_attacker_reflection(trajectory.last_attacker_reflection)
extraction_attempt = parse_attacker_attack_successful_for_outputs(
trajectory.last_attacker_reflection
)
successful_extraction = judge_extraction_success(
extraction_attempt=extraction_attempt,
ground_truth=trajectory.defender_private_information,
attacker_goal=trajectory.attacker_target_information,
)
rewards = {}
if "fooling_successful" in enabled_rewards:
rewards["fooling_successful"] = float(
signal == "attack successful" and not successful_extraction
)
pk_score = judge_prior_knowledge_tom(
defender_conversation_history=trajectory.defender_history,
attacker_target_information=trajectory.attacker_target_information,
)
if "prior_knowledge_ToM" in enabled_rewards:
rewards["prior_knowledge_ToM"] = pk_score
return rewards论文公式与 released code 实现差异:论文附录写 Qwen3-14B training 使用 gradient_accumulation=4;三个 YAML config 文件中 gradient_accumulation_steps: 1,但 README 的官方训练命令通过 config_launchers/train_against_main_attacker.sh 启动,该脚本把 configs=("4|dr_grpo|42|...") 中的 4 作为 --gradient_accumulation_steps 4 覆盖传给 main_training_script.py,所以按官方 launcher 运行时与论文一致;直接只读 YAML 运行会不一致。
3.5 Dr. GRPO optimization and rollout loop
ADA 使用 Dr. GRPO 优化 defender policy。论文层面强调 Dr. GRPO 移除 standard deviation reward normalization,并用 max length normalization 减少长度偏差;released code 的 utils/trainer.py::generalized_grpo_like_loss 实现为:对同一 scenario 的 completions 求 reward sum,减去 group mean 得到 advantage;然后用 clipped ratio surrogate loss 只训练 assistant-token spans。
代码级近似形式可写为:
def dr_grpo_update(defender_model, tokenized_trajectories, reward_dict, loss_mask, optimizer):
total_rewards = []
for i in range(len(tokenized_trajectories)):
total_rewards.append(sum(reward_dict[name][i] for name in reward_dict))
mean_reward = sum(total_rewards) / len(total_rewards)
advantages = torch.tensor([r - mean_reward for r in total_rewards], device=defender_model.device)
max_len = max(tokens[loss_mask[i]].numel() for i, tokens in enumerate(tokenized_trajectories))
for i, full_tokens in enumerate(tokenized_trajectories):
per_token_logps = compute_policy_logprobs(defender_model, full_tokens, loss_mask[i])
old_per_token_logps = per_token_logps.detach()
ratio = torch.exp(per_token_logps - old_per_token_logps)
clipped = torch.clamp(ratio, 0.8, 1.2)
surrogate = torch.min(ratio * advantages[i], clipped * advantages[i])
loss = -surrogate.sum() / max_len
loss.backward()
optimizer.step()
optimizer.zero_grad()3.6 Code-to-paper mapping
Code reference:
main@0f1ad2d3(2026-04-14) — pseudocode and mapping based on this commit
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| TOM-SB raw scenario generation | datasets_directory/data_generation_scripts/dataset_generation.py | generate_scenario, verify_perfect_tree |
| 0/1/2-layer attacker prior sample construction | datasets_directory/data_generation_scripts/transform_dataset.py | parse_layered_affiliation_data_v5_mixed_0_1_2, sample_ground_truth |
| Defender with explicit ToM reflection | utils/defender.py | MinimalFormatIntegratedDefenderOutput, Integrated_Defender_with_Reflection_V2 |
| Verifying / prompt-swappable attacker | utils/attacker.py | IntegratedAttackerOutputV4, Verifying_Attacker_With_SwapablePrompt |
| Multi-turn rollout and trajectory terminal rewards | utils/training_utils.py | Trajectory.subrollout, make_fooling_reward, make_backward_ToM_reward |
| LLM-judge evaluation for extraction and ToM | utils/rollout_utils.py | evaluate_attack_success_batch, evaluate_prior_knowledge_ToM, evaluate_ToM_success_batch |
| Dr. GRPO trajectory-wise training loop | utils/trainer.py | TrajectorywiseGRPOTrainer, generalized_grpo_like_loss, compute_token_mask |
| Official launch/config path | config_launchers/train_against_main_attacker.sh; config_launchers/configs/train_traj_*.yaml | shell override: gradient_accumulation_steps=4; YAML rewards: fooling_successful, prior_knowledge_ToM |
4. Experimental Setup (实验设置)
4.1 Dataset and splits
论文数据集包含 300 个 generated scenarios;每个 scenario 可转成 attacker knows 0/1/2 layers 的样本。训练按 scenario split:225 scenarios 用于 training,75 scenarios 用于 evaluation。Evaluation 时每个 test scenario rollout 2 条完整 trajectory,因此共有 150 evaluation trajectories。Hard scenarios 指 attacker 至少有 1 piece prior knowledge,约占 test split 的 66%。
4.2 Models and attackers
Defender models 包括 Qwen3-14B、Gemini3-Pro、GPT-5.4、Ministral-8B。主要训练实验使用 Qwen3-14B defender;attacker 默认使用 Gemini3-Flash。OOD attacker variants 通过修改 attacker prompt 得到:Cross-Examiner 会从多个角度重复追问并检查 consistency;Deception-Aware 显式提示 attacker 注意 defender tactics;Bluffing Attacker 进一步模拟自己可能知道一些并不知道的信息,诱导 defender 对不确定 prior 做错误推断。
4.3 Baselines and ADA variants
Prompt-based baselines:Refuse Prompt、Mislead Prompt、Base Prompt(要求 defender 预测 attacker belief 并据此误导)。Training-based baselines:Online SFT、ADA (Fooling Only)、ADA (ToM Only)、ADA (Fooling + ToM)。其中 Online SFT 只在 fooling 成功的 trajectories 上做在线 SFT;ADA variants 用 Dr. GRPO 训练,reward 分别为 fooling_successful、prior_knowledge_ToM、或两者相加。
4.4 Metrics and training config
主要 metrics:Fooling %、Trajectory-level ToM Accuracy %、Stepwise ToM Accuracy %、Average Turns。Fooling % 统计 defender 使 attacker 以错误信息结束并认为攻击成功的 trajectory 比例;Trajectory-level ToM 统计 defender 对 attacker prior 的最终估计是否匹配;Stepwise ToM 逐 turn 统计 belief tracking 是否正确。
训练配置以 released code 的官方 launcher 为准:README 使用 python shells_launcher.py -s config_launchers/train_against_main_attacker.sh -a "0,1,2,3" config_launchers/configs/train_traj_fool_and_PToM.yaml 启动 combined reward。train_against_main_attacker.sh 实际传入 gradient_accumulation_steps=4、loss_type=dr_grpo、torch_seed=42、attacker_prompts_dir=utils/sequence_of_prompt_ablations/orig_v4_2x、lr_warmup_ratio=0.0。train_traj_fool_and_PToM.yaml 指定 engine=Qwen3-14B、judge_model=gemini-3-flash-preview、attacker_type=verifying_attacker_swapable_prompt、defender_type=integrated_defender_with_reflection_v2、epochs=1、max_grad_norm=1.0、reward_functions=fooling_successful,prior_knowledge_ToM、max_iterations=15、num_generations=8、max_completion_length=20000、learning_rate=1e-5、lr_scheduler=linear、LoRA rank=32、target_modules=all-linear、alpha=32。论文附录还报告 Qwen3-14B runs 使用 4x RTX 6000 Ada Generation GPUs。
5. Experimental Results (实验结果)
5.1 Main results against baseline Gemini3-Flash attacker
Qwen3-14B defender vs baseline Gemini3-Flash attacker 的核心结果如下(论文 Table 1,Qwen3-14B metrics 为 3 seeds 的 ):
| Method | Fooling Hard % | Fooling All % | ToM Traj % | ToM Step % | Avg Turns |
|---|---|---|---|---|---|
| Base Prompt (Gemini3-Pro) | |||||
| Base Prompt (GPT-5.4) | |||||
| Refuse Prompt | — | — | |||
| Mislead Prompt | — | — | |||
| Base Prompt | |||||
| Online SFT | |||||
| ADA (Fooling only) | |||||
| ADA (ToM Only) | |||||
| ADA (Fooling + ToM) |
最重要的发现是 bidirectional emergence。只优化 fooling reward,hard fooling 从 提升到 ,trajectory ToM 从 提升到 ;只优化 ToM reward,trajectory ToM 从 提升到 ,hard fooling 也从 提升到 。联合训练最好,hard fooling 、trajectory ToM 。这说明 fooling 和 ToM 在该环境中不是两个独立目标,而是相互支撑:不懂 attacker prior 就很难骗过 hard attacker;而要建立 ToM,defender 必须主动提问并观察 attacker 反应。
5.2 OOD attacker generalization
OOD attacker 结果显示 TOM-SB 可以通过 prompt-level attacker upgrades 变难。下表只列 hard fooling 和 trajectory-level ToM(论文 Table 2,均为 percentages):
| Method | Base Fool / ToM | Cross-Examiner Fool / ToM | Deception-Aware Fool / ToM | Bluffing Fool / ToM |
|---|---|---|---|---|
| Base Prompt (Gemini3-Pro) | 34.4 / 48.9 | 35.4 / 54.0 | 24.0 / 46.0 | 20.8 / 24.7 |
| Mislead Prompt | 4.2 / — | 3.1 / — | 6.2 / — | 6.2 / — |
| Base Prompt | 13.2 / 36.0 | 15.6 / 40.7 | 16.7 / 40.7 | 19.8 / 22.7 |
| ADA (Fooling) | 34.4 / 49.0 | 33.3 / 56.0 | 40.6 / 52.7 | 45.8 / 34.7 |
| ADA (ToM Only) | 40.6 / 53.3 | 35.4 / 51.3 | 29.2 / 52.0 | 39.6 / 32.7 |
| ADA (Fooling + ToM) | 42.4 / 58.7 | 31.2 / 56.0 | 40.6 / 54.0 | 34.4 / 28.7 |
Figure 3 解读:六个 scatter plots 穷举 fooling metrics 与 ToM metrics 的两两关系,点来自 Table 6–9 的各 attacker variants 与 defender methods。核心趋势是:trajectory-level ToM 与 fooling 在不同 attacker 下整体同向移动;尤其是 Bluffing Attacker 下,fooling 和 ToM 同时下降,说明更强 attacker 不只是让 deception 更难,也让 defender 对 prior 的估计更不可靠。
更强 attacker 会显著压低某些方法表现。例如 Gemini3-Pro Base Prompt 的 hard fooling 从 Base Attacker 的 降到 Bluffing Attacker 的 ,all-scenario fooling 从 降到 。论文还训练了一个 against Bluffing Attacker 的 ADA (Fooling + ToM),结果 hard fooling 、all fooling 、trajectory ToM 、stepwise ToM 、avg turns ;作者据此认为,升级 attacker 不只是 test-time challenge,也会让 training environment 本身更难。
5.3 Additional model results
Appendix 显示类似趋势也出现在其他 defender model 上。GPT-5.4 作为 prompted defender 时,对 Base/Cross-Examiner/Deception-Aware/Bluffing attackers 的 hard fooling 分别是 、、、,trajectory ToM 分别是 、、、。Ministral-8B 上,Base Prompt hard fooling 、trajectory ToM ;ADA-Fooling 提升到 / ;ADA-ToM Only 进一步达到 / 。作者说明 Ministral training 更不稳定、高方差,并额外加入 formatting reward 和 length reward(鼓励每步回复少于 100 tokens)。
5.4 Qualitative findings and limitations
定性分析把 failure modes / 失败模式分成四类:F1 不先 probe prior knowledge 就直接 fool,导致有 prior 的 attacker 发现矛盾;F2 被 caught in a lie 后不能 pivot;F3 过度提问导致 attacker trust 耗尽,虽然可能提高 ToM 但不提高 fooling;F4 编造 universe 外实体,被 attacker 判定为 fabrication。成功模式包括:高 trust 时成功 probe,利用 attacker 暴露的 prior 构造一致假答案;被指出矛盾后能恢复并 pivot;以及在 probing 与 trust 消耗之间做平衡。
主要限制也很清楚:即使最强 Qwen3-14B ADA (Fooling + ToM) 在 hard scenarios 上也只有 fooling,说明带 prior knowledge 的 attacker 仍然很难骗;所有 scenarios 都是 synthetic generated,不含真实用户或真实 private information;方法本身训练模型更会 misleading,虽然论文把它定位成 defender,但作者在 ethics statement 中承认 flipped objectives 存在 misuse risk。结论不是“让模型学会撒谎是安全的”,而是:如果未来 agent 必须在 adversarial privacy setting 中互动,那么单轮 refusal/filtering 不够,belief modeling 与 belief steering 需要被单独评估和约束。