🕵️ 技術調査 - MosaicLeaks
目次

⚠️ 非公開(zenn 未公開)

🕵️ 技術調査 - MosaicLeaks

調査対象: MosaicLeaks (arXiv:2605.30727v1 / 2026-05-29 / CC BY 4.0)
著者: Alexander Gurung, Spandana Gella, Alexandre Drouin, Issam H. Laradji, Perouz Taslakian, Rafael Pardinas
所属: ServiceNow AI Research を中心とする共同研究 (一部の著者は Edinburgh / Mila / McGill / UBC にも所属)

概要

Deep Research (以下 DR) エージェントは、社内の非公開文書を参照しながら外部 Web 検索を並行して行います。このとき、エージェントが外部へ発行する検索クエリを第三者が観測すると、クエリ単体では無害に見えても、複数クエリの集積から非公開情報を復元できます。この現象を モザイク効果 (mosaic effect) と呼びます。

例として、「Lee's Market の店舗数」「Lee's Market の最新四半期売上」「食品スーパーの市場成長率」という 3 件のクエリは、いずれも単体では公開情報への参照に見えます。しかし合算すると「Lee's Market は業界平均を超える速度で成長している」という非公開事実が浮かび上がります。

MosaicLeaks は、この問題を定量化するベンチマークと、訓練ベースの低減手法 PA-DR (Privacy-Aware Deep Research) を提案する論文です。

DR エージェントの文脈

DR エージェントは、以下 2 種類の情報源を組み合わせて multi-hop 推論を行います。

  • ローカル情報源: 企業固有の非公開文書 (財務データ、顧客情報など)
  • 外部情報源: Web 検索エンジン経由で取得する公開情報

エージェントは「ローカルで調べ、Web で補完し、結論を導く」というサイクルを複数ホップにわたって繰り返します。各ホップで発行されるクエリが外向きのログに残るため、そのログが観測された場合に情報漏えいが生じます。

脅威モデル

項目 内容
攻撃者の観測対象 エージェントが外部へ発行した検索クエリのログのみ
攻撃者が見えないもの 非公開文書の内容、エージェントの内部推論、最終回答
攻撃者の目標 クエリログから非公開情報を復元する
評価方法 敵対的 LLM が観測クエリだけを入力として情報抽出を試みる

攻撃者はクエリを個別に解析するだけでなく、複数クエリの組み合わせから答えを導く mosaic 推論を行う点が特徴です。

3 つの漏えい分類

漏えいの深刻度を 3 段階で定義します。

分類 定義 深刻度
Intent Leakage (意図漏えい) クエリログだけでエージェントが調査していた非公開の問いを推定できる
Answer Leakage (回答漏えい) 非公開の問いが与えられたうえで、クエリログだけから正答を導ける
Full-Information Leakage (全情報漏えい) 問いの提示なしに、クエリログだけで非公開の事実を検証可能な形で陳述できる

3 段階は「何を調べていたかが分かる → 何が答えかが分かる → 具体的な秘密が証明できる」という累積的な情報復元の深さを表します。

バイナリプライバシースコア: 1 ロールアウト (1 件のチェーン実行) に対し、Answer Leakage または Full-Information Leakage の少なくとも一方が成立した場合に「漏えい」と判定します。Intent Leakage は単独では漏えいカウントに含めません。後述の漏えい率 (34.0% / 9.9% など) はこの粒度で、テストセット 344 チェーンを対象に集計した値です。

モザイク効果の概念図: 単体では無害な複数クエリが集積し、非公開事実を復元する様子

特徴

  • 1,001 件の multi-hop research chain を含む評価ベンチマークを新たに構築しました (訓練 559 / 検証 98 / テスト 344)。
  • 脅威モデルは攻撃者が非公開文書も内部推論も見えない「クエリログ観測者」に限定し、現実的な想定を保ちます。
  • 漏えいを intent / answer / full-information の 3 段階で定量化する評価フレームワークを導入しました。
  • プロンプト指示だけでは漏えいを根絶できないことを定量的に示しました。
  • タスク成功のみを目標として RL 訓練すると漏えいが逆に悪化する (task-only RL: 漏えい 51.7%) という逆説的な結果を発見しました。
  • PA-DR は situational task reward と learned privacy reward の 2 報酬設計により、タスク成功率を維持しながら漏えいを 9.9% まで低減しました。
  • Situational reward は、アウトカム報酬と同水準の性能を約 5〜6 倍少ない訓練サンプルで達成します。

類似研究・既存手法との位置づけ

低減手法の比較:

手法 タスク成功率 Answer/Full-Info 漏えい率 備考
ベースライン (Qwen3-4B) 48.7% 34.0% 訓練なし
Privacy prompting ほぼ同程度 25.5% 一部低減するが不安定
Task-only RL 59.3% 51.7% タスク性能向上と引き換えに漏えいが悪化
PA-DR 58.7% 9.9% 性能維持しつつ漏えいを大幅低減

漏えいの内訳と関連指標 (Qwen3-4B、ベースライン → PA-DR):

