MemPrivacy: Privacy-Preserving Personalized Memory Management for Edge-Cloud Agents

Paper: arXiv:2605.09530 Code: MemTensor/MemPrivacy Code reference: main @ c5ad44a8 (2026-05-15)

1. Motivation (研究动机)

Edge-cloud agent memory 的核心矛盾

这篇论文关注的是带长期记忆的 edge-cloud agents:用户交互发生在本地设备,但高算力推理、memory writing、memory retrieval 和个性化回答常被放到云端。长期记忆越有效,系统越可能保存用户偏好、历史事件、身份信息、健康/财务/轨迹/凭证等敏感内容;这些内容一旦进入 cloud logs、vector DB、external memory store 或 agent workflow,风险就不再局限于一次 prompt,而会贯穿后续存储、检索和复用。

论文给出的背景问题很具体:已有 memory attack / leakage attack / indirect prompt injection 可以诱导 memory systems 暴露隐私;同时用户并不总能理解云端 agent 如何收集与复用个人数据,于是会出现手动删改、策略性自我审查和对个性化功能的不信任。传统的 full masking / redaction 虽然能隐藏原始值,但会把对 memory formation 和 reasoning 很关键的语义角色也一起破坏,例如把 160/110recovery code RC-7291home address 全都变成 *** 后,云端 memory 很难知道这些信息分别是健康指标、凭证还是地址。

Figure 1 解读:图中对比了三类 local-to-cloud 传输方式。Raw transmission 直接把隐私值送到云端,utility 最高但 privacy 最差;full masking 隐私更安全,但把类型和语义关系一起抹掉;MemPrivacy 的关键折中是把敏感 span 替换成 type-aware placeholder,并把原值到 placeholder 的映射留在本地,从而让云端仍能利用“这是 Email / Health_Info / Recovery_Code”这样的语义结构。

本文要解决的问题

论文把问题表述为:如何在 cloud-side memory processing 中最小化 sensitive data exposure,同时保留检索、长期适应和个性化回答所需的 semantic structure。换言之,它不是只做 PII detection,也不是只做 anonymization,而是要让 agent memory pipeline 在“云端只见占位符、本地可还原”的架构下仍然可用。

形式化地,用户原始输入为 ,其中包含隐私集合 ;无威胁理想情况下云端 agent 在 memory state 上生成: MemPrivacy 引入本地脱敏函数 和本地恢复函数 ,先得到 ,云端只在 上推理,最后本地恢复: 隐私泄露风险定义为攻击者 观察 后能恢复任一原始隐私项的概率: utility loss 则衡量恢复后的用户可见回答 与理想回答之间的差距: 总体目标是在 utility loss 不超过用户可接受阈值 的约束下,寻找最优的本地脱敏/恢复函数:

为什么值得研究

如果这个问题解决得好,cloud agent 可以继续使用强模型、检索器和外部 memory systems 做长期个性化,而不必把原始敏感值暴露给云端。对用户来说,交互体验接近 plaintext memory;对云端系统来说,看到的是类型化语义占位符;对部署者来说,隐私策略可以按 PL2/PL3/PL4 阈值配置,而不是在“全暴露”和“全遮蔽”之间二选一。

2. Idea (核心思想)

MemPrivacy 的核心洞察是:privacy protection 不一定要等价于 semantic destruction。许多 memory/reasoning 场景真正需要的是“这个 span 是什么类型、在句子里承担什么角色、是否要跨轮一致引用”,而不是云端必须知道原始真实值;因此可以把敏感值替换成类型化、可追踪、可本地还原的 placeholder。

具体创新可以概括为三点:第一,在本地用 MemPrivacy Model 抽取隐私 span,并标注 privacy level 与 privacy type;第二,用 <Type_N> 形式的 typed placeholders 代替原值,并把映射存入本地 SQLite;第三,云端完成 memory writing/retrieval/answering 后,本地再把 response 中的 placeholder 还原为原始值。论文把这一路径称为 local reversible pseudonymization:pseudonymization 发生在本地,cloud 只接触 pseudonym;reversible 也只在本地成立,因为 placeholder 到原值的映射不进入 cloud memory。

