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 日之后)
先决条件
- 确认 Google 的生成式 AI 禁用用途政策。
- 下载 Chrome 开发频道,并确认您的版本高于 127.###.###.###。
- 检查您的设备是否符合要求。
启用 Gemini Nano 和 Prompt API
按照以下步骤启用 Gemini Nano 和 Prompt API 标志进行本地实验:
- 在 Chrome 中打开一个新标签页,转到
chrome://flags#optimization-guide-on-device-model
- 选择 Bypass Perf Requirements
- 转到
chrome://flags#prompt-api
- 选择 Enabled
- 重新启动 Chrome。
确认 Gemini Nano 的可用性
- 打开 DevTools 并在控制台中发送
await window.ai.canCreateTextSession();
。如果返回“yes”,那么您就准备就绪了。- 否则,重新启动 Chrome 并继续以下步骤。
- 在 Chrome 中打开一个新标签页,转到
chrome://components
- 确认 Gemini Nano 可用或正在下载
- 您需要看到版本大于等于 2024.5.21.1031 的 Optimization Guide On Device Model。
- 如果没有列出版本,请点击 Check for update 强制下载。
- 一旦模型下载完成并达到上述版本,在 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);
}
}
会话选项
每个会话都可以使用 topK
和 temperature
进行自定义。这些参数的默认值由 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
为了编写最佳提示,我们建议阅读以下内容:
- People + AI 指南 讨论了何时、如何使用 AI(包括 UX 示例)。
- 提示设计策略 提供了如何最好地提示大语言模型的具体指导。
此外,这里是我们对 Chrome 中 Gemini Nano 的建议。
DOs 和 DONTs
-
DOs
- 包含示例以指导您的提示。一个示例或单次提示比没有示例更好。少次提示在指导模型返回预期结果方面最好。
- 添加规则。通过在提示中添加规则,可以提高输出的质量。例如:“以友好的语气回应”,“如果不清楚,请使用‘模棱两可’类别”,“不要提供任何解释。”
- 添加角色。这可以帮助模型返回更符合您需求的内容。
- 指定输出语言。如果您用英语提示模型,但需要非英语响应,请在提示中指定输出语言。例如:“请用西班牙语改写以下句子。Hola, cómo estás”。
- 负责任地使用 AI 能力。生成式 AI 模型可以帮助您或您的用户提高生产力,增强创造力和学习。我们期望您根据 Google 的生成式 AI 禁用用途政策使用并参与这项技术。
-
DONTs
- 避免有正确或错误答案的用例。模型可能太小,无法正确回答知识问题,并且可能在依赖于完美答案的任务上表现不佳。在设计功能或 UX 时请考虑这些不完美之处。
- 避免绕过用户的用例。大语言模型可能并不总是有令人满意的回应。因此,最好将您的 AI 功能定位为支持用户任务的工具(例如生成用户可以快速查看和调整的潜在关键字列表)。
- 避免自定义参数。虽然可以更改参数(如
temperature
和topK
),但我们强烈建议您保持默认值,除非您已经用尽了提示的想法或需要模型表现不同。
如何使用控制序列 <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 并重试。
最后的故障排除
如果一切都失败了:
- 打开一个新标签
- 转到
chrome://gpu
- 下载报告
- 与早期预览计划协调员分享。
附录
完整的 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 后。 | |
如果您陷入困境并/或可以轻松 |