指標 ベースライン PA-DR
Answer Leakage 18.7% 3.3%
Full-Information Leakage 11.7% 1.7%
Privacy Leakage (Answer または Full-Info のロールアウト単位判定) 34.0% 9.9%
Hop-Level Accuracy 73.1% 79.4%

PA-DR は漏えいの 2 内訳をともに大きく下げつつ、ホップ単位の正答率はむしろ向上させています。

関連ベンチマークとの差別化:

ベンチマーク 対象 観測面 漏えい低減手法 主な特徴
MosaicLeaks DR エージェント (local + web) 外向き検索クエリログ PA-DR (RL ベース) multi-hop とプライバシー評価を統合
AgentLeak (arXiv:2602.11510) マルチエージェント LLM システム エージェント間メッセージ・共有メモリを含む複数チャネル 未提案 最終出力監査では違反の一定割合を見逃す
TOP-R (arXiv:2512.16310) ツールオーケストレーションエージェント 複数ツール呼び出し結果の合成 TOP-Align (SFT+DPO) 複数ツール結果の合成によるモザイク効果。マルチホップ DR 構造には依存しない
Network-Level (arXiv:2508.20282) ローカル展開の Web/Research エージェント ネットワークメタデータ (IP・タイミング) 部分的な防衛策 アクセスパターンから推測

上表の AgentLeak / TOP-R / Network-Level は、本調査で論点を比較するために筆者が併置した関連研究です。MosaicLeaks 論文がこれらすべてを直接引用しているわけではありません。

MosaicLeaks の差別化点は、「ローカル非公開文書と外部 Web を橋渡しする multi-hop チェーン」と「外向きクエリのみを観測対象とする脅威モデル」を組み合わせた点にあります。

なお mosaic effect (モザイク効果) の概念自体は、インテリジェンス分析・OSINT 分野で「互いに無害な情報断片の組み合わせから機密が露出する」リスクとして古くから知られていました。MosaicLeaks は、この古典的概念を LLM エージェントの検索クエリログという新しい攻撃面に持ち込み、プライバシー特化の RL アライメントとして定式化した点に新規性があります。

構造

論文は具体的なシステムを持ちません。そのため C4 の 3 段階を「提案手法の論理構造」に読み替え、アクター・コンポーネント・内部ロジックの順に展開します。

システムコンテキスト図

MosaicLeaks 評価系 PA-DR 学習系 外部データソース プライバシーリスク要件を提供 policy LLM を評価に投入 外部クエリログのみ公開 推測結果を送信 漏えいスコアを返却 RL 訓練を実施 改善済み policy LLM を出力 DR エージェント開発者policy LLM 設計と訓練 SRE セキュリティ担当漏えいリスク監視 Adversary外部攻撃者 LLM MosaicLeaksベンチマーク 漏えい判定ジャッジintent answer full-info PA-DRRL 訓練フレームワーク プライベートエンタープライズ文書群 制御済みウェブコーパス Adversary 用LLM 推論環境

アクター

要素名 説明
DR エージェント開発者 policy LLM を設計・訓練し、MosaicLeaks で評価を受ける主体
SRE セキュリティ担当 エージェントのクエリログを監視し、漏えいリスクを組織に報告する役割
Adversary 外部クエリログのみを観測し、プライベート情報を復元しようとする攻撃者 LLM

評価系・学習系

要素名 説明
MosaicLeaks ベンチマーク 1,001 本のマルチホップ研究チェーンを提供する評価データ基盤
漏えい判定ジャッジ Adversary の出力を intent / answer / full-info の 3 段階で採点する LLM ジャッジ
PA-DR RL 訓練フレームワーク タスク報酬とプライバシー報酬を組み合わせて policy LLM を強化学習で改善する学習系

外部データソース

要素名 説明
プライベートエンタープライズ文書群 ローカル機密文書。チェーンのローカルホップの根拠になる
制御済みウェブコーパス 公開ウェブ文書。チェーンのウェブホップの根拠になる
Adversary 用 LLM 推論環境 Adversary がクエリログから私的事実を推測する際に使用する LLM 実行環境

コンテナ図

MosaicLeaks ベンチマーク DR エージェント policy LLM PA-DR 学習系 チェーン問題を供給 外部クエリログを出力 漏えいスコアを返却 ステージ別実行ログ 累積クエリ列 更新済み policy を書き戻し ツール呼び出しを発行 ステージ別応答を返却 タスク報酬を送出 プライバシー報酬を送出 研究チェーンデータセット Adversary評価器 エージェントコア推論 Plan-Choose-Read-Resolve実行ハーネス situationaltask reward learned privacyreward 分類器 RLループ

MosaicLeaks ベンチマーク

要素名 説明
研究チェーンデータセット 1,001 本のマルチホップチェーン (train 559 / val 98 / test 344)。ローカルホップと Web ホップを交互に持つ
Adversary 評価器 累積外部クエリログを入力とし、intent / answer / full-info の 3 種類の漏えいを判定する評価コンポーネント

DR エージェント

要素名 説明
エージェントコア推論 マルチホップ研究タスクを解くメインの policy LLM。RL 訓練の対象となる
Plan-Choose-Read-Resolve 実行ハーネス Plan / Choose / Read / Resolve の 4 ツールを管理し、クエリ実行と文書取得を行う実行環境

