Multi-Agent Privacy Compliance System

Android App
隐私合规检测
与交互问答系统

融合多智能体协作、多模态页面感知、程序行为分析与 Agentic RAG,实现页面隐私行为与政策声明一致性的自动化检测及可解释问答,实现了从单向隐私告知到双向交互问答的转变。

个人职责:负责系统整体架构设计与实现,包括 MasterAgent 调度逻辑、UIAgent 多模态页面理解、CodeAgent 静态污点分析集成、RAGAgent 检索链路优化(混合检索、领域重排、Query 重写),以及多轮对话的指代消解与上下文压缩模块。
System Architecture

从固定流程到多 Agent 协作

系统的技术路线并非一开始就确定为多智能体系统,而是围绕"用户如何理解 App 正在收集哪些隐私信息、这些行为是否与政策一致、系统如何给出可解释答案"逐步演进。经历了固定 Workflow → 单 Agent → 多 Agent 协同三个阶段。

01
Workflow 原型
固定执行"页面识别 → 数据分析 → 法规检索 → 合规裁决",适合验证闭环,但容易产生冗余调用和上下文过长。
02
单 Agent
由一个 Agent 统一理解问题并调用工具,灵活性提升,但职责过重、上下文溢出、调试困难、扩展性差。
03
多 Agent 协同
拆分为 MasterAgent、UIAgent、CodeAgent、RAGAgent,每个 Agent 负责一类证据,边界更清晰,可独立优化。
04
证据约束裁决
MasterAgent 汇总页面线索、代码行为和政策条款,基于 ReAct、CoT 与 Self-Verification 生成可解释合规结论。
多 Agent 协作架构全景图
User Query
自然语言问题 / 多轮追问
MasterAgent
意图识别 → 任务规划 → Agent 调度 → 证据聚合 → CoT + Self-Verification 裁决
dispatch
UIAgent
MLLM 多模态理解
GUI → 场景 → 意图
CodeAgent
FlowDroid 污点分析
Source → Sink 追踪
RAGAgent
混合检索 + 领域重排
Query Rewrite + 条款溯源
evidence
📱 页面隐私场景
💻 代码数据流
📚 政策条款
📜 法规依据
可解释合规结论
带条款引用的风险评估 + 合规建议 + 置信度
50
Android App 测试样本
0%
交互问答准确率
0%
隐私敏感操作识别准确率
0%
API 调用关联正确率
系统迭代前 vs 迭代后对比
维度 Before(初版) After(当前版本)
系统架构 固定 Workflow 串联,冗余调用多 多 Agent 协同,MasterAgent 动态调度
页面理解 OCR + 图标分类,缺少上下文语义 MLLM 多模态理解,GUI → 场景 → 意图映射
政策检索 Word2Vec 词向量,Top5 Recall 42% BM25 + 领域微调 Reranker,Top5 Recall 85%
代码分析 敏感 API 规则匹配,仅检测出现 FlowDroid 污点分析,Source → Sink 路径追踪
答案质量 无引用、无验证,幻觉率高 CoT + Self-Verification,带条款引用的可解释结论
多轮对话 无上下文记忆,指代词混乱 指代消解 + 结构化上下文压缩
Interactive Demo

MasterAgent 调度演示

选择不同类型的用户问题,观察 MasterAgent 如何进行意图识别、任务规划,并调度对应的 Agent 完成证据收集与裁决。

MasterAgent Dispatch Simulator
MasterAgent 正在分析...
点击上方场景按钮,查看 MasterAgent 调度流程
RAGAgent 检索管线可视化
RAG 管线运行中...
Query 输入
用户原始问题
Query Rewrite
口语化改写 + 指代消解
混合检索
BM25 + BGE 向量
Cross-Encoder 重排
领域微调 Reranker
证据选择
条款级溯源
答案生成
CoT + 条款引用
Query Rewrite Playground
Query 改写中...
它会传给别人吗? 这个能不能不给? 关了会怎样? 这有啥风险? 刚才那个权限是干嘛的?
Technology Stack