与 irreversible masking 的根本区别是,MemPrivacy 保留类型语义;与 generic placeholder masking 的区别是,它不仅保留“这里有隐私”,还保留“这是 Email / Medical Health / Recovery Code”等任务相关角色。与 differential privacy 或 cryptographic protection 相比,MemPrivacy 不试图给每次 memory operation 一个形式化噪声/密码学保证,而是把部署边界改成“云端永远不接触 raw value”;它牺牲的是一部分严格安全证明,换来的是低延迟、容易接入现有 memory systems、并且对 retrieval/answering 更友好的语义保真。

一个直观例子是:如果用户说“我的恢复码是 RC-7291,血压 160/110”,*** masking 会让云端失去“凭证”和“健康指标”的区别;generic <MASK_1> 也无法提供类型;MemPrivacy 则能生成类似 <Recovery_Code_1><Medical_Health_1>,使 memory system 可以知道哪类信息在被引用,同时 raw values 永远不离开本地。这个思想也解释了为什么论文要同时做 taxonomy、extractor training 和 memory-system evaluation:taxonomy 决定什么该被保护,extractor 决定 raw value 是否会漏出,typed placeholders 决定 cloud memory 还能保留多少 utility。

3. Method (方法)

3.1 Overall framework:三阶段闭环架构

Figure 2 解读:这是 MemPrivacy 的主架构图。左侧是 local edge device,负责隐私识别、typed placeholder 替换和本地映射表维护;中间/右侧是 cloud agent memory pipeline,只接收 desensitized input 并把 placeholder 写入 memory store;返回回答后,local restoration 模块查询本地数据库,把 <Type_N> 替换回原始值。图中的关键闭环是:cloud 可以长期存储和检索“语义占位符”,但无法直接得到 raw private value。

MemPrivacy 的执行生命周期分为三段:

  • Stage 1: Uplink Desensitization. 用户请求在离开设备前先经过轻量 MemPrivacy Model。模型输出每个隐私 span 的 original_textprivacy_levelprivacy_type;系统按用户设定的保护阈值(如只保护 PL3/PL4,或保护 PL2-PL4)决定哪些 span 要被替换。替换 token 不是统一 ***,而是按类型命名的 <EMAIL_1><Recovery_Code_1> 等,并把原值、类型、等级、mask 存入本地 SQLite。
  • Stage 2: Cloud Processing. 云端 memory system 只看到 sanitized input 和 placeholder。因为 placeholder 保留了类型语义,云端仍能进行 language understanding、retrieval、memory writing 和 answer generation;但即便云端日志或 memory store 泄露,也只泄露 placeholder 而不是可复用的真实隐私值。
  • Stage 3: Downlink Restoration. 云端回答可能包含 placeholder;本地系统查询 SQLite,把每个 placeholder 替换回原始值。这一步只是 database lookup 和 string substitution,因此论文认为延迟可忽略,用户看到的是自然且个性化的最终回答。

这个设计的直觉是把“隐私值本身”和“隐私值在任务中的语义角色”拆开:原值属于本地安全边界,语义角色可以有限地暴露给云端以支持 memory utility。只要 privacy extraction 足够准确,cloud-side memory 就能在不知道真实值的情况下维护可用的长期上下文。

3.2 Four-level privacy taxonomy:PL1—PL4

论文提出四级隐私分类,用于可配置保护策略:

Level定义重点典型内容默认处理含义
PL1低敏/偏好/习惯,不足以识别自然人,泄露通常不造成实质伤害风格偏好、兴趣、普通生活习惯、非诊断性情绪作为 exclusion class,通常不抽取、不遮蔽
PL2可识别、可定位或可稳定追踪个人姓名、电话、邮箱、详细地址、账号 ID、工作/学校背景、亲友联系信息基础 PII,可按保守策略保护
PL3以 expected harm 为核心,即泄露会造成安全、财产、健康、声誉或公平机会损害证件号、金融记录、医疗数据、轨迹、biometrics、通信内容、敏感身份、司法记录高敏信息,通常应保护
PL4可立即复用、可授权、可认证、可入侵的秘密密码、PIN、验证码、token、API key、private key、seed phrase、credential-bearing connection string、未公开可利用漏洞/访问细节最高优先级,泄露后需撤销/轮换