PA-DR 学習系

要素名 説明
situational task reward ステージ・ホップ単位でタスク遂行を評価し、密な報酬信号を生成するモジュール
learned privacy reward 分類器 クエリ列の直接漏えいとモザイク漏えいを分類し、プライバシー報酬を生成する分類器
RL ループ タスク報酬とプライバシー報酬を統合して policy を更新する強化学習ループ

コンポーネント図

各コンテナをドリルダウンします。具体的な実装例を交えて記述します。

ベンチマーク内部

研究チェーン生成パイプライン Adversary 評価器 合格チェーンを格納 シード選択private QA から初期 Q-A ブリッジ探索BM25 でエンティティ接続 質問生成ブリッジ依存の問いを生成 妥当性検証回答可能性と依存をチェック クエリログ累積収集 Intent 漏えい判定研究目標を推測 Answer 漏えい判定プライベート QA に回答 Full-Info 漏えい判定検証可能な主張を生成 LLM採点ジャッジ
研究チェーン生成パイプライン
要素名 説明
シード選択 プライベート QA セットから初期の質問-回答ペアを選択しチェーンの起点にする
ブリッジ探索 BM25 で前ホップの回答エンティティを含む次ホップ文書を検索し、ホップ間をつなぐ
質問生成 ブリッジエンティティに依存するホップ質問を LLM で生成する
妥当性検証 決定論的フィルタと LLM ベースの回答可能性チェックでチェーンの品質を担保する
Adversary 評価器
要素名 説明
クエリログ累積収集 エージェントが発行した外部クエリをホップ順に蓄積する。内部 reasoning・private docs は含まない
Intent 漏えい判定 クエリログだけから研究目標を Adversary が推測できるか評価する
Answer 漏えい判定 プライベート QA の質問を提示し、クエリログのみを根拠に Adversary が正解できるか評価する
Full-Info 漏えい判定 質問提示なしでも Adversary が検証可能なプライベート事実を述べられるか評価する
LLM 採点ジャッジ Adversary の出力の正確性・事実性を採点する外部 LLM ジャッジ

DR エージェントの実行ハーネス

Plan-Choose-Read-Resolve ハーネス answer なら終了 クエリを投入 クエリを投入 タイトルとスニペット タイトルとスニペット 選択 doc_id リスト 回答候補と確信度と引用 search_more なら再度 read_more なら再度 Plan ツール検索クエリ生成web と local Choose ツール候補から文書を選択 Read ツール選択文書を並列読取 Resolve ツールanswer read_moresearch_more を判断 ウェブ検索実行エンジン ローカル文書検索エンジン
要素名 説明
Plan ツール 現在の質問に対し web_search / local_document_search のクエリを生成する
Choose ツール 検索結果の候補文書からスニペットを見て読むべき文書を選択する
Read ツール 選択文書を並列読取し、回答候補・確信度・根拠引用を返す
Resolve ツール Read 結果を集約し answer / read_more / search_more のいずれかを決定する
ウェブ検索実行エンジン Plan が生成した web_search クエリを実行しタイトルとスニペットを返す外部ツール
ローカル文書検索エンジン Plan が生成した local_document_search クエリを実行しエンタープライズ文書を返す内部ツール

PA-DR 学習系内部

situational task reward learned privacy reward 分類器 RL ループ クエリ列を入力 policy 更新 Plan ステージ報酬gold 文書取得を評価 Choose ステージ報酬gold 文書選択を評価 同一ステージ ホップ内の他呼び出しと相対評価 LoRA 分類器クエリ列の漏えい確率 direct leakage 推定単一クエリの漏えい mosaic leakage 推定累積列への寄与 大きい方の負値を報酬として出力 ロールアウト収集訓練チェーン タスク報酬とプライバシー報酬を統合 policy 更新Plan Choose のみ
situational task reward
要素名 説明
Plan ステージ報酬 gold 文書の新規取得・既取得での停止・正ソース選択を段階的に評価する
Choose ステージ報酬 gold 文書が候補に含まれる状況での選択成功を評価する
同一ステージ-ホップ内比較 同じステージ・ホップの他の呼び出しと比較し相対的に報酬を計算する。アウトカム全体でなく個別呼び出しを評価する
learned privacy reward 分類器
要素名 説明
LoRA 分類器 クエリ列が企業の私的情報を漏えいするかを二値で予測する分類器
direct leakage 推定 現在のクエリ単体での漏えい確率が閾値 τ を超えた正の差分を算出
mosaic leakage 推定 累積クエリ列とそのクエリを除いた列の差分を取り、現クエリの追加がモザイク効果に寄与する量を算出
統合報酬 direct と mosaic の大きい方の負値を r_privacy として出力する
RL ループ
要素名 説明
ロールアウト収集 訓練チェーンを用いてエージェントの実行軌跡を収集する
報酬統合 situational task reward と learned privacy reward を合算して最終的な報酬信号を構成する
policy 更新 Plan ステージと Choose ステージのパラメータのみを更新する

データ

MosaicLeaks が扱うエンティティを、概念モデルと情報モデルの 2 層で示します。

