启用隐私性更强的生成式 AI

七月 09, 2024
Krzysztof Ostrowski Research Scientist
Rene Kolga Senior Product Manager

虽然生成式 AI (gen AI) 正在迅速普及,但在打造对数据隐私性和机密性有更高要求的产品方面,生成式 AI 还有更大的潜力有待发掘。

例如,这可能意味着可以将生成式 AI 用于以下目的:

  • 数据处理;让个人助理能够更充分地融入并了解我们的生活,从而在更广泛的日常环境中为我们提供帮助。

  • 机密商业信息;例如,将处理发票或处理客户服务查询等繁琐的任务自动化,以提高工作效率并降低运营成本。

在诸如此类的某些应用中,对数据处理的隐私性/机密性、透明度和外部可验证性可能会有更高的要求。

Google 开发了许多技术,您可以使用这些技术,试验和探索生成式 AI 处理隐私性要求更高的数据的潜力。在本文中,我们将解释您如何使用最近发布的 GenC 开源项目机密计算Gemma 开源模型和移动平台结合起来,以尝试按照自己的方式构建基于生成式 AI 的应用。这些应用可以按照更高的隐私性/机密性、透明度和外部可验证性要求处理数据。


最终用户设备和云端共同发挥作用

如下图所示,我们将在本文重点介绍的场景涉及具有以下特点的移动应用:可以访问设备上的数据,还需要使用 LLM 对这些数据执行生成式 AI 处理。

例如,假设用户需要一款可以针对设备上存储的笔记、文档或录音生成摘要或回答问题的个人助理应用。这些内容可能包含私密信息(例如与他人的聊天消息),因此我们希望确保内容的隐私性。

在我们的示例中,我们挑选的是 Gemma 系列的开源模型。请注意,虽然本文重点介绍的是移动应用,但同样的原则也适用于在本地托管自己数据的企业。

A model cascade that spans from a mobile device to a trusted enclave in cloud.

此示例显示了一个“混合”设置,其中有两个 LLM,一个在用户设备上本地运行,另一个托管在由机密计算提供支持的 Google Cloud Confidential Space 可信执行环境 (TEE) 中。这种混合架构使移动应用能够同时利用设备端和云端资源,并从两者各自的独特优势中获益:

  • 小模型以经过量化的 Gemma 2B 为例。该模型的软件包大小约为 1.5 GB,适用于现代移动设备(如 Pixel 7),具有以下特点:响应时间更短(而不会造成网络或数据传输延迟);支持在没有网络连接的情况下进行查询;此外,由于能够利用本地设备上的硬件资源,因而成本效益更好(从而在云端能以相同成本覆盖更广泛的受众)。

  • 大模型以未经量化的 Gemma 7B 为例。该模型近 35 GB,即使对高功率设备也不适合,具有以下特点:由于托管在云端,模型依赖于网络连接,所以成本较高;质量更好,并且可以处理更复杂或昂贵的查询(因为有更多可以利用的资源);此外,还具有其他优势(例如通过将计算分流到云端,最大限度地减少移动设备电池消耗等)。

在我们的示例中,这两个模型连接到一个模型级联中一起发挥作用。其中更小、更便宜、更快的 Gemma 2B 作为第一层,用来处理较简单的查询;而更大的 Gemma 7B 则作为备选项,用于处理前者无法自行处理的查询。例如,在下面的代码段中,我们将 Gemma 2B 设置为设备端路由器,首先分析每个输入查询,以确定两个模型中哪一个最合适,然后根据结果继续在设备上本地处理查询,或者将其传递给位于云端 TEE 中的 Gemma 7B。


作为设备逻辑扩展的 TEE

您可以将此架构中的云端 TEE 视为用户移动设备实际上的逻辑扩展,由透明性、加密保证和可信硬件提供支持:

  • 将 Gemma 7B 和 GenC 运行时托管在 TEE 中的私有容器使用加密内存运行,设备与 TEE 之间的通信也会经过加密,并且不会保留任何数据(但如果需要保留数据,也可以对数据进行静态加密)。

  • 在发生任何交互之前,设备会通过请求获取证明报告来验证 TEE 中代码(用于处理设备委托的查询)的身份和完整性。证明报告包括 TEE 中运行的容器映像的 SHA256 摘要。设备会将此摘要与开发者提供的应用捆绑摘要进行比较。(请注意,在这个简单的场景中,用户仍信任应用开发者,正如使用纯设备端应用的情形一样;您也可进行更复杂的设置,但这种情况不在本文的讨论范围内。)

  • 在此场景中,容器映像中运行的所有代码都是 100% 开源的。因此,开发者或任何其他外部方都可以独立检查输入映像中的代码,以验证其处理数据的方式是否符合用户或数据所有者期望、监管要求或合同义务等。然后,开发者或任何其他外部方都可以继续自行建构映像,确认生成的映像摘要与应用内捆绑的摘要相匹配,并且与 TEE 随后返回的证明报告中应用所期望的摘要相匹配。