这个 taxonomy 的作用不是简单分类,而是提供“保护阈值”。用户或系统可以只 mask PL4,也可以 mask PL3+PL4,或最保守地 mask PL2—PL4。实验也按这些 masking levels 比较 utility loss。

3.3 MemPrivacy-Bench:面向 cloud memory 的隐私-效用基准

MemPrivacy-Bench 不是普通 PII extraction dataset,而是为长期 memory 场景构造的 privacy-utility trade-off benchmark。数据构造流程如下:

  • 从 PersonaHub seeds 合成 200 个完整用户画像,每个画像包含 basic attributes、四类 preferences(diet, arts & entertainment, lifestyle & hobbies, aesthetics)以及平均约 50 类 privacy fields。
  • 基于画像生成多轮 user-assistant dialogues,使隐私既可以显式出现,也可以通过上下文隐式暴露。
  • 场景覆盖 7 个高层类别和 23 个细分类别;每个用户随机采样 6—10 个子类别生成对话。
  • 数据中中英文各占 50%,总规模约 1M dialogue tokens;训练集为 160 users / 26,016 turns / 125,776 privacy instances,测试集为 40 users / 6,337 turns / 29,967 privacy instances。
  • 下游 memory QA 从测试集派生 6 类问题:basic memory、temporal reasoning、adversarial questioning、dynamic updating、implicit inference、information aggregation,共 615 question-answer pairs。

数据统计如下:

Dataset splitUsersTurnsMessagesPrivacy messagesPrivacy instancesQuestionsTokens
MemPrivacy-Bench Train16026,01652,03242,159125,77607,811,374
MemPrivacy-Bench Test406,33712,67410,23429,9676151,872,220
PersonaMem-v2 Evaluation202,5215,0411,0852,378563671,987

Privacy level distribution 也体现了难度差异:MemPrivacy-Bench test 有 4,845 个 PL4、14,562 个 PL3、10,560 个 PL2;PersonaMem-v2 evaluation 中 PL4 只有 22 个、PL3 为 553 个、PL2 为 1,803 个,因此论文认为前者是更高隐私密度的 stress test。

3.4 Annotation pipeline:LLM 辅助 + 人类复核

隐私标注先由 Gemini-3.1-Pro 和 GPT-5.2 双模型独立生成,再经过两阶段 refinement:第一阶段识别 privacy-relevant content 并给出候选标签,第二阶段修正不一致和边界 case。MemPrivacy-Bench test 与 PersonaMem-v2 evaluation 使用同一套标注策略,保证评估资源一致。

最终人工复核由 6 名 annotators 完成。每个 privacy item 同时检查 original span textprivacy levelprivacy type 三个字段,三者都正确才算正确;有歧义时可以查看用户画像和原始对话上下文。论文报告两个 evaluation sets 的人工验证准确率达到 98.08%

3.5 MemPrivacy Model training:SFT + GRPO

模型训练分两阶段。第一阶段对 26K training instances 做 full-parameter SFT,用 autoregressive cross-entropy 建立稳定初始化: 其中 是输入序列, 是目标输出 token, 是目标序列长度。这个阶段让模型先学会结构化输出 privacy spans、levels 和 types,避免 RL 早期探索时输出退化。

第二阶段在额外 1K training instances 上用 GRPO。对同一个输入 从 old policy 采样 个候选输出 ,用 extraction-level F1 作为 reward,然后做 group normalization 并优化 clipped objective + KL regularization: reward normalization 为: 训练 recipe:MemPrivacy-0.6B/1.7B/4B 都以 Qwen3 对应规模为 backbone,报告 SFT 和 SFT+RL 两类变体;主结果中最强模型是 MemPrivacy-4B-RL