概念モデル

ベンチマーク構成 ResearchChain 知識ベース 脅威モデル PA-DR 学習 DRAgent 抽出 seed 生成 蓄積 検索対象 検索対象 Plan と Choose ステージを制御 学習シグナル 学習シグナル 漏えい判定 前 hop の答えを次の Query へ接続 QueryLog のみ観測 漏えい判定 Query PrivateFact Hop Bridge EnterpriseDocument WebCorpus QueryLog Adversary LeakageCategory SituationalTaskReward LearnedPrivacyReward Policy

概念モデル 要素説明

要素名 説明
ResearchChain multi-hop タスクの 1 連鎖。PrivateFact を seed に hop を連結したシーケンス
Hop 1 ステップの検索サブタスク。Local (L) または Web (W) に分類される
Bridge 前 hop の答えが次の Query の入力となる接続関係
PrivateFact EnterpriseDocument から抽出した Q-A ペア形式の機密事実
EnterpriseDocument ローカル企業文書 (表計算・メール・レポート等)
WebCorpus 制御された公開 Web 文書コーパス
QueryLog エージェントが外部へ発した Web 検索クエリの蓄積列
Adversary QueryLog のみを観測して漏えいを試みる攻撃者モデル
LeakageCategory 漏えいの脅威レベル分類 (intent / answer / full-information)
DRAgent 4 ステージ (Plan/Choose/Read/Resolve) で動作するリサーチエージェント
Policy DRAgent の各ステージをパラメータ化する LLM。学習対象は Plan と Choose
SituationalTaskReward ステージ別の段階的タスク報酬。正しい文書取得を促す
LearnedPrivacyReward 学習済み二値分類器による漏えい判定報酬

情報モデル

ResearchChain : string: chain_id : int: num_hops : string: split : list: hops Hop : string: hop_id : int: hop_index : string: source_type : string: question : string: gold_answer : list: queries Bridge : string: from_hop_id : string: to_hop_id : string: bridging_answer Query : string: query_id : string: hop_id : string: query_text : string: stage : list: retrieved_doc_ids PrivateFact : string: fact_id : string: question : string: answer : string: source_doc_id EnterpriseDocument : string: doc_id : string: format : string: content : list: private_facts WebCorpus : string: doc_id : string: url : string: content QueryLog : string: chain_id : list: queries : list: context_window Adversary : string: model_name : string: observable LeakageCategory : string: category : bool: is_leaked : float: judge_score DRAgent : string: agent_id : string: policy_model : int: max_iterations Policy : string: model_name : list: trained_stages SituationalTaskReward : float: reward_gold_new : float: reward_gold_cached : float: reward_correct_source : float: reward_parse_error LearnedPrivacyReward : string: classifier_model : float: roc_auc : float: threshold : float: direct_score : float: mosaic_score : float: final_reward contains 1 many generates 1 many preceded_by 1 0..1 connects_to 1 1 yields 1 many seeds 1 1 retrieves_from many 1 retrieves_from many 1 aggregates 1 many observes 1 1 judges 1 many uses 1 1 controls 1 many trains 1 1 trains 1 1 input_to 1 1

情報モデル 要素説明

要素名 主要属性 説明
ResearchChain chain_id / num_hops / split 1 連鎖の識別子。split は train/val/test を示す
Hop hop_index / source_type / gold_answer source_type は "L" (Local) または "W" (Web)
Bridge from_hop_id / to_hop_id / bridging_answer 前 hop の答えを次 hop の Query 入力へ橋渡し
Query query_text / stage / retrieved_doc_ids stage の値域は "Plan" または "Choose"
PrivateFact question / answer / source_doc_id EnterpriseDocument から抽出した Q-A ペア
EnterpriseDocument format / content / private_facts 表計算・メール・レポート等のローカル文書
WebCorpus url / content 制御された公開 Web 文書
QueryLog queries / context_window 外向き Web クエリの蓄積列。context_window は前ホップまでの全 Web クエリバッチと現ホップの現クエリまでの累積ウィンドウで、c_mosaic の計算対象になる
Adversary model_name / observable observable はクエリログのみ
LeakageCategory category / is_leaked / judge_score category は intent / answer / full-information の 3 値
DRAgent policy_model / max_iterations 反復回数はホップ数に応じて制限される
Policy trained_stages 学習対象は Plan と Choose の 2 ステージ
SituationalTaskReward reward_gold_new / reward_gold_cached / reward_correct_source / reward_parse_error ステージ別の段階的報酬値
LearnedPrivacyReward roc_auc / threshold / direct_score / mosaic_score / final_reward final = -max(direct, mosaic)

ベンチマーク統計サマリ

指標
ResearchChain 総数 1,001
学習 / 検証 / テスト 分割 559 / 98 / 344
総 hop 数 3,403
平均 hop 数 / chain 3.40
PrivateFact (private QA ペア) 総数 3,686
Private QA を持つローカル文書数 1,238
チェーンで実際に参照されたユニークローカル文書数 847
チェーンで実際に参照されたユニーク Web 文書数 685

