这次我们看的不是新的 ComfyUI 工作流,也不是某个能本地跑的大模型整合包,而是 Google 在“隐私 AI”这条底层技术线上的一次关键推进:用同态加密(Homomorphic Encryption,HE)让 AI 推理可以作用在加密数据上。
简单解释一下背景:同态加密并不是新概念,过去几十年里它主要停留在密码学论文中,原因是性能开销太大。真正让它进入 AI 讨论范围的原因,是近几年全同态加密方案、编译器优化和硬件加速逐步成熟。Google 最近公开的这些方向,核心就是把“加密状态下也能完成模型推理”从理论推向可用工程,让云服务商在处理用户请求时,不直接接触用户明文。
这篇文章适合三类读者:一类是关注隐私计算和 AI 安全的工程师,想看 Google 这类项目把同态加密用在 AI 推理的完整链路;第二类是马上要在实际服务里做私有化 AI 的开发者,想搞清楚同态加密与 TEE、可信执行环境的能力边界;第三类是做技术选型的人,想快速评估这一技术当前能不能用、能用在哪里、成本是多少。
下面的内容会先解释 HE 为什么能和 AI 结合,再拆解一个典型的“加密 AI 推理”技术链路,并给出环境准备、代码示例、接口设计、性能观察方法和排查思路。所有示例均为通用流程,不绑定某个具体的 Google 闭源接口,落地时以官方仓库文档为准。
1. Google 同态加密与隐私 AI 核心能力速览
| 能力项 | 说明 |
|---|---|
| 技术类型 | 密码学 + AI 推理,面向数据隐私保护 |
| 核心卖点 | 服务端在不解密用户数据的前提下运行 AI 模型 |
| 解决的核心问题 | 云推理场景下用户查询泄露、敏感数据留存问题 |
| 典型计算能力 | 支持对密文做加、乘、比较、矩阵运算,进一步支撑线性层和近似激活函数 |
| 输入数据形态 | 用户查询向量、特征向量、私有关键字、私有多媒体描述特征等 |
| 输出数据形态 | 加密的推理结果,由客户端密钥解密后才能读取 |
| AI 模型约束 | 非线性层需要做低阶多项式近似,模型电路越规则越好 |
| 启动方式 | 不适用于双击一键包方式,更接近编译型密码学工程项目 |
| 是否适合纯 CPU 环境 | 语言和工具层面的实验可以,但生产级开销仍需关注硬件加速 |
| API 接口 | 取决于具体工程框架,可封装为通用隐私推理服务 |
| 批量任务 | 支持批量密文推理,但要注意密钥一致性和密文分片管理 |
| 当前成熟度 | 基础库、编译器和研究框架已形成生态,端到端产品仍在逐步工程化 |
| 主要问题 | 延迟开销仍然显著;非线性操作越深越贵 |
| 使用边界 | 不能解决部署环境本身的恶意外部行为,需要结合审计、权限隔离和合规机制 |
从这张表可以看出,Google 现在推动同态加密的方向,不是要取代所有隐私保护方案,而是给“云上 AI 推理”提供一个密码学可选解:数据所方不需要解密,模型推理方不需要看到明文请求,最终结果也只有持有私钥的客户端能恢复。
2. 从 Gentry 构造到 AI 推理:HE 为什么能与模型结合
同态加密的历史可以从 1978 年 Rivest、Adleman 和 Dertouzos 提出“在加密数据上直接做计算”的设想算起。很长一段时间里,密码学界只能做出部分同态方案,比如只能同态加法,或者只能同态乘法,无法通用地支持任意计算。2009 年 Gentry 提出了第一个全同态加密构造,让理论界第一次看到通用密文计算的可能。随后,实际方案不断演化,目前工程上常见的几条技术路线如下:
- BGV、BFV:面向整数运算,适合精确比较、统计、离散特征,很多隐私计算项目采用这类方案。
- CKKS:面向实数近似运算,可以直接处理浮点向量,非常贴合神经网络矩阵乘和模型推理,但结果是带有噪声的近似值。
- TFHE/FHEW:以位为单位做密文计算,通过自举(Bootstrapping)控制噪声,支持任意布尔电路和表查找,表达能力很强但单指令延迟较高。
- Paillier 等部分同态方案:运算类型单一、性能好,适合统计求和一类简单业务。
在 AI 推理场景,CKKS 天然适合处理张量加乘操作。神经网络的一层隐藏层,本质上是一堆矩阵乘和加偏置;卷积、全连接、BatchNorm 的线性部分,在密文域里只需要实现对应的同态加法和同态乘法。真正让同态加密工程变复杂的是非线性部分:ReLU 这类分段函数不容易直接做密文比较,通常会用多项式近似替代,比如用高次多项式逼近 ReLU;softmax 里的指数、除法也要改造成可计算的多项式形态。
Google 在这个方向上的策略很务实:不追求用一个密码学原语解决所有模型结构,而是建立一整套“模型转为同态友好电路”的工具链,让 Transformer、CNN 等项目里的常见层尽量落到低开销的密文计算上。从公开资料看,Google 过去在隐私保护应用中使用全同态加密的一个重要场景,就是浏览器侧不能把完整明文密码直接发给服务端,需要以加密形式完成查询。这种“真实业务推动密码学优化”的思路,也延续到了当前面向 AI 的隐私保护方向上。
因此,需要用同态加密做 AI 推理的开发者,首先要接受一个基本判断:同态加密不会让 AI 推理变得比明文更快,它带来的是安全边界的提升,代价是计算时间、密文长度、内存占用同步增长。能接受这个成本,才会继续往下做技术选型。
3. Google 语境下,为什么说同态加密 AI 正在“变得实用”
过去谈同态加密 AI,常用证据是一个玩具模型跑一次推理用了数分钟甚至数小时。真实业务无法接受。Google 这次相关讨论的“实用化”信号,主要体现在三点。
第一,模型层面的“编译优化”被强化。一个神经网络模型并不直接以 Python 推断代码的形式跑在密文上。先要把模型转化为中间表示,比如 ONNX 或 MLIR 方言;再经过同态加密编译器把算子分解为密文友好操作;最后调度到具体的 HE 后端上执行。Google 生态里的 HE 编译器和中间表示,正在把这一过程标准化。开发者手里的 PyTorch 模型不一定能原封不动跑密文推理,但可以完成“模型转换、长度裁剪、非线性层多项式近似、底层代码生成”的自动流水线。这样一来,实用性就不只是密码学库的性能,还取决于编译工具链的完善度。
第二,硬件加速和指令集级优化逐步提高密文计算的吞吐。同态加密的核心开销来自大整数多项式运算,CPU 上的 NTT 变换会占很高比例。现代处理器对 AVX-512 等向量指令支持越来越好;GPU 也被探索用来并行处理多个密文;FPGA 和专用芯片也在研究范畴内。Google 的思路往往不是单独依赖算法论文,而是把算法层与硬件加速一起考虑。实际工程判断是:目前很多实验环境的瓶颈仍然在中央处理器密集计算,开发者可以先按 CPU 推理来做预估,再决定是否需要上异性加速。
第三,业务场景被收敛到“高价值、强隐私、可接受延迟”的范围内。同态加密 AI 最适合的场景,并不是在线问答这类对毫秒级延迟敏感的业务,而是高价值私密查询。比如医疗场景中机构持有加密的检查特征,希望从云端模型获得风险概率;金融场景中用户侧持有财务特征,机构侧不想公开自身的风控模型;企业办公中用户希望让 AI 助理解读公司内部文档,又不想把全文直接推给第三方。这些场景里,一次推理延迟若干秒甚至几十秒,换取查询不被服务端可见,预算上往往是划算的。
同态加密还有一个和 TEE 的对比需要讲清楚。TEE 通过可信硬件把计算放进飞地,硬件的信任根可信;同态加密只依赖密码学假设,不依赖可信硬件,但也不提供硬件级隔离的完整性保护,密钥管理、侧信道建模仍需另行设计。实践中两者可以形成互补:模型方与用户之间需要密码学防止明文暴露,整体运行环境仍可以用容器、审计日志和访问控制提高信息安全性。
4. 同态加密 AI 推理端到端链路拆解
先把一个典型的云端密文推理流程写出来,方便后续对接设计。
服务端在收到密文时,无法阅读用户真正想问的内容;模型方为了提供推理能力,需要以某种方式部署模型,通常本身对服务端明文可见。两方的信任边界是:用户相信模型方不窃取明文查询,但用户并不希望模型服务商把查询明文存入日志用于其他优化。这也决定了整个系统不能简单地套用一个 API 网关,还要加入密钥生成、编码、加密和结果校验模块。
整个流程可以拆为以下环节:
- 密钥初始化。用户客户端生成一套同态加密密钥对,私钥保存在用户侧,公钥发送到服务端用于加密和部分计算。
- 数据编码与加密。把用户的查询向量转为方案需要的明文类型。若使用 CKKS,可选择向量编码;若使用 TFHE,会将数据切分为二进制位,逐位加密。
- 端到端请求传输。加密后的密文连同模型标识、算法参数、元数据封装为请求,通过标准 HTTPS 通道发送。
- 服务端密文推理。服务端加载模型,但推理发生在密文域中。线性层执行同态乘加;非线性层调用多项式近似函数;中间如果发生密文噪声增长,需要触发自举操作恢复可计算性。
- 返回加密结果和可验证信息。服务端返回推理结果的密文以及必要的校验参数,客户端用私钥解密后得到置信度、标签或向量。
- 日志侧处理。服务端不能记录查询明文,因此审计策略要调整,只记录请求 ID、耗时、模型 ID 等信息,避免无意间保存可恢复明文查询。
从编码的角度看,加密前的表达方式很重要。如果把字符串按 UTF-8 直接加密,后面做语义相似度搜索会非常困难。更合理的先把文本或图片转为固定维度的稠密向量,加密这个向量进行密文域推理。这个向量不是明文查询内容,服务端无法理解向量中蕴含的具体语义;整个系统的隐私边界也因此越清晰,越容易量化。
5. 环境准备与本地验证最小流程
如果想快速体验同态加密和 AI 的结合形态,不需要一开始就复现 Google 的完整生产架构。更稳妥的路径是分三步走:先跑通一个基础同态加乘逻辑,再观察一个简单模型在密文域的算子行为,最后把该流程扩展到完整的隐私推理服务。
同态加密项目通常是 C++ 库或基于编译器中间表示的工程,对开发者要求更高。本文给出通用流程,实际路径以具体开源项目 README 为准。
5.1 环境检查
下面是通用环境准备清单:
- 操作系统:Ubuntu 22.04 或同类 Linux 发行版;Windows 端更适合先使用 WSL2。
- 编译工具:CMake、GCC/G++、需支持 C++17 或更高。
- Python:3.9+,用于模型转换和客户端验证逻辑。
- 内存和 CPU:基础实验 16GB 内存、4 核以上 CPU 起步。生产级密文推理需要更高的内存和相应的硬件加速规划。
- 磁盘:框架编译和中间产物可能会占 10GB 以上,留出足够空间。
首轮测试不要追求大模型。用简单的逻辑回归或三层小 MLP 最为稳妥,密文域能跑通,再逐步上 CNN 或小型 Transformer。
5.2 验证同态加乘的基础语义
下面是一个 Python 语义示例,意在展示数据流,并非对某官方 API 的实际调用。
# 同态加密语义示例(非生产代码) # 真实实现需要使用可信的同态加密库,并在服务端完成加密计算 from typing import List # 模拟私钥持有的解密函数 def decrypt(ciphertext: List[int], private_key: int) -> int: # 这里仅用于展示数据流,真实解密逻辑完全不同 return ciphertext[0] % private_key # 模拟加密:密文数值与明文之间的关系不是简单的取余或线性变换 # 下面只是结构示意,不代表任何密码学安全性 def encrypt(plaintext: int, public_key: int) -> List[int]: noise = 7 return [plaintext + public_key + noise, public_key] # 在服务端,计算方只知道 ciphertext 和 public_key ciphertext, pk = encrypt(15, public_key=23) # 服务端看到的是“无意义的随机数”,但可以对它执行同态加法 ciphertext[0] += 10 # 客户端解密 result = decrypt(ciphertext, private_key=30) print(result)这个例子真正的价值是帮助团队统一语言,避免在架构评审时把“服务端看不见明文”理解成“服务端没有办法对密文编索引、做任务队列”。真实系统的密文结构、噪声和自举远比代码示例复杂,生产代码必须使用可审计的密码学库,并由专业密码学团队审核。
5.3 模型转换与非线性层替换
如果要用实际深度学习模型,可以把流程写成类似下面的通用自动化管线伪代码:
import torch model = torch.nn.Sequential( torch.nn.Linear(64, 32), torch.nn.ReLU(), torch.nn.Linear(32, 1), ) # 针对同态加密的算子重写 model[1] = approx_relu_polynomial(degree=4) # 用 4 次多项式近似 ReLU # 导出中间表示,送入 HE 编译器 converted = he_convert_from_pytorch(model)需要特别提醒的是:ReLU 替换为多项式后,模型表现会有轻微下降。采样的多项式近似次数、训练方式都需要重新验证。不要把明文模型精度假设直接套在密文版本上,而要重新跑一遍评估集。
6. 隐私推理服务的接口 API 设计与批量任务
同态加密固然是“密码学内核”,但对上层应用来说,它最终要封装成一个服务接口。下面是隐私推理服务的基础契约设计参考。
6.1 典型接口形态
| 项目 | 建议 |
|---|---|
| 请求协议 | HTTPS + JSON 或二进制编码,密文通常采用 Base64 编码 |
| 端点示例 | POST /v1/privacy:infer |
| 认证 | 客户端 API Key + 数字签名,密钥生成体系独立管理 |
| 请求体字段 | client_id、model_id、ciphertext、algorithm_params |
| 响应体字段 | job_id、ciphertext_result、status、timing_ms |
请求示例:
{ "client_id": "user_001", "model_id": "mlp_small_v1", "algorithm_params": { "scheme": "ckks", "poly_modulus_degree": 8192, "scale_bits": 40 }, "ciphertext_query": "base64..." }同态加密方案参数直接影响安全强度、密文长度和性能。若请求方设定的参数与模型方服务端不一致,通常会直接导致解码失败。因此请求中带algorithm_params一方面方便调试,另一方面也让密钥管理模块能够校验参数版本。
响应示例:
{ "job_id": "job_20250101_001", "status": "succeeded", "ciphertext_result": "base64...", "timing_ms": { "preprocess_ms": 32, "inference_ms": 4200, "postprocess_ms": 18 } }6.2 客户端伪代码
客户端流程通常包括密钥生成、明文向量编码、加密、请求、解密和结果校验:
import requests private_key, public_key = client_generate_keypair() # 假设 query_vector 来自用户的文本或图片特征 query_vector = embed("敏感问题描述") ciphertext = encrypt_with_public_key(query_vector, public_key) payload = { "client_id": "user_001", "model_id": "mlp_small_v1", "algorithm_params": { "scheme": "ckks", "poly_modulus_degree": 8192 }, "ciphertext_query": base64_encode(ciphertext) } resp = requests.post( "https://privacy-ai.example/v1/privacy:infer", json=payload, timeout=60 ) result_ciphertext = base64_decode(resp.json()["ciphertext_result"]) result_vector = decrypt_with_private_key(result_ciphertext, private_key) label = argmax(result_vector) print("推理结果:", label)6.3 批量任务设计建议
批量推理在同态加密场景与普通推理不同。由于服务端无法读取单条查询内容,批量切分的主要依据不再是业务语义,而是密文长度、限制电路深度、计算延迟。建议如下:
- 请求队列按“密文分片大小 + 预估执行时间”分组,避免大任务阻塞小任务。
- 为每条推理任务分配
job_id并保存状态,在任务失败时允许客户端原样重发密文。 - 添加签名和校验字段。因为服务端看不见明文,出现解密失败时往往很难判断是密文损坏、密钥不匹配还是参数不同,因此信息要用请求 ID、错误码、阶段信息。
- 相同密钥下的多条数据可以尝试打包做批处理,节省部分中间计算的开销。
- 服务端日志绝不能保存密文和查询向量的完整副本,只能保存哈希摘要。
7. 资源占用与性能观察方法
同态加密 AI 的性能受四方面影响:方案参数、模型电路深度、硬件指令集及编译器优化。资源占用的具体数值需要在目标机器上实测,这里给出标准观察方法与可能趋势。
7.1 必须观察的四项指标
| 指标 | 观察价值 |
|---|---|
| 请求整体延迟 | 判断该方案能否满足业务时效性 |
| CPU/GPU 峰值占用 | 判断当前规格是否适合长期运行 |
| 内存占用 | 多项式系数、自举密钥可能非常大,多个并发任务会导致内存暴涨 |
| 明文与密文输出误差 | 判断 CKKS 近似计算是否满足业务精度要求 |
| 密文长度和传输耗时 | 判断网络带宽是不是另一个瓶颈 |
7.2 什么会导致计算开销急剧上升
非线性层越多,开销越高。正常模型中常见的 ReLU、LayerNorm、softmax、比较操作都需要转换。每做一次密文乘法,噪声都会增长。噪声增长到一定程度以后必须做自举,而自举又是所有 HE 操作中最重的一环。Transformer 模型中大量自注意力层如果全部转为密文域计算,中间的比较输出、掩码操作、softmax 近似都会显著增加成本。
模型尺寸方面,线性层权重越大,密文乘加数量越多。建议从小模型开始,测量步骤为:明文推理耗时、单次密文线性层耗时、单次自举耗时、单条完整推理耗时。这样能定位瓶颈究竟在矩阵乘法还是在自举,从而决定是否通过降低多项式次数、减少模型层数或使用更多简化方案来缓解。
7.3 降低资源占用的通用手段
从使用层面看,比较有效的做法包括:
- 把编码维度降到最小可表达范围,越短的密文越省内存带宽。
- 尽量使用批处理,把一个 batch 内的数据打包进同一条 ciphertext,减少重复中间开销。
- 线性操作方案可以优先选择 CKKS,逐位计算优先考虑 TFHE,不要把两种模式混用。
- 模型推理前先做算子重写,把可以合并的线性层合并,减少多层连续密文噪声叠加。
- 生成完整的基准测试集,把明文模型、量化明文模型、同态推理模型放在同一套评估数据上做横向对比,避免“密文推理精度下降后才发现问题”。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 解密结果与明文差异大 | CKKS 参数比例过大、多项式近似精度不足 | 检查 scale 和明文向量长度 | 调整 scale_bits 或降低向量维度 |
| 推理时间远超预期 | 非线性层过深、自举频率过高 | 查看各算子执行时间分布 | 减少模型层数,合并线性层,减少自举次数 |
| 内存占用持续增长 | 大批密文和自举密钥加载到内存 | 使用进程监控工具观察说明 | 控制并发数量,为每个任务单独清理中间缓存 |
| 服务端无法判断请求是否有效 | 同态加密密文不暴露语义 | 检查请求签名和参数版本 | 在加密前加入字段校验和签名 |
| 模型精度明显下降 | ReLU/softmax 被低阶多项式替换 | 对比明文模型和密文模型 | 提高多项式近似次数,或对模型做推理校正 |
| 密钥不匹配导致解密失败 | 客户端与服务端 HE 参数不一致 | 记录算法参数并做一致性检查 | 所有请求请求都要携带算法参数标识 |
| 同态加密查询被服务端日志记录 | 日志框架自动记录完整请求体 | 审计日志配置 | 只记录密文 hash 摘要,不存完整请求体 |
| 延迟波动巨大 | 批量任务影响队列调度 | 观察任务量和延迟相关性 | 按耗时预估做任务分片 |
第一条常见原因是做同态加密 AI 推理最容易被忽视的。CKKS 的好处是可以做实数计算,坏处是结果本身带噪声。对精度要求高、包含决定性比较的任务,要选用整数方案或提高参数等级,但对大多数网络推理而言,给定适当的 scale 参数,误差是可以控制在业务容忍范围内的。
9. 同态加密隐私推理最佳实践与合规边界
任何涉及隐私 AI 的技术文章都应该把安全边界讲清楚。同态加密不是一把解决所有隐私问题的万能钥匙。
第一,同态加密的隐私模型主要保护用户查询明文不被模型服务端读取。它并不天然保护模型权重。模型提供方把模型部署在自己的服务端,权重仍然是对该服务器可见的。如果业务目标是防止模型权重泄露给另一个协作者,需要进一步引入安全多方计算、模型拆分或可信计算环境方案。
第二,同态加密不能抵抗恶意的客户端。如果客户端自己构造恶意密文,服务端并不能通过解密检查内容。因此接入层仍然需要身份认证、限流、配额管理和业务风控。
第三,密文推理结果也可能被客户端滥用,包括用大量查询逐步逼近模型信息。生产环境需要配套查询频率限制、结果后处理监控和异常行为审计。
第四,凡是涉及人脸、声音、医疗、金融等高敏数据,必须在部署前完成隐私影响评估。即便技术上实现了明文不可见,也不代表组织可以规避行业合规义务。数据来源授权、用户告知、跨境数据传输等,仍然要遵循适用的法律和平台政策。
从工程最佳实践角度看,建议顺序是:先跑通小型模型;在明文与密文两个版本之间建立评估基线;团队做一轮密码学参数评审;再把请求日志和密钥管理分离;最后做灰度上线。首轮版本不应该直接接入核心生产流量,可先选取一批低风险、高价值、用户明确授权的查询做试点。
10. 总结与下一步行动
Google 用同态加密推进隐私 AI 这件事,值得开发者关注的不是某个具体产品名,而是“密文推理”正在变成一套可工程化的技术栈:模型中间表示、编译器、TFHE/CKKS 后端、自举优化、硬件加速,以及云服务侧的网关和任务编排。对一个长期做隐私计算的团队来说,现在正是搭建基础验证环境的好时机。
如果你接下来想跟进,建议完成三件事:
- 先回到 Google 及相关全同态加密生态的官方页面,把当前仓库路径、构建工具和示例代码抓下来,不要看二手介绍直接复制命令。
- 选择一个 10 层以内的小模型或一个小型向量检索任务,在 CPU 上完成明文与密文对比。
- 做一次延迟可接受度评估,判断这一技术在你业务里是否能以异步、低频率、高隐私增益的方式落地。
最容易踩的坑,是拿着 Transformer 大模型直接上同态加密,认为编译器能解决一切。更稳妥的路线是先接受“密文 AI 不是免费的”,然后把模型裁剪、算子近似、参数调优和隐私边界一起纳入设计。同态加密会把 AI 的“隐私保护”从销售话术变成可度量、可审计、可验证的密码学能力,但前提是工程师先理解它的成本边界,并根据场景找到合适的切入点。