3.6 Released code 实现和 paper-code 差异

Code reference: main @ c5ad44a8 (2026-05-15) — pseudocode and mapping based on this commit

released repo 中的核心实现集中在 src/privacy_masking.pyevaluation/src/privacy_masking.py 提供本地 SQLite store、mask/unmask、LLM-based privacy detection;evaluation/privacy_masking.py 增加 type_specificgeneric 两类 placeholder mode,并提供 complete_mask_dialogue 对应 irreversible masking。evaluation/eval_mem0.pyevaluation/eval_langmem.pyevaluation/eval_memobase.py 把同一套 masking/unmasking 接入三种 memory systems。

论文公式与 released code 实现差异:论文和 appendix 描述了 SFT + GRPO training pipeline,并称 training scripts available;但 main@c5ad44a8 的公开 repo 中未包含 LLaMA-Factory / MS-Swift 的实际训练 launch scripts 或 YAML,所以训练超参只能从论文 appendix 记录,不能从 released launch config 复核。另一个实现差异是 src/privacy_config.yaml 默认只启用 PL4PL3PL2 被注释;而实验表同时报告 PL2,PL3,PL4PL3,PL4PL4 三档 masking levels。

released repo 中未包含 LLaMA-Factory / MS-Swift 的实际训练 launch scripts;因此本笔记没有把训练超参伪装成 code-sourced launch config,而是明确标注为 paper appendix 证据。

核心伪代码(依据 src/privacy_masking.py):

import json_repair
 
class PrivacyStore:
    def __init__(self, db_path="privacy_store.db"):
        self.conn = sqlite3.connect(db_path, check_same_thread=False)
        self.conn.execute("""
            CREATE TABLE IF NOT EXISTS privacy_items(
              id INTEGER PRIMARY KEY AUTOINCREMENT,
              original_text TEXT NOT NULL UNIQUE,
              privacy_type TEXT NOT NULL,
              privacy_level TEXT NOT NULL,
              mask TEXT NOT NULL UNIQUE
            )
        """)
 
    def get_or_create(self, original_text, privacy_type, privacy_level):
        row = self.conn.execute(
            "SELECT mask FROM privacy_items WHERE original_text=?",
            (original_text,),
        ).fetchone()
        if row:
            return row["mask"]
        prefix = privacy_type.replace(" ", "_").replace("/", "_")
        seq = count_existing_type_rows(prefix) + 1
        mask = f"<{prefix}_{seq}>"
        self.conn.execute(
            "INSERT INTO privacy_items(original_text, privacy_type, privacy_level, mask) VALUES (?, ?, ?, ?)",
            (original_text, privacy_type, privacy_level, mask),
        )
        self.conn.commit()
        return mask
def mask_dialogue(dialogue_text, privacy_items, store, mask_levels=None):
    if mask_levels is None:
        mask_levels = ["PL3", "PL4"]
    replacements = []
    for item in privacy_items:
        if item.get("privacy_level", "") not in mask_levels:
            continue
        mask = store.get_or_create(
            original_text=item["original_text"],
            privacy_type=item["privacy_type"],
            privacy_level=item["privacy_level"],
        )
        replacements.append((item["original_text"], mask))
 
    replacements.sort(key=lambda pair: len(pair[0]), reverse=True)
    masked_text = dialogue_text
    for original, mask in replacements:
        masked_text = masked_text.replace(original, mask)
    return masked_text
 
 
def unmask_dialogue(masked_text, store):
    pattern = re.compile(r"<[A-Za-z_]+_\d+>")
    return pattern.sub(lambda m: store.query_by_mask(m.group(0))["original_text"], masked_text)