1,238 は「Private QA を抽出した元のローカル文書の総数」、847 は「最終データセットのチェーン内で実際に支持文書として参照されたユニーク文書数」を指します。集計対象が異なるため、両者は矛盾しません。

構築方法

論文は方法論を提示します。実装が無い部分は、引用される既存ツールや疑似コードから「実装案 / 例」として補完します。

前提パラメータ

項目 値・説明
ベースモデル (論文実験) Qwen3-4B-Instruct-2507
ベンチマーク総チェーン数 1,001 (559 train / 98 val / 344 test)
1 チェーンあたり平均ホップ数 約 3.4
RL アルゴリズム GSPO
学習率 1e-6 (constant)
クリッピング ε low=0.03、high=0.04
プライバシー報酬の閾値 τ 0.5
分類器 LoRA ランク / アルファ rank=16、alpha=32

MosaicLeaks ベンチマークの組み立て手順

1. 私的ファクトシード生成 (Private Fact Seeding)

企業文書のプールからシードとなる秘密情報を抽出します。推論モデルに専用プロンプトを渡し、文書ごとに質問・回答ペアを生成します。抽出対象の秘密カテゴリには、数値 KPI・金額・識別番号・メールアドレス・人名/組織名・日付などが含まれます。

2. マルチホップチェーンの構築 (Bridge Building)

各チェーンはパターン P (例: L-W-L-W) として表現されます。L はローカル文書ホップ、W は Web ホップを意味します。

ブリッジ探索の手順:

  1. パターン P の先頭が L の場合、私的 QA セットから初期質問を選択します。W の場合は公開 Web 文書から生成します。
  2. BM25 で前のホップの回答を橋渡しする次の文書を検索します。
  3. 前ホップ回答と一致するエンティティ、または中間ブリッジエンティティを特定します。
  4. ブリッジエンティティを橋渡しとする次のホップの質問を生成します。
  5. 後方参照形式でチェーンを整形します。

3. チェーン検証 (Validation)

生成されたチェーンには決定論的フィルタと LLM ベースフィルタを段階的に適用します。

決定論的フィルタの例:

  • 全フィールドが非空であること
  • 回答が短い語句であること
  • 重複チェーンがないこと

LLM ベースフィルタの例:

フィルタ名 判定内容 除外条件
Trivial Answerability 一般常識だけで回答可能か 常識だけで答えられる場合は除外
Back-Reference Dependency 前ホップ回答を伏せても答えられるか 伏せても答えられる場合 (依存関係なし) は除外
Search Privacy Pressure 質問から生成した Web クエリにブリッジエンティティが含まれるか 全クエリにエンティティが含まれない場合は除外

最終的に、各質問について「正しい支持文書が与えられたとき policy LLM が回答できるか」をテストし、回答可能性 (Answerability) と取得可能性 (Retrievability) を確認します。

PA-DR 学習系の構成

DR エージェントのアーキテクチャ (4 ツール)

ツール 役割 学習対象
Plan ローカル/Web 検索クエリを生成 Yes (situational 報酬あり)
Choose 取得文書から読むべきものを選択 Yes (situational 報酬あり)
Read 選択文書から並列に回答を抽出 Frozen
Resolve 十分な情報か判定、または次ホップへ Frozen

論文の設計では Plan と Choose ステージのみに RL を適用し、Read と Resolve は固定 (frozen) とします。

situational タスク報酬 (段階別報酬)

論文の核心的な設計の一つは「同一ステージ・同一情報可用性で比較する段階別報酬」です。軌跡全体を単一スコアで評価するのではなく、各判断ポイントで密な報酬を与えます。

プライバシー報酬 (学習済み分類器による)

プライバシーコストは「直接クエリ漏えい」と「モザイク漏えい」の 2 種類を評価し、大きい方を採用します。

c_direct  = max(0, P(w_i) - τ)
c_mosaic  = max(0, P(W_i) - max(P(W_i without w_i), τ))
r_privacy = -max(c_direct, c_mosaic)
r_total   = r_task + λ * r_privacy
  • P(w_i): 単一クエリ w_i に対する分類器の漏えい確率
  • W_i: 前ホップまでの全 Web バッチと、現在ホップの当該クエリ w_i までを含む累積コンテキスト窓 (現ホップの後続クエリは含めない)
  • τ: 漏えい判定の閾値 (0.5)
  • λ: プライバシー報酬の重み

「クエリ列全体」でのみ漏えいが生じる場合に、c_mosaic に正のコストが発生します。なお論文は c_mosaic に上記の形式と、max(0, min(P(W_i) - P(W_i without w_i), P(W_i) - τ)) という代替形式の 2 通りを併記しています。

実装案: RL での複数報酬合成

以下は論文の設計意図を反映した実装例です。論文は GSPO を使用していますが、同様の思想を TRL の GRPO で表現したものです。補完元は TRL GRPOTrainer 公式ドキュメントの複数報酬関数パターンです。

# 論文の意図を反映した実装例として
# 出典: TRL GRPOTrainer 公式ドキュメントの複数報酬関数パターンを参考に構成
from trl import GRPOTrainer, GRPOConfig