技术栈总览

系统涉及多模态理解、静态程序分析、信息检索与大模型推理四个技术领域,以下是各模块使用的核心技术与工具。

UI UIAgent · 多模态页面理解
MLLM PaddleOCR GUI Parsing Scene Classification
Code CodeAgent · 静态污点分析
FlowDroid Soot SuSi Source/Sink Android Lifecycle
RAG RAGAgent · 检索增强生成
BGE / SimCSE BM25 bge-reranker HyDE OPP-115 RAGAS
Master MasterAgent · 调度与裁决
ReAct Chain-of-Thought Self-Verification Context Injection
Infra 基础设施
Python LangChain FAISS Elasticsearch Android APK
Eval 评估体系
RAGAS Top5 Recall MRR nDCG@10 Faithfulness
UIAgent Iteration

从 OCR 到多模态页面语义理解

UIAgent 的目标是识别当前 App 页面可能涉及哪些个人信息类型。迭代核心是从"识别页面文字"升级为"理解页面正在发生什么"。

// UIAgent 输出映射
GUI 元素 → 场景标签 → 用户意图 → 个人信息类型

// 示例输出
页面类型: 附近门店页面
隐私场景: 定位申请
数据类型: Precise location
用户意图: 授权使用附近服务
典型误差
OCR 识别到 手机号,但它可能是注册输入框、账号绑定入口,也可能只是客服电话。多模态模型可以结合输入框、按钮和页面标题判断其真实语义。
V1
OCR + 图标分类 + LLM 分类
先通过 OCR 抽取页面文字,再结合图标识别判断页面中的隐私相关元素,最后由 LLM 对 OCR 结果进行分类。
PaddleOCR Icon Classifier LLM Labeling
!
暴露问题:上下文语义缺失
OCR 能识别"定位""允许""手机号",但无法稳定判断这些文字属于权限弹窗、注册表单、客服说明还是第三方登录入口。核心问题是缺少对布局、组件关系和交互场景的理解。
V2
切换到多模态大模型 MLLM
MLLM 同时理解文字、布局、控件关系和视觉上下文,输出页面类型、隐私场景、用户意图和涉及的个人信息类型。从"识别页面文字"升级为"理解页面正在发生什么"。
MLLM UI Semantic Parsing GUI-to-Intent
RAGAgent Iteration

从 Word2Vec 到领域化 Agentic RAG

RAGAgent 的迭代重点是让系统从"找到相似段落"升级为"召回能支撑回答的证据条款"。基于 OPP-115 Taxonomy(隐私政策标注框架,将政策文本分为数据类型、收集目的、共享对象等 115 个类别)设计分层切块策略。

65%→85%
Top5 Recall 提升
0.68
最终 MRR
3000+
合规与政策文档
RAGAS
检索与生成评估框架
RAGAgent Top5 Recall 演进
42%
Word2Vec
61%
BGE
68%
KW+Vec
73%
BM25+Vec
71%
Generic Rerank
80%
Domain Rerank
85%
Query Rewrite
阶段技术方案Top5 RecallMRR迭代原因
V1Word2Vec + Cosine Similarity42%0.28存在 OOV 问题,难以表达"设备标识符、第三方 SDK"等领域语义
V2BGE / SimCSE / E5 向量检索61%0.42句向量语义召回提升,但"定位""注销"等短 Query 仍不稳定
V3关键词检索 + 向量检索68%0.48短 Query、专有词和法规术语更适合关键词召回
V4BM25 + 向量混合检索73%0.53BM25 更适合长文档和条款级检索
V5混合检索 + 通用 Reranker71% ↓0.50通用重排模型与领域分布不一致,偏向表面语义相关而非证据充分性
V6混合检索 + 领域微调 Reranker80%0.61用隐私政策正负样本训练"能支撑回答"的排序能力
V7Query Rewrite + HyDE + 问题分解85%0.68解决口语化、模糊指代和复杂问题拆解
为什么 V5 会下降? 我们已经对 Embedding 模型做了隐私合规领域微调,使它更倾向于召回合规相关段落;但通用重排模型仍然基于表面语义相似度排序,可能把"我们重视您的个人信息保护"这类泛化承诺排到前面,而真正能回答问题的证据条款被挤到后面。这说明检索模型和重排模型的领域分布必须一致,否则重排反而会伤害效果。
Query Rewrite
原始:这个能不能不给?
上下文:申请精确定位权限
改写:用户是否可以拒绝提供精确位置信息?
指代消解
原始:它会传给别人吗?
上下文:上一轮讨论设备 ID
改写:该 App 是否会向第三方共享设备标识符?
HyDE
原始:注销后数据保留多久?
生成假设答案后用答案内容辅助检索,提升长尾条款召回。
问题分解
原始:会不会把定位给别人?不给会怎样?
拆分为:1. 是否共享位置给第三方? 2. 拒绝后功能影响?
CodeAgent Iteration