def detect_and_mask_dialogue(message_text, config, store, mask_levels=None, real_name=""):
    mask_levels = mask_levels or config["privacy"].get("mask_levels", ["PL3", "PL4"])
    prompt_template = open(config["privacy"]["prompt_path"]).read()
    user_prompt = prompt_template.format(
        real_name=real_name,
        input_dialogue_content=message_text,
    )
    response = openai_client.chat.completions.create(
        model=config["llm"]["model"],
        messages=[{"role": "user", "content": user_prompt}],
        max_tokens=config["llm"].get("max_tokens"),
        temperature=float(config["llm"].get("temperature", 0.0)),
    )
    content = strip_think_blocks(response.choices[0].message.content)
    privacy_items = json_repair.loads(content)
    masked_text = mask_dialogue(message_text, privacy_items, store, mask_levels)
    return masked_text, privacy_items

评估接入逻辑(依据 evaluation/eval_mem0.py / eval_memobase.py):

def add_dialogues_to_memory(user_data, memory_system, is_mask, mask_level, mask_mode):
    store = PrivacyStore(db_path=user_privacy_db(), mask_mode=mask_mode)
    for chunk in chunk_dialogues(user_data["dialogues"], turns_per_chunk=1):
        messages = []
        for user_msg, assistant_msg in chunk:
            user_content = user_msg["content"]
            if is_mask:
                if mask_mode == "complete":
                    user_content = complete_mask_dialogue(user_content, user_msg["privacy_info_llm"], mask_level)
                else:
                    user_content = mask_dialogue(user_content, user_msg["privacy_info_llm"], store, mask_level)
            messages.append({"role": "user", "content": user_content})
        memory_system.add(messages)
    return store
 
 
def answer_question(user_data, memory_system, query, is_mask, mask_mode, store):
    memories = memory_system.search(query, limit=20)
    prompt = build_answer_prompt(user_memories=memories, question=query)
    response = call_llm(prompt, llm_type="answer_llm")
    if is_mask and mask_mode != "complete":
        response = unmask_dialogue(response, store)
    return judge_or_exact_match(response, reference_answer=query["answer"])

Code-to-paper mapping:

Paper ConceptSource FileKey Class/Function
Local privacy mapping DBsrc/privacy_masking.pyPrivacyStore, _create_table, get_or_create, query_by_mask
Type-aware placeholder replacementsrc/privacy_masking.pymask_dialogue, _next_mask
Local response restorationsrc/privacy_masking.pyunmask_dialogue
LLM-based privacy detectionsrc/privacy_masking.py, src/prompts/extract_privacy.txtdetect_and_mask_dialogue, PL1—PL4 extraction prompt
Baseline complete maskingevaluation/privacy_masking.pycomplete_mask_dialogue
Generic vs type-specific placeholder baselineevaluation/privacy_masking.pyPrivacyStore(mask_mode="generic"/"type_specific")
Privacy extraction metricevaluation/metric.pyscore_original_text, score_privacy_level, score_privacy_type, compute_metrics, evaluate_privacy
Mem0 testbedevaluation/eval_mem0.pyprocess_single_user_data_add_memory, process_single_user_data_qa
LangMem testbedevaluation/eval_langmem.pyLangMem, process_single_user_data
Memobase testbedevaluation/eval_memobase.pyprocess_single_user_data_add_memory, process_single_user_data_qa
Evaluation LLM/configevaluation/eval_config.yaml, evaluation/utils.pymemory_llm=gpt-4.1-2025-04-14, answer_llm=gpt-4.1-2025-04-14, judgment_llm=gpt-5.2, call_llm
SFT/GRPO trainingpaper appendix only in this releasereleased repo lacks training launch scripts at main@c5ad44a8

4. Experimental Setup (实验设置)

Datasets

  • MemPrivacy-Bench:200 synthetic users;train 为 160 users、26,016 turns、52,032 messages、125,776 privacy instances、7,811,374 tokens;test 为 40 users、6,337 turns、12,674 messages、29,967 privacy instances、615 QA pairs、1,872,220 tokens。中英文各 50%。
  • PersonaMem-v2 evaluation subset:从 PersonaMem-v2 采样 20 users、2,521 turns、5,041 messages、2,378 privacy instances、563 multiple-choice questions、671,987 tokens,用于 OOD personalization/memory evaluation。
  • Memory QA 类型:MemPrivacy-Bench test 的 615 QA 覆盖 basic memory、temporal reasoning、adversarial questioning、dynamic updating、implicit inference、information aggregation。