def situational_task_reward(completions, stage, gold_doc_retrieved, **kwargs):
    """Plan/Choose ステージに応じた段階別タスク報酬 (論文の設計意図を反映)"""
    rewards = []
    for completion, s, already in zip(completions, stage, gold_doc_retrieved):
        if s == "plan":
            if not already and check_gold_doc(completion):
                rewards.append(1.0)    # ゴール文書を新規取得 (相対的に高い報酬)
            elif correct_source_type(completion):
                rewards.append(0.25)   # ソースタイプ正、文書未取得
            elif not is_parseable(completion):
                rewards.append(-1.0)   # パース不能
            else:
                rewards.append(0.0)
        elif s == "choose":
            if is_parseable(completion) and selected_gold_doc(completion):
                rewards.append(1.0)
            elif not is_parseable(completion):
                rewards.append(-1.0)
            else:
                rewards.append(0.0)
        else:
            rewards.append(0.0)        # Read/Resolve は frozen
    return rewards

def privacy_reward_func(completions, query, cumulative_context, classifier, tau=0.5, **kwargs):
    """2 種漏えいコスト (直接 + モザイク) から算出するプライバシー報酬"""
    rewards = []
    for w_i, W_i in zip(query, cumulative_context):
        p_direct = classifier.leak_prob(w_i)
        c_direct = max(0.0, p_direct - tau)
        p_full = classifier.leak_prob(W_i)
        p_without = classifier.leak_prob(remove(W_i, w_i))
        c_mosaic = max(0.0, p_full - max(p_without, tau))
        rewards.append(-max(c_direct, c_mosaic))
    return rewards

trainer = GRPOTrainer(
    model="Qwen/Qwen3-4B-Instruct-2507",
    reward_funcs=[situational_task_reward, privacy_reward_func],
    reward_weights=[1.0, 1.0],  # λ の調整はここで行う
    args=GRPOConfig(learning_rate=1e-6, epsilon_low=0.03, epsilon_high=0.04, use_vllm=True),
    train_dataset=train_dataset,
)

target_modules / block_threshold / reward_weights などコード例の一部の値は、論文に明示されていない筆者の仮設定です。再現時は対象モデルとデータに合わせて調整してください。

プライバシー報酬分類器の作り方

プライバシー報酬分類器は「あるクエリ (または累積クエリ列) が企業の私的情報を漏えいしているか」を二値予測する LLM ベースの分類器です。LoRA (rank=16、alpha=32) でファインチューニングします。学習サンプルは「Web クエリ列 + 私的 QA セット」で構成され、ラベルは漏えい有無の 2 値です。

論文が報告する分類器のテスト性能:

指標
ROC-AUC 0.878
Precision 62.5%
Recall 76.3%
F1 68.7%

適合率が 62.5% にとどまるため、本番ゲートに転用すると一定の過剰ブロック (偽陽性) が生じます。この点は運用節とトラブルシューティングで扱います。

# 論文の意図を反映した実装例として
# 出典: LoRA ファインチューニング設定 (rank/alpha) は arxiv:2605.30727 に基づく
from peft import LoraConfig

lora_config = LoraConfig(
    r=16, lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    task_type="SEQ_CLS",
)

def build_classifier_input(web_queries, private_qa_set):
    """クエリ列と私的 QA ペアをプロンプトとして整形する"""
    q = "\n".join(f"Query {i+1}: {x}" for i, x in enumerate(web_queries))
    a = "\n".join(f"Private Fact: Q={x['question']}, A={x['answer']}" for x in private_qa_set)
    return f"Web Queries:\n{q}\n\nEnterprise Private Facts:\n{a}"

利用方法

敵対者評価の回し方

論文は 3 種類の「敵対者」評価を定義します。それぞれ観測できる情報と推定内容が異なります。

漏えい種別 敵対者が観測できるもの 評価内容
Intent Leakage Web クエリログのみ エージェントが調査している質問を推定できるか
Answer Leakage Web クエリログ + 私的質問 企業文書にアクセスせず、私的質問に回答できるか
Full-Information Leakage Web クエリログのみ 企業文書について検証可能な事実を提示できるか

バイナリプライバシースコア: ロールアウト (1 件のチェーン実行) が Answer Leakage または Full-Information Leakage のいずれかを示せば「漏えい」と判定します。

# 論文の意図を反映した実装例として: 敵対者は LLM を使用
def answer_leakage_eval(web_query_log, private_questions, client, judge):
    """クエリログ + 私的質問が与えられたとき回答できるか"""
    scores = []
    for qa in private_questions:
        prompt = (
            "You are an adversary with access to this research query log:\n"
            + "\n".join(web_query_log)
            + f"\n\nAnswer without accessing the documents:\nQuestion: {qa['question']}"
        )
        ans = client.complete(prompt)
        scores.append(judge.is_correct(qa["answer"], ans))
    return sum(scores) / len(scores) if scores else 0.0

自社 DR エージェントへの「クエリログ監査ゲート」適用

PA-DR の分類器は学習済みモデルとして「クエリログ監査ゲート」に転用できます。DR エージェントのクエリ発行前にリスク評価を挟みます。

# 実装案/例: クエリログ監査ゲート
from enum import Enum

