虽然生成式 AI (gen AI) 正在迅速普及,但在打造对数据隐私性和机密性有更高要求的产品方面,生成式 AI 还有更大的潜力有待发掘。
例如,这可能意味着可以将生成式 AI 用于以下目的:
在诸如此类的某些应用中,对数据处理的隐私性/机密性、透明度和外部可验证性可能会有更高的要求。
Google 开发了许多技术,您可以使用这些技术,试验和探索生成式 AI 处理隐私性要求更高的数据的潜力。在本文中,我们将解释您如何使用最近发布的 GenC 开源项目将机密计算、Gemma 开源模型和移动平台结合起来,以尝试按照自己的方式构建基于生成式 AI 的应用。这些应用可以按照更高的隐私性/机密性、透明度和外部可验证性要求处理数据。
如下图所示,我们将在本文重点介绍的场景涉及具有以下特点的移动应用:可以访问设备上的数据,还需要使用 LLM 对这些数据执行生成式 AI 处理。
例如,假设用户需要一款可以针对设备上存储的笔记、文档或录音生成摘要或回答问题的个人助理应用。这些内容可能包含私密信息(例如与他人的聊天消息),因此我们希望确保内容的隐私性。
在我们的示例中,我们挑选的是 Gemma 系列的开源模型。请注意,虽然本文重点介绍的是移动应用,但同样的原则也适用于在本地托管自己数据的企业。
此示例显示了一个“混合”设置,其中有两个 LLM,一个在用户设备上本地运行,另一个托管在由机密计算提供支持的 Google Cloud Confidential Space 可信执行环境 (TEE) 中。这种混合架构使移动应用能够同时利用设备端和云端资源,并从两者各自的独特优势中获益:
在我们的示例中,这两个模型连接到一个模型级联中一起发挥作用。其中更小、更便宜、更快的 Gemma 2B 作为第一层,用来处理较简单的查询;而更大的 Gemma 7B 则作为备选项,用于处理前者无法自行处理的查询。例如,在下面的代码段中,我们将 Gemma 2B 设置为设备端路由器,首先分析每个输入查询,以确定两个模型中哪一个最合适,然后根据结果继续在设备上本地处理查询,或者将其传递给位于云端 TEE 中的 Gemma 7B。
您可以将此架构中的云端 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”)。
这种方法具有许多优势;仅举以下几例:
在现实部署中,性能通常是至关重要的因素。我们目前发布的示例仅限于 CPU,并且 GenC 目前仅提供 llama.cpp 作为 TEE 中模型的驱动程序。但是,机密计算团队正在扩展对 Intel TDX 的支持,例如 Intel AMX 内置加速器,以及计划推出以机密模式��行的 Nvidia H100 GPU 预览版。我们正在积极努力提供更多可用的软件和硬件选项,以释放最佳性能并支持更广泛的模型。敬请期待未来的更新!
我们希望本文能激发您的兴趣,并鼓励您尝试用我们介绍的一些技术构建自己的 AI 应用。在这一点上,请记住,GenC 是一个为实验和研究目的而开发的实验性框架。之所以建立此框架,是为了展示更多可能性,并激励您与我们一起探索这个令人兴奋的领域。如果您想做出贡献,请联系作者,或在 GitHub 上与我们互动。我们乐于与您合作!