从 API 匹配到 FlowDroid 静态污点分析

CodeAgent 负责回答"代码里是否真的采集或上传了这些数据"。从简单的敏感 API 匹配迭代到基于 FlowDroid 的 Source-Sink 数据流追踪。

V1
敏感 API 匹配
通过规则方式匹配 Android 敏感 API,例如 LocationManager、ContactsContract、Camera、TelephonyManager 等。实现简单,但只能说明"代码中出现过敏感 API",不能说明数据是否真的从 source 流向 sink。
V2
FlowDroid 静态污点分析
引入 FlowDroid 追踪敏感数据从 Source 到 Sink 的路径。基于 Android 生命周期建模、回调建模和数据流分析,判断数据是否真的被采集并传输。结合 SuSi 官方列表 + Android Dangerous Permissions + 第三方 SDK 上报接口定义 Source/Sink。
FlowDroid Source/Sink Taint Analysis
// Source → Sink 数据流示例

Source: getLastKnownLocation()
Sink: HttpURLConnection.send()

// 输出链路
界面控件 → 用户事件
Source API → 数据类型
Sink API → 数据流向

// Source 示例
· getLastKnownLocation()
· ContactsContract
· ANDROID_ID
· Advertising ID

// Sink 示例
· 网络请求 · SDK 上报
· 日志埋点 · 广告归因
MasterAgent Iteration

意图识别、任务规划与可解释裁决

MasterAgent 是系统的大脑。它根据用户 Query 判断需要哪些证据,按 ReAct 模式调用对应 Agent,再用 CoT 与 Self-Verification 生成证据约束答案。

// ReAct 执行链路

Thought: 判断当前问题需要哪些证据
Action: 调用 UIAgent / CodeAgent / RAGAgent
Observation: 接收各 Agent 返回结果
Thought: 判断证据是否充分
Action: 必要时继续检索或追问
Final: 生成最终回答
CoT + Self-Verification
在最终回答阶段,MasterAgent 使用链式推理和自我验证做证据约束生成。检查结论是否同时被 UI 证据、代码证据和政策证据支撑,降低模型幻觉。
用户问题
这个页面为什么要我的精确位置?不授权会怎样?
MasterAgent 执行链
Thought:这是页面权限解释 + 拒绝影响问题,需要 UI 上下文和政策证据。

Action:调用 UIAgent 分析当前页面。
Observation:页面为附近门店功能,申请 Precise Location。

Action:调用 RAGAgent 检索定位权限和拒绝授权相关条款。
Observation:政策说明定位用于附近服务,拒绝后相关功能不可用。

Final:生成带证据的解释。
最终输出
结论:当前页面涉及设备标识符收集,存在第三方共享风险。

证据:政策第 X 条说明收集设备标识符;CodeAgent 检测到 Advertising ID 流向广告 SDK。