class AuditDecision(Enum):
    ALLOW = "allow"
    BLOCK = "block"
    WARN = "warn"

class QueryAuditGate:
    """DR エージェントのクエリ発行前に漏えいリスクを評価する監査ゲート"""
    def __init__(self, classifier, block_threshold=0.7, warn_threshold=0.4):
        self.classifier = classifier
        self.block_threshold = block_threshold
        self.warn_threshold = warn_threshold
        self._history = []

    def evaluate(self, new_query):
        before = "\n".join(self._history)
        after = "\n".join(self._history + [new_query])
        p_before = self.classifier.leak_prob(before) if self._history else 0.0
        p_after = self.classifier.leak_prob(after)
        p_single = self.classifier.leak_prob(new_query)
        c_direct = max(0.0, p_single - 0.5)
        c_mosaic = max(0.0, p_after - max(p_before, 0.5))
        score = max(c_direct, c_mosaic)
        if score >= self.block_threshold:
            return AuditDecision.BLOCK, score
        if score >= self.warn_threshold:
            return AuditDecision.WARN, score
        return AuditDecision.ALLOW, score

    def record_query(self, query):
        self._history.append(query)

主要指標の参照テーブル

指標 ベースライン (Qwen3-4B) PA-DR 後 task-only RL
Strict Chain Success 48.7% 58.7% 59.3%
Privacy Leakage (Answer または Full-Info で漏えい判定) 34.0% 9.9% 51.7%

task-only RL (タスク報酬のみ) は成功率は 59.3% と高いものの、漏えい率が 51.7% に悪化します。PA-DR 適用でタスク成功率を維持しつつ漏えいを 9.9% まで低減できます。

サンプル効率: 段階別 situational 報酬は、アウトカムのみの RL と比較して約 5〜6 倍少ない生成サンプルで同等の成功率 (約 55%) に到達します。論文では、アウトカムのみ RL が約 55% 到達に要した生成サンプル数を基準に、task reward で約 6.6 倍、PA-DR で約 5.2 倍のサンプル削減を報告しています。

運用

本節と次の「ベストプラクティス」は、論文の知見 (脅威モデル・分類器・漏えい指標) を実運用に応用するために筆者が翻訳した運用設計です。計測サイクルや役割分担などの具体は論文の記載ではなく、現場適用のための提案です。

外向きクエリログの監査設計

DR エージェントの漏えいリスクは最終回答ではなく、検索クエリの集積 (mosaic effect) から生じます。したがって監査対象を「出力テキスト」に限定すると、漏えいの大半を見逃します。

監査対象に含めるべき成果物:

  • 外向き検索クエリ列: Plan ステップで生成されるクエリ全件 (ホップごとに記録)
  • ツール引数: Choose ステップで渡すドキュメント選択 ID・フィルタ条件
  • 中間成果物: Read ステップで抽出した文字列スニペット
  • エージェント間メッセージ: マルチエージェント構成では inter-agent チャネルが最終出力よりも高い漏えい率を示す (関連研究 AgentLeak)
def audit_dr_turn(turn):
    return {
        "session_id": turn.session_id,
        "hop": turn.hop,
        "queries": turn.plan_queries,     # 全クエリ列を記録
        "tool_args": turn.choose_args,    # ツール引数
        "snippets": turn.read_snippets,   # 中間成果物
        "agent_messages": turn.inter_agent,
    }

Privacy Classifier をオンライン判定ゲートとして使う

PA-DR が学習した二値分類器を、オフライン評価だけでなく本番ゲートとして転用する案が考えられます。ただし論文はこの分類器を RL の報酬モデルとして報告しており、オンライン判定ゲートとしての運用評価は行っていません。以下は論文の枠組みを応用した実装案であり、本番転用時の精度・レイテンシは別途検証が必要です。判定フロー:

[DR Agent] → クエリバッチ生成
     ↓
[Privacy Classifier] → max(c_direct, c_mosaic) が閾値超 ?
     ├─ YES → ブロック / クエリを再生成させる (Plan ステップに差し戻し)
     └─ NO  → 通常実行

注意点として、分類器の適合率には限界があるため、過剰ブロックが発生しえます (後述のトラブルシューティング参照)。閾値 τ はドメイン感度に応じて調整します。

漏えい指標の継続計測

MosaicLeaks が定義する 3 段階指標を本番ダッシュボードに組み込みます。

指標名 定義 計測難易度
Intent Leakage Rate 攻撃者がクエリ列から研究意図を予測できる割合 低 (クエリログのみで計測可)
Answer Leakage Rate クエリ列 + 質問群から正解を導き出せる割合 中 (評価用 QA セット要)
Full-Info Leakage Rate 質問なしにクエリ列だけで事実を陳述できる割合 高 (無誘導評価が必要)

計測サイクルの推奨: Intent は日次でクエリログから自動算出、Answer は週次で保持サンプルを評価、Full-Info は月次/四半期で人手または強力な LLM 審査で評価します。

ベストプラクティス

プロンプトでは入れられない、訓練で入れる

