Goole I/O 2024 公布了计划在 Chrome 上推出内置 AI 模型 Gemini Nano。今天官方放出了详细的文档。我用 FisherAI Chrome 插件 对文档进行了翻译,模型使用了 gpt-4o。

Chrome 内置 AI 早期预览计划

欢迎使用 Prompt API 的早期预览版

作者:

  • Kenji Baheux
  • Thomas Steiner
  • Alexandra Klepper

联系:见此部分

最后更新:2024 年 5 月 28 日

介绍

欢迎并感谢您参与我们的内置 AI 功能早期预览计划(文章, Google I/O 2024 演讲)。在探索改进或增强 Web 体验的 AI 机会时,您的参与非常宝贵!

内置 AI 早期预览计划有几个目标:

  • 倾听:我们渴望听取您对早期 API 的反馈。帮助我们更好地理解您要解决的问题。这将确保我们以正确的方式设计您需要的 API。
  • 探索:我们希望促进对内置 AI 应用的发现,这将直接影响我们的路线图和优先级讨论。为此,我们将提供探索性 API,例如 Prompt API。
  • 支持:您的见解和兴趣将为我们与其他浏览器供应商的讨论提供参考,因为我们致力于在 Web 浏览器中实现 AI 集成的通用标准。

📣 知道其他人也想加入这个计划吗?或者您是从朋友那里获得了此文档的访问权限?注册以直接在您的收件箱中获取最新更新。

在本次更新中,我们很高兴提供关于即将推出的探索性 Prompt API 的详细信息,该 API 旨在通过本地原型开发促进 AI 用例的发现。更具体地说,此 API 将允许您在开发环境中直接与设备上的 Gemini Nano 进行互动。

📝 探索性 API 仅用于本地原型开发。通过这些探索性 API,我们打算征求反馈,确认假设,并确定未来要构建的任务 API(如翻译 API)。因此,探索性 API 可能永远不会发布。

在我们共同探索这项技术的可能性时,优先考虑负责任的 AI 开发至关重要。为了帮助指导我们的努力,请花一刻时间查看 Google 的生成式 AI 禁用用途政策。该政策概述了一些关键考虑事项,以确保 AI 的道德和安全部署。

让我们一起学习和构建 ✨!

Prompt API

目的

Prompt API 用于本地实验,以促进内置 AI 用例的发现。使用此 API,您可以向 Chrome 中的 Gemini Nano 实例发送自然语言指令。

虽然 Prompt API 提供了最大的灵活性,但它不一定能提供最佳结果,在某些情况下可能无法提供足够的质量。我们相信,特定任务的 API(如翻译 API)配合微调或专家模型,将能提供显著更好的结果。我们希望 Prompt API 能加速发现有吸引力的用例,以便制定任务特定 API 的路线图。

时间安排

我们打算在桌面版 Chrome 127 的开发频道中,通过实验标志提供 Prompt API。

重要提示:我们预计实验标志将在 2024 年 5 月 30 日左右提供。我们将尽快提供确切版本:版本为 127.###.###.### 及以上。

要求

我们的内置 AI 计划目前专注于桌面平台。此外,Chrome 下载和运行 Gemini Nano 需要满足以下条件。

方面 Windows MacOS Linux
OS 版本 10, 11 ≥ 13 (Ventura) 未指定
存储 包含 Chrome 配置文件的卷上至少 20 GB
GPU 集成 GPU 或离散 GPU(如视频卡)
视频 RAM 4 GB(最低)

🚧 这些不一定是 Chrome 中 Gemini Nano 的最终要求。我们对性能方面的反馈感兴趣,以进一步改善用户体验,并调整要求。

尚不支持:

  • Android 版 Chrome
  • iOS 版 Chrome
  • ChromeOS 版 Chrome

设置(5 月 30 日之后)

先决条件

  1. 确认 Google 的生成式 AI 禁用用途政策。
  2. 下载 Chrome 开发频道,并确认您的版本高于 127.###.###.###。
  3. 检查您的设备是否符合要求。