Baselines / testbeds

  • Privacy extraction models:Qwen3-0.6B/1.7B/4B、LongCat-Flash-Chat、DeepSeek-V3.1-Terminus、DeepSeek-V3.2、GPT-5.2、Kimi-K2、GLM-5、DeepSeek-V3.2-Think、Gemini-3.1-Pro、OpenAI-Privacy-Filter,以及 MemPrivacy-0.6B/1.7B/4B 的 SFT/RL variants。
  • Memory systems:LangMem、Mem0、Memobase。论文强调它们不是同质 baseline,而是三类 memory testbeds:LangMem 重 agent framework 与 semantic/episodic/procedural memory;Mem0 是通用 memory layer;Memobase 是 user-profile-centered、time-aware memory service。
  • Privacy protection baselines:Irreversible masking(所有被保护 span 替换为 ***,不做 response-side restoration);Untyped placeholder masking(用 <Mask_1> 等 generic placeholder 替换,不保留 semantic type);MemPrivacy(type-aware placeholder + local restoration)。

Metrics

  • Privacy extraction:对 privacy textleveltype 三个维度评分。文本 exact match 得 1;非严格类型使用基于 longest common contiguous substring 的 soft token-level F1;password 等严格类型不匹配为 0;level 要 exact match;type 用 label embedding cosine similarity。prediction-reference 通过 greedy one-to-one matching 对齐后计算 precision、recall、F1。
  • Utility / QA:MemPrivacy-Bench short-answer QA 用 GPT-5.2 作为 judge,并报告 BLEU-1、BLEU-2、METEOR、ROUGE-L;PersonaMem-v2 multiple-choice questions 用 exact match。
  • Efficiency:privacy extraction 表报告每条 message 的 inference time;论文指出 PersonaMem-v2 上 MemPrivacy variants 都低于 1 秒,MemPrivacy-Bench 上约 2 秒,而 Gemini-3.1-Pro 等大模型慢 1—2 个数量级。

Training / implementation config

论文 appendix 报告所有 training/evaluation 在单节点 8 × NVIDIA A800-80GB 上进行。SFT 使用 LLaMA-Factory、DeepSpeed ZeRO-3、full-parameter updates、qwen3_nothink template、thinking mode disabled、max sequence length 4096、bf16、per-device batch size 1、gradient accumulation 16、1 epoch、learning rate 、cosine decay、warmup ratio 0.1、log every 10 steps、save every 20 steps。

RL 使用 MS-Swift swift rlhfrlhf_type=grpoadvantage_estimator=grpo、full-parameter bfloat16、vLLM server backend、no dataset/dataloader shuffling、left-side truncation、max input length 4096、max completion length 1536、per-device batch size 1、eval batch size 8、gradient accumulation 8、8 generations per prompt、learning rate 、warmup ratio 0.01、max grad norm 1.0、clip 、KL 、1 epoch、single GRPO update iteration per batch、DeepSpeed ZeRO-2、temperature 1.0、top-、top-、dynamic sampling、最多 3 次 resampling、evaluate/save every 20 steps、log every step、最多保留 3 个 checkpoints。

注意:上述训练超参来自论文 appendix;main@c5ad44a8 的 released repo 未包含对应 training launch scripts。released code 中可复核的 config 是 src/privacy_config.yaml(core 模块默认 max_tokens=8192, temperature=0.0, timeout=120, mask_levels=[PL4, PL3])和 evaluation/eval_config.yamlmemory_llm=gpt-4.1-2025-04-14, answer_llm=gpt-4.1-2025-04-14, judgment_llm=gpt-5.2, embedding model text-embedding-3-small, Mem0 DB path tmp2/mem0_db, privacy store path tmp2/privacy_store)。

5. Experimental Results (实验结果)

5.1 Privacy extraction:小模型优于大通用模型