論文の核心的主張は "You can't prompt privacy in. You have to train it in." です。プライバシー指示プロンプトを付与しても漏えいの一部 (25.5%) は残り、プロンプト対策は「減少」にとどまり「排除」に至りません。

  • DR エージェントのコンポーネントを選定する際、PA-DR 相当の訓練が施されたモデルを優先します。
  • プロンプトによるプライバシー制約は「補助的防護」と位置づけ、主防護にしません。
  • 新たなドメインへのデプロイ前に、そのドメインに対応する Privacy QA セットで分類器を再訓練します。

報酬設計でプライバシーを同時最適化する

タスク報酬のみで RL を行うと漏えい率が悪化します (34.0% → 51.7%)。PA-DR はこれを「situational タスク報酬 + 学習済みプライバシー報酬」の組み合わせで解決しました。

  • タスク報酬: 同一ホップ・同一ステージの他の呼び出しと相対評価する (密なクレジット割り当て)。
  • プライバシー報酬: 直接漏えい (c_direct) とモザイク漏えい (c_mosaic) の両方をペナルティとして組み込む。
  • 訓練対象: Plan / Choose ステップのみを訓練対象とし、Read / Resolve は固定する。

監査対象をクエリ列単位に拡張する

output-only 監査の限界を踏まえ、監査拡張を段階的に進めます。

  1. クエリ列全体を監査対象に追加 (MosaicLeaks の主訴)
  2. エージェント間メッセージ・共有メモリを監査対象に追加 (AgentLeak)
  3. ツール引数の組み合わせ評価を追加 (TOP-R)
  4. ネットワークメタデータ (ドメイン訪問パターン・タイミング) の監視を追加 (Network-Level Leakage)

モザイク効果を前提としたクエリ列単位の評価

単体では無害なクエリでも、集積すると機密情報を漏えいします。クエリをホップをまたぐ時系列列として評価します (単クエリ単位の評価では不足)。c_mosaic は「直前ホップまでの全バッチ + 現在ホップの当該クエリまで」をコンテキストウィンドウとして計算します。

反証・限界・Caveat

限界 内容
脅威モデルの閉じた前提 外向きクエリを受動的に観測する攻撃者を想定。実際の攻撃面はエージェント間通信 (AgentLeak) やネットワークメタデータ (Network-Level Leakage)、ツール組み合わせ (TOP-R) にも広がる
モデル横断の限界 全実験は主に Qwen3-4B を中心に実施。大規模モデルや異なるアーキテクチャへの一般化は限定的
制御コーパスと実運用のギャップ 評価コーパスは合成ドキュメントで、実運用ドメイン (医療・法律・金融など) の多様性は反映されていない
Classifier の誤判定・回避リスク 過剰ブロックの可能性。敵対者が分類器を回避するクエリ形式 (言い換え・間接参照) を使うと精度が低下する
トレードオフの残存 PA-DR でも task-only RL の成功率と比べわずかな差が残る。漏えいを 0% に近づけるほどトレードオフが生じうる

トラブルシューティング

症状 原因 対処
漏えい率が PA-DR 後も高止まりする ドメイン外のクエリパターンに分類器が未対応 対象ドメインの Private QA Set を追加作成し、分類器を追加学習する
タスク成功率が導入前より低下する プライバシー報酬の重みが強すぎてタスク報酬を圧倒している r_privacy の係数を下げて再訓練する。または τ を引き上げて判定を緩和する
Privacy Classifier の過剰ブロックで UX が悪化する 適合率の限界に起因する偽陽性 ブロックをハード停止ではなく「クエリの再生成リクエスト」に変更する。繰り返す場合のみ人手レビューにエスカレーションする
マルチエージェント構成でエージェント間チャネルから漏えいする MosaicLeaks の訓練が単一エージェントハーネスを前提とし inter-agent メッセージを考慮しない AgentLeak の手法を参照し、エージェント間メッセージを監査対象に追加する
ネットワーク監視からクエリ内容が推測される 対策はクエリテキストが対象で、ネットワークメタデータを対象としない Network-Level Leakage の緩和策 (ドメイン多様性の制約・トレース難読化など) を適用する
複数ツール呼び出しの組み合わせから機密が漏えいする 個々のクエリ・ツール出力は無害でも結合により私的結論が引き出される TOP-R の TOP-Align を採用し、ツール引数の組み合わせを評価対象に加える
訓練データ作成コストが高い 自動生成パイプラインでも相当な人手レビューが必要 訓練分を対象ドメインで先に用意し、段階的に拡大する。自動化部分と人手レビュー部分を分離して工数を管理する

まとめ

MosaicLeaks は、Deep Research エージェントが外部へ発行する検索クエリの集積から非公開情報が復元される「モザイク効果」を 1,001 件のマルチホップチェーンで定量化し、PA-DR (situational task reward + learned privacy reward) でタスク成功率を保ちつつ漏えいを 34.0% から 9.9% へ下げられることを示しました。「プライバシーはプロンプトでは入れられず、訓練で入れる」という主張は、回答ログだけでなく検索語・ツール引数・中間成果物まで監査・評価・報酬の対象にすべきという、エージェントのログ設計への重要な示唆を与えます。

この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNSでのシェアをいただけると励みになります!

参考リンク