风险等级:中高
建议:检查隐私政策是否明确披露第三方 SDK 名称、数据类型和用途。
合规裁决过程演示
多 Agent 协同分析中...
选择上方场景,查看多 Agent 协同裁决过程
Multi-Turn Dialogue

多轮对话:指代消解与上下文压缩

用户经常连续追问"它会给谁""这个能不能不给""拒绝后还能用吗"。系统需要把指代词恢复成明确对象,并把对话历史压缩成结构化记忆,以支持稳定的多轮交互。

Multi-Turn Privacy QA Demo
U
这个 App 会不会把我的定位给别人?
A
根据隐私政策第 X 条,App 可能会向合作方、关联公司或第三方 SDK 共享您的位置信息,用于广告归因和统计分析。建议检查政策中是否明确披露了第三方名称和数据用途。
U
那我能不能不给?
A
Query 改写:用户是否可以拒绝提供精确位置信息?
(指代消解:"不给" → "拒绝提供精确位置信息")
可以拒绝。您可以在系统设置中关闭定位权限,或在 App 弹窗时选择"拒绝"。但依赖定位的功能(如附近门店、导航)将无法正常使用,不影响其他基础服务。
U
它会传给别人吗?
A
Query 改写:该 App 是否会向第三方共享用户的位置信息?
(指代消解:"它" → "位置信息","别人" → "第三方")
是的,政策声明可能会向第三方 SDK 共享位置信息。CodeAgent 检测到代码中存在 getLastKnownLocation() 到网络请求的数据流,涉及广告归因和统计分析用途。
U
这个风险大吗?
A
Query 改写:位置信息共享给第三方的风险等级评估?
(指代消解:"这个" → "位置信息共享给第三方")
风险等级:中高。原因:1)政策未明确披露具体第三方 SDK 名称;2)位置信息属于敏感个人信息;3)存在跨境传输风险。建议:要求 App 补充披露第三方 SDK 列表和数据存储地域。
指代消解
维护当前会话状态:记录最近讨论的数据类型、页面场景、权限类型。将"它""这个""刚才那个权限"替换成明确对象后再进行检索,避免检索漂移。
上下文压缩
将对话历史压缩成结构化记忆,包含当前页面、当前权限、已讨论数据类型、已召回证据和未解决问题。减少 token 消耗,同时避免多轮追问时丢失关键对象。
结构化记忆示例
{
  "current_page": "附近门店页面",
  "current_permission": "Precise location",
  "discussed_data_types": ["定位", "设备ID"],
  "retrieved_evidence": ["定位用于附近服务", "可撤回权限"],
  "open_questions": ["第三方SDK共享"]
}
Project Results

项目成果

系统在 50 款 Android 应用的测试中,交互问答准确率达 76%、隐私敏感操作识别准确率达 91%,API 调用关联正确率达 82%。在人工构建的合规问答评测集上,基于 RAGAS 框架评估,引入领域微调与重排机制后,Top5 召回率由 65% 提升至 85%,MRR 提升至 0.68。

0%
交互问答准确率
0%
隐私敏感操作识别准确率
0%
API 调用关联正确率
0%
RAG Top5 召回率
UI
UIAgent
隐私敏感页面识别准确率 91%,覆盖权限弹窗、表单输入、第三方登录等场景。基于 MLLM 实现页面级隐私风险检测。
Code
CodeAgent
API 调用关联正确率 82%,基于 FlowDroid 实现 Source-Sink 数据流追踪,建立"界面控件→用户事件→API调用→数据行为"链路。
RAG
RAGAgent
Top5 召回率从 65% 提升至 85%,MRR 达 0.68。基于 OPP-115 分层切块,引入领域微调 Reranker 与 Query 优化。
M
MasterAgent
基于 ReAct + CoT + Self-Verification 输出可解释合规结论,降低模型幻觉,通过 Context Injection 优化对话一致性。
Interview FAQ

常见问题

为什么选择多 Agent 架构而不是单 Agent + 工具调用?