主表显示 MemPrivacy-specialized models 在 MemPrivacy-Bench 和 PersonaMem-v2 上都显著优于通用 LLM 与 OpenAI-Privacy-Filter。关键数字如下:

ModelMemPrivacy-Bench F1 / P / R / TimePersonaMem-v2 F1 / P / R / Time
Qwen3-4B59.34 / 57.29 / 66.78 / 2.72s86.36 / 86.38 / 86.99 / 0.64s
GPT-5.268.99 / 65.40 / 78.13 / 4.62s88.06 / 87.70 / 89.48 / 3.23s
DeepSeek-V3.2-Think75.04 / 76.46 / 76.13 / 96.14s92.18 / 92.16 / 92.84 / 39.60s
Gemini-3.1-Pro78.41 / 78.66 / 81.22 / 32.87s86.59 / 86.68 / 86.82 / 29.21s
OpenAI-Privacy-Filter35.50 / 39.96 / 34.30 / 0.34s85.27 / 85.80 / 85.75 / 0.24s
MemPrivacy-4B-SFT85.64 / 87.45 / 86.04 / 2.64s94.43 / 94.52 / 95.00 / 0.67s
MemPrivacy-4B-RL85.97 / 86.86 / 87.15 / 2.05s94.48 / 94.54 / 95.11 / 0.44s

最重要的对比是 Qwen3-4B base model 到 MemPrivacy-4B-RL:MemPrivacy-Bench F1 从 59.34% 提升到 85.97%,说明 SFT+RL 不只是换 prompt,而是真正把模型对 privacy spans、levels、types 的结构化识别能力训练出来。MemPrivacy-4B-RL 比 Gemini-3.1-Pro 的 F1 更高,同时速度从 32.87s 降到 2.05s;在 PersonaMem-v2 上速度为 0.44s,满足更接近 on-device/edge 的延迟需求。

5.2 LLM-as-a-Judge evaluation:外部评判器也认可专用模型

在 MemPrivacy-Bench 上,三种 judge backbone 下 MemPrivacy-4B-RL 都是最佳:

ModelGLM-5.1 judgeDeepSeek-R1-0528 judgeQwen3-235B-A22B judge
GPT-5.266.5467.9469.30
DeepSeek-V3.2-Think70.0072.0773.02
Gemini-3.1-Pro76.1577.0278.60
MemPrivacy-0.6B-SFT79.8281.1581.35
MemPrivacy-4B-SFT82.9884.1884.18
MemPrivacy-4B-RL83.8584.7585.09

这说明 domain-specific privacy alignment 的收益大于单纯模型规模:最小的 MemPrivacy-0.6B-SFT 已超过最强通用 baseline Gemini-3.1-Pro,4B-RL 进一步提升。

5.3 Memory utility:PL2—PL4 全保护时损失仍很小

三种 memory systems 上,MemPrivacy 的 utility loss 明显低于两类 masking baseline。下面列出最关键的 accuracy(括号是相对 no-protection 的变化):

SystemMethod / levelMemPrivacy-Bench AccuracyPersonaMem-v2 Accuracy
LangMemNone65.37 (+0.00)50.98 (+0.00)
LangMemIrreversible PL2—PL438.70 (-26.67)38.01 (-12.97)
LangMemGeneric placeholder PL2—PL458.70 (-6.67)48.31 (-2.67)
LangMemMemPrivacy PL2—PL464.07 (-1.30)49.38 (-1.60)
LangMemMemPrivacy PL465.28 (-0.09)50.80 (-0.18)
Mem0None68.62 (+0.00)55.42 (+0.00)
Mem0Irreversible PL2—PL426.75 (-41.87)44.05 (-11.37)
Mem0Generic placeholder PL2—PL463.90 (-4.72)46.71 (-8.71)
Mem0MemPrivacy PL2—PL467.89 (-0.73)54.71 (-0.71)
Mem0MemPrivacy PL468.29 (-0.33)55.42 (+0.00)
MemobaseNone38.62 (+0.00)54.35 (+0.00)
MemobaseIrreversible PL2—PL421.63 (-16.99)46.18 (-8.17)
MemobaseGeneric placeholder PL2—PL433.90 (-4.72)48.49 (-5.86)
MemobaseMemPrivacy PL2—PL437.89 (-0.73)53.11 (-1.24)
MemobaseMemPrivacy PL438.54 (-0.08)53.46 (-0.89)