启用 Gemini Nano 和 Prompt API

按照以下步骤启用 Gemini Nano 和 Prompt API 标志进行本地实验:

  1. 在 Chrome 中打开一个新标签页,转到 chrome://flags#optimization-guide-on-device-model
  2. 选择 Bypass Perf Requirements
  3. 转到 chrome://flags#prompt-api
  4. 选择 Enabled
  5. 重新启动 Chrome。

确认 Gemini Nano 的可用性

  1. 打开 DevTools 并在控制台中发送 await window.ai.canCreateTextSession(); 。如果返回“yes”,那么您就准备就绪了。
    • 否则,重新启动 Chrome 并继续以下步骤。
  2. 在 Chrome 中打开一个新标签页,转到 chrome://components
  3. 确认 Gemini Nano 可用或正在下载
    • 您需要看到版本大于等于 2024.5.21.1031 的 Optimization Guide On Device Model。
    • 如果没有列出版本,请点击 Check for update 强制下载。
  4. 一旦模型下载完成并达到上述版本,在 DevTools 中发送 await window.ai.canCreateTextSession(); 。如果返回“yes”,那么您已准备就绪。
    • 否则,重新启动,稍等片刻,然后从步骤 1 开始重试。
    • 如果仍然失败,请参阅故障排除部分。

API 概述

示例代码