单 Agent 在早期验证阶段是可以工作的,但随着系统复杂度增加,暴露出几个问题:

1)上下文过长:UI 分析、代码分析、法规检索结果全部塞给一个 Agent,容易超过上下文窗口限制。

2)职责过重:一个 Agent 同时负责规划、感知、检索、分析和裁决,Prompt 维护成本高,调试困难。

3)输出不稳定:不同类型任务混在一起,容易产生推理跳跃。

多 Agent 架构让每个 Agent 专注一类证据,MasterAgent 只负责调度和裁决,边界更清晰,也更容易独立优化每个模块。

FlowDroid 的局限性是什么?你是怎么处理的?

FlowDroid 的主要局限:

1)Source/Sink 定义依赖人工:需要维护敏感 API 列表,新增 SDK 或 API 时需要手动补充。

2)对反射和动态加载支持有限:部分 App 使用反射调用敏感 API,FlowDroid 可能漏检。

3)路径爆炸:复杂 App 的调用图可能非常大,分析时间长。

我们的处理方式:结合 SuSi 官方列表 + Android Dangerous Permissions + 第三方 SDK 上报接口进行补充;对反射调用做简单的模式匹配兜底;限制分析深度控制时间成本。

为什么不用 GPT/Claude 直接做 RAG,而要自己搭检索链路?

1)领域适配:通用 LLM 对隐私政策的专业术语(如"设备标识符""个性化推荐""第三方 SDK")理解不够精准,需要领域微调的 Embedding 和 Reranker。

2)可溯源性:合规场景要求答案必须有条款引用,自建检索链路可以精确控制证据来源和引用格式。

3)成本控制:隐私政策文档量大(3000+),每次都让 LLM 全文理解成本太高,检索后只传相关段落更经济。

4)可控迭代:自建链路可以针对 bad case 逐步优化(比如 V5 的重排下降问题),黑盒 API 无法做到这种精细调优。

OPP-115 Taxonomy 是什么?为什么用它?

OPP-115 是 Carnegie Mellon 大学提出的隐私政策标注框架,包含 115 个细粒度类别,覆盖数据类型(如地理位置、联系人)、收集目的(如广告、分析)、共享对象(如第三方、关联公司)、用户权利(如删除、撤回同意)等维度。

我们用它来设计分层切块策略:按 OPP-115 的类别对政策文本进行元数据标注,检索时可以根据问题意图限定检索范围(比如"数据共享类"问题只在共享相关段落中检索),提升检索精度。

RAGAS 评估框架具体评估哪些指标?

RAGAS 主要评估 RAG 系统的检索和生成质量,核心指标包括:

1)Faithfulness:生成答案是否忠实于检索到的证据,是否有幻觉。

2)Answer Relevancy:生成答案是否与问题相关。

3)Context Precision:检索到的上下文中,真正相关的比例。

4)Context Recall:回答问题所需的信息是否都被检索到了。

我们主要关注 Context Recall(对应 Top5 Recall)和 Faithfulness(对应答案 groundedness),这两个指标最能反映合规场景的核心需求。

如果要继续迭代,下一步会做什么?

1)动态分析:目前 CodeAgent 只做静态分析,如果能结合 Frida 或 Xposed 做运行时 hook,可以捕获反射调用和动态加载的敏感 API。

2)政策版本对比:很多 App 会更新隐私政策,可以加入政策版本 diff 功能,检测政策变更是否涉及新的数据收集行为。

3)自动化测试:目前的 50 款 App 测试是半自动的,可以接入 UI 自动化框架(如 UIAutomator)实现全自动遍历和检测。

4)法规知识库:当前 RAGAgent 主要检索 App 自身的隐私政策,如果能接入 GDPR、个保法等法规条文,可以做更全面的合规判断。

从单向隐私告知到双向交互问答

本项目从最初的固定 workflow 原型逐步演进为多智能体隐私合规审计系统,形成了"页面感知 - 行为分析 - 政策检索 - 合规裁决"的闭环。

返回顶部