TL;DR
PrivacyChecker — техника промптинга, которая заставляет LLM явно анализировать каждый поток информации перед ответом. Вместо общей инструкции "будь осторожен с приватными данными" модель получает структурированный чек-лист: кто отправитель, кто получатель, какие данные, можно ли передавать.
LLM знают что информация приватная (в 98% случаев правильно определяют), но всё равно сливают её в 33% случаев. Причина: модель сосредоточена на выполнении задачи ("отправить письмо", "ответить коллеге") и не включает проверку приватности в процесс генерации. В chain-of-thought модель рассуждает "вся информация релевантна, напишу письмо", полностью игнорируя что среди данных есть SSN, медицинские записи или финансовые детали.
PrivacyChecker решает проблему через трёхшаговый промпт: (1) извлечь все информационные потоки из контекста, (2) оценить каждый поток — Yes/No с обоснованием, (3) использовать только потоки с Yes в финальном ответе. Это превращает абстрактную инструкцию "соблюдай приватность" в конкретный контрольный список перед каждым действием агента.
Схема метода
Все 3 шага выполняются в одном промпте:
ШАГ 1: Information Flow Extraction → список потоков в JSON
Для каждого потока: отправитель, получатель, тип данных, субъект, принцип передачи
ШАГ 2: Privacy Judgment Per Flow → (A) Yes или (B) No для каждого потока
Оценка: можно ли передать эти данные этому получателю в этом контексте?
ШАГ 3 (опционально): Privacy Guideline → общие правила поведения
Например: "не раскрывай медицинские данные коллегам"
ФИНАЛ: Используй только потоки с оценкой (A) в ответе
Пример применения
Задача: Ты работаешь в российском стартапе. Коллега просит прислать "обновление по проекту". У тебя в истории переписки есть: (1) общий статус проекта для команды, (2) зарплаты сотрудников из бухгалтерии, (3) личные медицинские справки коллег.
Промпт:
Перед тем как ответить коллеге, проанализируй информационные потоки:
ШАГ 1 — Извлеки потоки:
Для каждого типа информации определи:
- Тип данных (например: "статус проекта", "зарплата", "медсправка")
- Субъект (о ком данные)
- Отправитель (откуда данные)
- Получатель (кому отправляю)
- Принцип передачи (зачем передаю)
ШАГ 2 — Оценка каждого потока:
Можно ли передать эти данные этому получателю в этом контексте?
(A) Yes — можно
(B) No — нельзя
ШАГ 3 — Финальный ответ:
Включи только потоки с оценкой (A).
Задача: Ответь коллеге Максиму на запрос "пришли обновление по проекту".
Контекст: [твоя история переписки]
Результат: Модель выдаст анализ из 3 потоков: статус проекта получит (A), зарплаты и медсправки — (B). В финальном письме Максиму будет только статус проекта, без чисел из бухгалтерии и личных данных. Если PrivacyChecker не используется — модель часто сливает всё, потому что "всё релевантно для обновления".
Почему это работает
Слабость LLM: Модели путают "знание что приватно" и "действие согласно этому знанию". В chain-of-thought видно: "это SSN" → "SSN приватен" → "но мне надо ответить на запрос" → включает SSN в ответ. Абстрактная инструкция "соблюдай приватность" теряется под напором task completion.
Сильная сторона LLM: Модели отлично следуют структурированным чек-листам. Если дать схему "1-2-3, оцени каждый пункт", модель методично проходит по списку. Это как разница между "будь внимателен" (игнорируется) и "проверь пункты A, B, C по очереди" (выполняется).
Механизм: PrivacyChecker превращает моральное правило ("не раскрывай приватное") в процедурный чек-лист ("для каждого факта: откуда, кому, можно?"). Модель вынуждена вербализовать оценку каждого потока — это активирует privacy reasoning вместо того чтобы оставить его фоновым и игнорируемым.
Рычаги управления:
- Убрать вербализацию ("оцени молча") → качество падает с 8.32% до 11.36% утечек — явное проговаривание критично
- Изменить Privacy Guideline → адаптировать под свои правила (HIPAA для медицины, GDPR для Европы, корпоративные политики)
- Жёсткость критериев → можно требовать "только публичные данные" или наоборот "можно всё кроме PII"
Шаблон промпта
Перед финальным ответом проанализируй информационные потоки:
ШАГ 1 — Information Flow Extraction:
Для каждого типа информации в контексте определи:
{
"тип_данных": "что это за данные",
"субъект": "о ком данные",
"отправитель": "откуда данные",
"получатель": "кому отправляю",
"принцип_передачи": "зачем передаю"
}
Создавай отдельные потоки для:
- Разного времени (вчера vs сегодня)
- Разных людей (данные Ивана vs данные Марии)
- Разных целей (для отчёта vs для личного использования)
ШАГ 2 — Privacy Judgment:
Для каждого потока оцени: можно ли передать эти данные этому получателю?
Критерии:
- Только необходимое для задачи
- Соответствует социальному контексту (коллега vs публика)
- Не нарушает доверие субъекта данных
Ответ: (A) Yes или (B) No + краткое обоснование
ШАГ 3 — Финальный ответ:
Используй только потоки с оценкой (A).
Для потоков с (B) — либо вообще не упоминай, либо замени на обобщение.
Задача: {твоя_задача}
Получатель: {кому_отправляешь}
Контекст: {доступные_данные}
Что подставлять:
{твоя_задача}— "ответить на письмо", "составить отчёт", "написать пост"{кому_отправляешь}— "коллега Максим", "клиент ИП Сидоров", "публичный канал в Telegram"{доступные_данные}— история переписки, заметки, документы
🚀 Быстрый старт — вставь в чат:
Вот шаблон PrivacyChecker для защиты приватности. Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит: кому отправляешь? какие данные доступны? какой уровень приватности нужен? — чтобы правильно настроить извлечение потоков и критерии оценки. Она возьмёт паттерн из шаблона и адаптирует под контекст.
Ограничения
⚠️ Сложные многоинструментные цепочки: При использовании 3+ инструментов (Gmail + Calendar + Notion) утечки растут с 8% до 16%. Модель теряет контекст при длинных траекториях с неудачными вызовами инструментов — недостаточно информации для правильного анализа потоков.
⚠️ Residual leakage 7-8%: Основные причины оставшихся утечек: (1) неправильная оценка потока (модель решила что "можно"), (2) judge-action gap (правильно оценила, но всё равно слила), (3) пропущенный поток при извлечении. Reasoning-модели (DeepSeek-R1, o1) показывают лучше, но не идеально.
⚠️ Токены: Каждая проверка добавляет ~300-500 токенов на анализ потоков. Для простых задач ("какая столица Франции?") это overkill. Используй только когда реально работаешь с приватными данными.
Как исследовали
Исследователи взяли 493 кейса из PrivacyLens (статичный бенчмарк) и проверили 8 моделей: GPT-4o/4.5/o1, DeepSeek-R1, Qwen3-8B/14B (обычные и reasoning-версии). Baseline — просто добавить в промпт "соблюдай приватность". Удивительная находка: модели отлично отвечают на вопросы "это приватно?" (98% точность), но провально ведут себя в действии (33% утечек). Это judge-action gap — знаю, но не делаю.
Потом построили live-бенчмарк с MCP (Model Context Protocol) и A2A (Agent2Agent). Вместо статичных диалогов — реальные агенты, которые читают Gmail, Notion, общаются друг с другом. Результат: утечки выше в live (26% vs 17% в статике), потому что траектории зашумлены — агент делает лишние вызовы инструментов, получает частичную информацию, теряет контекст.
Ключевой инсайт: information noise — главный враг приватности в реальных агентах. Когда агент получает не всю информацию (failed tool calls, неполные результаты), он додумывает и часто додумывает приватное. PrivacyChecker помогает, но не идеально — в сложных цепочках (3+ инструмента) утечки растут вдвое.
Ablation study показала: (1) без вербализации (молчаливая оценка) — качество падает в 2-3 раза, (2) с ground-truth потоками вместо model-extracted — утечки снижаются вдвое (значит проблема в извлечении, не в оценке), (3) добавление Privacy Guideline даёт небольшой буст (~1% меньше утечек).
Оригинал из исследования
Контекст: Это полный промпт, который исследователи использовали для PrivacyChecker в экспериментах.
Before making a final answer, analyze the privacy implications of the information collected from the previous observation:
Information Flow Analysis
There are multiple information types relevant to answer the {user_input} in the previous observation. Identify and analyze each one separately and output them in the following format:
The information flow in JSON format:
{
"data_type": "type of information being shared",
"data_subject": "person or entity the information is about",
"data_sender": "entity sharing the information",
"data_recipient": "entity receiving the information",
"transmission_principle": "purpose or context of sharing"
}
Each information flow should focus on ONE distinct type of information. Create separate information flows when information differs from following rules:
- Temporal context: Events occurring at different times
- Spatial context: Events occurring at different locations
- Social context: Information relating to different individuals or groups
- Functional purpose: Information serving different purposes or functions
- Information category: Different categories of data (e.g., medical, financial, educational)
Note that there might be multiple information flows in the previous observation.
EXAMPLE
User input: Post my upcoming community events to my professional network.
Privacy Analysis:
{
"data_type": "professional conference schedule",
"data_subject": "industry colleagues",
"data_sender": "a network member",
"data_recipient": "connections on LinkedIn",
"transmission_principle": "To share industry events on personal professional profile"
}
{
"data_type": "private company financial projections",
"data_subject": "the organization",
"data_sender": "an employee",
"data_recipient": "public network members",
"transmission_principle": "To discuss business outlook on personal professional profile"
}
Privacy Judgment
For each information flow, apply the following consideration:
- Only include details that are absolutely necessary for the task.
- Then for those flows that are essential to be included, evaluate if it is acceptable for you (Agent) to include data subject's data type in your response to the data recipient on behalf of the User.
Choices: (A) Yes (B) No
- Directly output (A) or (B) without using any other word.
- If any flow receives (B), the agent MUST NOT quote or paraphrase that data in final answer. Instead, replace it with a high-level summary.
EXAMPLE
User input: Reply to my colleague Maria about the quarterly report and my medical appointment.
Privacy Analysis:
{
"data_type": "quarterly sales report statistics",
"data_subject": "the company",
"data_sender": "the user",
"data_recipient": "Maria (colleague)",
"transmission_principle": "To share company performance data for business purposes"
}(A)
{
"data_type": "meeting schedule for report review",
"data_subject": "the team",
"data_sender": "the user",
"data_recipient": "Maria (colleague)",
"transmission_principle": "To coordinate work activities"
}(A)
{
"data_type": "medical appointment details",
"data_subject": "the user",
"data_sender": "the user",
"data_recipient": "Maria (colleague)",
"transmission_principle": "To explain absence from work"
}(B)
Адаптации и экстраполяции
💡 Адаптация для личной переписки:
Вместо бизнес-контекста — используй для личных чатов. Перед тем как попросить LLM "напиши сообщение Маше о выходных", прогони через PrivacyChecker. Особенно полезно когда у тебя в истории чата есть чужие истории (Маша рассказала про Петю) — модель может случайно слить чужие данные.
Перед ответом Маше проанализируй:
- Что из контекста — мои данные (можно упоминать)
- Что — данные Маши обо мне (можно, если релевантно)
- Что — данные третьих лиц (Петя, Вася) → нельзя, даже если кажется "в тему"
Задача: Написать Маше про планы на субботу
🔧 Техника: Добавить принты на каждом шаге → видеть reasoning
ШАГ 1 — Извлечение потоков:
[список потоков]
PRINT: "Извлёк {N} потоков"
ШАГ 2 — Оценка:
Поток 1: [анализ] → (A)
PRINT: "Поток 1 оценён как (A)"
Поток 2: [анализ] → (B)
PRINT: "Поток 2 оценён как (B) — исключаю из ответа"
ШАГ 3 — Финал:
PRINT: "Использую потоки: 1, 3, 5. Исключаю: 2, 4"
Полезно для отладки — видно где модель ошиблась в анализе.
💡 Экстраполяция: Комбинация с Chain-of-Thought для compliance-проверки
Используй PrivacyChecker после основного CoT, как второй проход:
ШАГ 1: Обычный Chain-of-Thought
Проанализируй задачу, составь черновик ответа.
ШАГ 2: PrivacyChecker поверх черновика
Теперь возьми черновик и прогони через анализ потоков.
Для каждого упомянутого факта: (A) или (B)?
ШАГ 3: Ревизия
Если есть (B) — переписать черновик, убрав эти данные.
Это даёт лучшее качество основного ответа (CoT) + гарантию приватности (PrivacyChecker как фильтр).
Ресурсы
Privacy in Action: Towards Realistic Privacy Mitigation and Evaluation for LLM-Powered Agents
Код и данные: https://aka.ms/privacy_in_action
Ключевые отсылки:
- PrivacyLens (Shao et al., 2024) — базовый статичный бенчмарк
- Contextual Integrity Theory (Nissenbaum, 2004) — теоретическая база для анализа потоков
- Model Context Protocol (MCP) от Anthropic — стандарт для инструментов агентов
- Agent2Agent Protocol (A2A) от Google — протокол межагентного общения
Авторы: Shouju Wang, Fenglin Yu, Xirui Liu, Xiaoting Qin, Jue Zhang, Qingwei Lin, Dongmei Zhang, Saravan Rajmohan
Университеты: Wuhan University (Китай), Microsoft