// 首先检查是否可以基于模型的可用性和设备的特性创建会话。
const canCreate = await window.ai.canCreateTextSession();
// canCreate 将是以下之一:
// * "readily": 模型在设备上可用,因此创建会话将很快发生
// * "after-download": 模型在设备上不可用,但设备有能力,
//   因此创建会话将启动下载过程(可能需要一段时间)。
// * "no": 模型不适用于此设备。
if (canCreate !== "no") {
  const session = await window.ai.createTextSession();
  // 提示模型并等待整个结果返回。
  const result = await session.prompt("写一首诗给我");
  // 提示模型并流式传输结果:
  const stream = session.promptStreaming("写一首超长的诗");
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

会话选项

每个会话都可以使用 topKtemperature 进行自定义。这些参数的默认值由 window.ai.defaultTextSessionOptions() 返回。

JavaScript

终止会话

如果不再需要会话,请调用 destroy() 释放资源。当会话被销毁时,不能再使用它,任何正在进行的执行将被中止。

await session.prompt(`您是一位专门从事服装选择的友好、乐于助人的助手。`);
session.destroy();
// 该承诺将被拒绝,错误解释会话已被销毁。
await session.prompt(`今天应该穿什么?天气晴朗,我在 t 恤和 polo 衫之间犹豫不决。`);

控制序列

字符序列 <ctrl23> 是 Gemini Nano 的控制序列。它帮助模型理解模拟交互的轮次以及何时应该响应。该序列应直接在提示中使用(请参阅 Prompt 101 部分了解详细信息)。

💡 目前,控制序列 <ctrl23> 由 Prompt API 自动添加到提示的末尾。然而,对于单次*或少次**提示,最好在每轮模拟交互(shot)的末尾添加控制序列。请参阅这些示例。

  • *单次提示:提示中提供一个示例供模型学习并生成响应。
  • **少次提示:提示中提供多个示例,通常为两到五个,以帮助模型生成更准确的响应。
JavaScript

异常

Prompt API 可能会从 AI 运行时接收错误。请参阅此部分,了解可能的错误列表以及它们如何映射到 DOMExceptions。

注意事项

canCreateTextSession() 的 “after-download” 状态

“after-download” 状态和行为不受支持。API 不会触发模型下载。相反,Chrome 将触发下载,可能是作为 chrome://flags 状态变化的一部分,或由于另一个在设备上的 AI 功能。

流式传输

目前,promptStreaming() 返回一个 ReadableStream,其块会连续累积。

例如,以下代码记录一个序列,如“Hello”,“Hello world”,“Hello world I am”,“Hello world I am an AI”。

for await (const chunk of stream) {
  console.log(chunk);
}

这不是预期的行为。我们打算与平台上的其他流式传输 API 保持一致,其中块是单个长流的连续部分。这意味着输出将是一个序列,如“Hello”,“ world”,“ I am”,“ an AI”。

目前,为实现预期行为,您可以实现以下内容:

let result = '';
let previousLength = 0;
for await (const chunk of stream) {
  const newContent = chunk.slice(previousLength);
  console.log(newContent);
  previousLength = chunk.length;
  result += newContent;
}
console.log(result);

会话持久性和克隆

尽管有一个名为 AITextSession 的对象,但尚未实现持久性。发送给模型的任何信息都不会保留,这意味着每次都必须重新发送整个对话。换句话说,每次调用 prompt()promptStreaming() 都是独立的。

一旦实现持久性,我们打算允许会话克隆。这意味着可以设置一个具有基线上下文的会话,并在不需要重复的情况下提示模型。

隐身模式

我们对 Prompt API 的实现不支持隐身模式。

Prompt 101

为了编写最佳提示,我们建议阅读以下内容:

此外,这里是我们对 Chrome 中 Gemini Nano 的建议。

DOs 和 DONTs

  • DOs

    • 包含示例以指导您的提示。一个示例或单次提示比没有示例更好。少次提示在指导模型返回预期结果方面最好。
    • 添加规则。通过在提示中添加规则,可以提高输出的质量。例如:“以友好的语气回应”,“如果不清楚,请使用‘模棱两可’类别”,“不要提供任何解释。”
    • 添加角色。这可以帮助模型返回更符合您需求的内容。
    • 指定输出语言。如果您用英语提示模型,但需要非英语响应,请在提示中指定输出语言。例如:“请用西班牙语改写以下句子。Hola, cómo estás”。
    • 负责任地使用 AI 能力。生成式 AI 模型可以帮助您或您的用户提高生产力,增强创造力和学习。我们期望您根据 Google 的生成式 AI 禁用用途政策使用并参与这项技术。
  • DONTs

    • 避免有正确或错误答案的用例。模型可能太小,无法正确回答知识问题,并且可能在依赖于完美答案的任务上表现不佳。在设计功能或 UX 时请考虑这些不完美之处。
    • 避免绕过用户的用例。大语言模型可能并不总是有令人满意的回应。因此,最好将您的 AI 功能定位为支持用户任务的工具(例如生成用户可以快速查看和调整的潜在关键字列表)。
    • 避免自定义参数。虽然可以更改参数(如 temperaturetopK),但我们强烈建议您保持默认值,除非您已经用尽了提示的想法或需要模型表现不同。

如何使用控制序列 <ctrl23>

控制序列帮助模型理解模拟交互的轮次以及何时应该响应。它由常规字符 < c t r l 2 3 > 组成。它不是需要通过按下各种修饰键插入的特殊代码。

单次提示示例

例如,如果您想检索一篇文章的摘要。您可以分享一篇文章的完整文本和预期输出的示例,以及控制序列。然后,包含您的完整文章和请求的输出:

[完整示例文章文本]
这篇文章的改写摘要是:[示例摘要]<ctrl23>[要总结的文章全文]
这篇文章的改写摘要是:
少次提示

通过更多的示例,模型更可能分享更接近您预期的结果。以下是一个总结文章的少次提示示例:

[完整示例文章 #1 文本]
这篇文章的改写摘要是:[示例摘要 #1]<ctrl23>[完整示例文章 #2 文本]
这篇文章的改写摘要是:[示例摘要 #2]<ctrl23>[完整示例文章 #3 文本]
这篇文章的改写摘要是:[示例摘要 #3]<ctrl23>[要总结的文章全文]
这篇文章的改写摘要是:

分享您的反馈

调查

我们将持续发送调查,以了解 API 和任务特定 API 方法的效果,收集关于流行用例、问题等的信号。

质量或技术问题反馈表

如果您遇到质量或技术问题,请考虑分享详细信息。您的报告将帮助我们改进和完善模型、API 和 AI 运行时层的组件,以确保安全和负责任的使用。

其他反馈

对于其他问题或问题,请直接发送电子邮件至邮件列表所有者 ([email protected])。我们将尽最大努力尽快回应,或者在更合适的时候更新现有文档(例如添加到 FAQ 部分)。

FAQ

参与早期预览计划

退出和取消订阅

要退出早期预览计划,请发送电子邮件至:

加入

如果您知道有人想加入该计划,请让他们填写此表单,并在回答调查的最后一个问题时表达他们提供反馈的热情!

macOS 上的兼容性问题

使用 Rosetta 在 ARM 上运行 x64 版本的 Chromium 既未测试也未维护,可能会导致意外行为。请检查生成 Chromium 的所有工具是否为 ARM 原生。

输出质量

Prompt API 的当前实现主要用于实验,可能不反映与我们打算发布的任务 API 集成时的最终输出质量。

话虽如此,如果您发现模型生成有害内容或有问题的响应,我们鼓励您分享输出质量的反馈。您的报告对于帮助我们改进和完善模型、API 和 AI 运行时层的组件以确保安全和负责任使用非常宝贵。

是否有办法知道输入提示的 token 长度?

目前没有。我们承认这很不方便。对于拉丁语系语言,考虑使用这个经验法则:一个 token 大约是四个字符长。

上下文窗口的长度是多少?

默认上下文窗口设置为 1024 个 tokens。对于 Gemini Nano,理论最大值为 32k,但上下文大小与性能之间存在权衡。

当提示中的 tokens 数量超过上下文窗口时会发生什么?

当前设计仅考虑给定输入中的最后 N 个 tokens。因此,在提示中提供过多文本,可能会导致模型忽略提示的开头部分。例如,如果提示以“将以下文本翻译成英语:…”开头,前面有数千行文本,模型可能不会收到提示的开头部分,从而无法提供翻译。

使用流执行时某些提示会停止。

如果您能重现该问题,请告知我们:提示、会话选项、设备详细信息等。同时,重新启动 Chrome 并重试。

最后的故障排除

如果一切都失败了:

  1. 打开一个新标签
  2. 转到 chrome://gpu
  3. 下载报告
  4. 与早期预览计划协调员分享。

附录

完整的 API 表面

完整的 API 表面如下所述。有关语言的详细信息,请参阅 Web IDL。

partial interface WindowOrWorkerGlobalScope {
  readonly attribute AI ai;
}

[Exposed=(Window,Worker)]
interface AI {
  Promise<AIModelAvailability> canCreateTextSession();
  Promise<AITextSession> createTextSession(optional AITextSessionOptions options = {});
  Promise<AITextSessionOptions> defaultTextSessionOptions();
};

[Exposed=(Window,Worker)]
interface AITextSession {
  Promise<DOMString> prompt(DOMString input);
  ReadableStream promptStreaming(DOMString input);
  undefined destroy();
  AITextSession clone(); // 尚未实现(请参阅持久性和克隆的上下文)
};

dictionary AITextSessionOptions {
  [EnforceRange] unsigned long topK;
  float temperature;
};

enum AIModelAvailability {
  "readily",
  "after-download",
  "no"
};

异常的完整列表

方法 DOMExceptions 错误消息 注释
所有方法 InvalidStateError 执行上下文无效。 JS 上下文无效(例如分离的 iframe)。
补救措施:确保从有效的 JS 上下文调用 API。
createTextSession, defaultTextSessionOptions OperationError 模型执行服务不可用。 补救措施:重试,可能在重新启动 Chrome 后。
UnknownError 发生未知错误: 补救措施:重试,可能在重新启动 Chrome 后。
如果您陷入困境并/或可以轻松