这种设置初看可能显得很复杂;如果您必须完全从头开始设置,实际上也的确如此。我们开发 GenC 正是为了简化这一过程。


简化开发者体验

以下是您在 GenC 中设置上述场景时实际需要编写的代码示例。虽然我们也提供适合 Java 和 C++ 编程的 API,但此处默认使用 Python。在本示例中,我们以“是否存在较敏感主题”作为信号,以此判断查询是否应由更强大的模型(能更谨慎地回复)处理。请注意,本示例经过简化,仅供说明之用。在实践中,路由逻辑可以更复杂并特定于应用,并且需要精心设计提示以要实现卓越性能,特别是对于小模型而言。

@genc.authoring.traced_computation
def cascade(x):
  gemma_2b_on_device = genc.interop.llamacpp.model_inference(
    '/device/llamacpp', '/gemma-2b-it.gguf', num_threads=16, max_tokens=64)
 
  gemma_7b_in_a_tee = genc.authoring.confidential_computation[
    genc.interop.llamacpp.model_inference(
      '/device/llamacpp', '/gemma-7b-it.gguf', num_threads=64, max_tokens=64),
    {'server_address': /* server address */, 'image_digest': /* image digest */ }]
 
  router = genc.authoring.serial_chain[
    genc.authoring.prompt_template[
      """Read the following input carefully: "{x}".
      Does it touch on political topics?"""],
    gemma_2b_on_device,
    genc.authoring.regex_partial_match['does touch|touches']]
 
  return genc.authoring.conditional[
    gemma_2b_on_device(x), gemma_7b_in_a_tee(x)](router(x))

您可以在 GitHub 上的教程中查看有关如何构建和运行此类示例的详细步骤。如您所见,抽象级别与在 LangChain 等流行 SDK 中的抽象级别相当。对 Gemma 2B 和 7B 的模型推理调用在此示例中分散于提示模板和输出解析器之中,并组合成链。(顺便说一句,我们确实提供了与 LangChain 之间有限的互操作性,并希望能够进行扩展。)

请注意,虽然 Gemma 2B 模型推理调用直接在设备端运行的链中使用,但 Gemma 7B 调用显式嵌入在 confidential_computation 语句中。

关键在于,不存在意外情况的可能——程序员始终完全控制并决定在处理端处理哪些内容,以及将哪些设备端中的内容委托给云端的 TEE。该决策明确反映在代码结构中。(请注意,尽管在此示例中,我们仅将 Gemma 7B 调用委托给单个受信任的后端,但我们提供的机制是通用的,并且可以使用该机制将更大体量的处理(例如,整个代理循环)委托给任意数量的后端。)


从原型设计到灵活部署

虽然上面显示的代码使用大家熟悉的 Python 语法表示,但在后台,它被转换为独立于平台和语言的可移植形式,我们称之为“中间表示”(简称“IR”)。

这种方法具有许多优势;仅举以下几例:

  • 通过此方法,您可以在易用、支持快速迭代的快速开发环境中(例如 Jupyter 笔记本),对您的生成式 AI 逻辑进行原型设计和测试,然后将只需微调甚至无需更改即可运行的生成式 AI 代码部署到(例如移动设备的 Java 应用)中。在我们的教程中,这非常简单,只需将包含 IR 的文件复制到您的移动设备,再加载到您的应用中即可。

  • 通过此方法,您可以部署和运行相同的逻辑,并确保应用在不同语言和平台之间的表现一致性(例如,从基于 Linux 的平台到移动平台,从 Python 到 Java 和 C++ 语言)。如果您计划瞄准多个不同的产品界面使用同一逻辑,这将非常有利。

  • 通过此方法,您可以跨越流程和机器边界,动态地委托生成式 AI 逻辑的任何部分。这也是我们示例场景中暗含的情况,即移动设备将内容委托给云端的 TEE。在这个简单的示例中,我们碰巧只委托了一项操作(Gemma 7B 推理调用)。但我们提供的机制要通用得多。

在现实部署中,性能通常是至关重要的因素。我们目前发布的示例仅限于 CPU,并且 GenC 目前仅提供 llama.cpp 作为 TEE 中模型的驱动程序。但是,机密计算团队正在扩展对 Intel TDX 的支持,例如 Intel AMX 内置加速器,以及计划推出以机密模式运行的 Nvidia H100 GPU 预览版。我们正在积极努力提供更多可用的软件和硬件选项,以释放最佳性能并支持更广泛的模型。敬请期待未来的更新!


我们期待着您的反馈!

我们希望本文能激发您的兴趣,并鼓励您尝试用我们介绍的一些技术构建自己的 AI 应用。在这一点上,请记住,GenC 是一个为实验和研究目的而开发的实验性框架。之所以建立此框架,是为了展示更多可能性,并激励您与我们一起探索这个令人兴奋的领域。如果您想做出贡献,请联系作者,或在 GitHub 上与我们互动。我们乐于与您合作!