论文强调,当保护所有 PL2—PL4 privacy content 时,MemPrivacy 在 MemPrivacy-Bench 和 PersonaMem-v2 上的 accuracy drop 只有 0.71%—1.60%;只保护 PL4 时 drop 低于 0.89%。与此相比,irreversible masking 会造成最大损失,例如 Mem0 上 MemPrivacy-Bench accuracy 从 68.62 掉到 26.75(-41.87)。

Figure 3 解读:横轴表示 privacy-related questions 的比例,从 0% 的纯非隐私问题到 100% 的全隐私相关问题;纵轴是三种 memory systems 的 overall accuracy。随着问题越来越依赖 privacy-bearing content,MemPrivacy 与 baseline 的差距扩大,因为 typed placeholders 仍保留了 semantic role,而 irreversible masking 和 generic masking 越来越难支持检索与回答。

5.4 Ablation / component interpretation

论文的 ablation 主要体现在三组替换:

  • SFT vs SFT+RL:MemPrivacy-4B-SFT 在 MemPrivacy-Bench F1 为 85.64,4B-RL 为 85.97;PersonaMem-v2 F1 从 94.43 到 94.48。提升幅度不夸张,但 RL 让 recall 和 judge scores 更稳,4B-RL 在三种 LLM judge 上均为最佳。
  • Type-aware vs generic placeholder:以 LangMem PL2—PL4 为例,generic placeholder 在 MemPrivacy-Bench accuracy 为 58.70,MemPrivacy 为 64.07;PersonaMem-v2 为 48.31 vs 49.38。Mem0 上差距更大:63.90 vs 67.89,46.71 vs 54.71。说明“保留类型”比“只保留有隐私”更能支撑 memory retrieval。
  • MemPrivacy extractor vs general LLM extractor:在 Mem0 + PL2—PL4 下,用 DeepSeek-V3.2-Think 或 GPT-5.2 作为 extractor 时 MemPrivacy-Bench accuracy 分别只有 37.58 和 32.21,而用 MemPrivacy Model 为 67.89;ROUGE-L 也从 18.46 / 16.56 提升到 23.78。这说明整体 framework 很依赖高精度 privacy extraction,不能只靠大通用模型 prompt。

5.5 Limitations and practical caveats

论文没有单独列出 limitations section,但从实验和 released code 可以看到几个实际边界:

  • 依赖 privacy extraction 准确率:漏检会把 raw private value 送上云端;误检或过度遮蔽会损伤 utility。实验中换成通用 LLM extractor 后 utility 明显下降,说明 extractor 是系统瓶颈。
  • 本地映射表成为安全关键点:MemPrivacy 把 raw value 留在 local SQLite;这降低云端暴露,但要求本地设备、DB 加密、备份和删除策略足够可靠。
  • 训练复现信息不完整:paper appendix 给出 SFT/GRPO 超参,但 main@c5ad44a8 未发布实际 training launch scripts,未来复现需要作者补齐训练配置或 checkpoints 的完整 provenance。
  • 数据以 synthetic profiles 为主:MemPrivacy-Bench 覆盖高密度 privacy cases,适合作 stress test;真实用户对 privacy level 的主观偏好和跨文化差异仍可能需要额外校准。

5.6 Overall conclusion

MemPrivacy 的结果说明:对 cloud agent memory 来说,最有效的隐私保护不一定是把内容抹掉,而是把“原始值”限制在本地,把“类型语义”安全地暴露给云端。凭借 typed placeholders、local restoration、PL2—PL4 policy control 和专门训练的 privacy extractor,MemPrivacy 在强隐私保护下把多个 memory systems 的 utility loss 控制在约 1% 量级,同时显著优于通用 LLM 和传统 masking baseline。