提前体验Chrome离线Gemini Nano AI新特性

1.Chrome新Gemini Nano AI 安装开启教程

1.0 下载并更新 Dev/Canary Chrome浏览器

您需要下载Chrome Dev channelCanary channel版本。

  • 确保您的Chrome版本至少为128.0.6545.0。
  • Windows版本 10,11, MacOS版本>=13
  • 显卡空间最小4GB

  • Chrome Dev channel https://www.google.com/chrome/dev/
  • Canary channel https://www.google.com/chrome/canary/

1.1 设置系统和浏览器语言

  • 将您的操作系统语言设置为英语(美国)。
  • 同样,您可能需要将Chrome浏览器的语言更改为英语(美国)。
  • 请注意,这可能不再是一个硬性要求。

1.2 启用Gemini Nano和Prompt API

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

  • 打开Chrome的新标签页,访问chrome://flags/#optimization-guide-on-device-model
  • 选择“Enabled BypassPerfRequirement”以绕过可能阻碍Gemini Nano下载的性能检查。
  • 转到chrome://flags/#prompt-api-for-gemini-nano
  • 选择“Enabled”。
  • 重新启动Chrome。

1.3 确认Gemini Nano的可用性

  • 打开DevTools,在控制台中输入并发送await window.ai.canCreateTextSession();
  • 如果返回“readily”,则表示设置成功。
  • 否则,请重新启动Chrome并继续以下步骤。

1.4 检查Gemini Nano组件

  • 打开Chrome的新标签页,访问chrome://components
  • 确认Gemini Nano组件是否可用或正在下载。
  • 您希望看到的是Optimization Guide On Device Model,其版本应大于或等于2024.5.21.1031。
  • 如果没有列出版本,请单击“Check for update”以强制下载。

1.5 完成设置并验证

  • 一旦模型下载完毕,并且版本号符合要求,重新打开DevTools,再次发送await window.ai.canCreateTextSession();
  • 如果返回“readily”,则表示您已成功设置。
  • 如果仍然失败,请重新启动,稍等片刻,然后从第1步开始重试。
  • 如果问题依旧存在,请参考故障排除部分。

1.6 安装配置体验

尽管Gemini Nano AI技术令人兴奋,但目前我们还不能直接在浏览器中体验它。 浏览器环境仅提供了对JavaScript API的访问,这意味着要充分利用Gemini Nano AI的全部功能,我们需要一个专门的Web应用程序。幸运的是,开发者们已经为我们准备了这样一个平台。

http://mojotv.cn/chrome-gemini-nano-playground

2. 浏览器Javascript API

2.1 Sample 简单版本

首先检查是否可以基于模型的可用性和设备的特性来创建会话。

const canCreate = await window.ai.canCreateTextSession();

canCreate 将有以下几种可能的值:

  • “readily”:模型已在设备上可用,因此创建会话会很快发生。
  • “after-download”:模型尚未在设备上可用,但设备是兼容的,因此创建会话将启动下载过程(这可能需要一些时间)。
  • “no”:此设备上没有可用的模型。

如果 canCreate 不等于 “no”,则可以继续创建会话:

if (canCreate !== "no") {
  const session = await window.ai.createTextSession();

  // 向模型提出问题并等待整个结果返回。
  const result = await session.prompt("Write me a poem");
  console.log(result);
}

这段代码首先调用 window.ai.canCreateTextSession() 方法来确定是否可以创建文本会话。如果模型可用或可以下载,它将创建一个会话并使用 session.prompt() 方法向模型提出问题,例如要求模型写一首诗。 然后,代码等待模型处理请求并返回结果,最后将结果打印到控制台。如果设备上没有可用的模型,或者设备不兼容,canCreate 将返回 “no”,并且不会创建会话。

2.2 Streaming version 流式版本

const canCreate = await window.ai.canCreateTextSession();

首先,检查是否可以基于模型的可用性和设备的特性来创建文本会话。

如果 canCreate 不等于 “no”,则可以继续创建会话:

if (canCreate !== "no") {
  const session = await window.ai.createTextSession();

  // 向模型提出问题并流式传输结果:
  const stream = session.promptStreaming("Write me an extra-long poem");
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

这段代码首先调用 window.ai.canCreateTextSession() 方法来确定是否可以创建文本会话。如果模型可用或可以下载,它将创建一个会话并使用 session.promptStreaming() 方法向模型提出问题,例如要求模型写一首很长的诗。然后,代码使用 for await...of 循环来逐块接收并打印模型返回的结果。 这种方式允许结果逐渐显示,而不是一次性显示整个响应,这对于处理长文本或实时更新非常有效。如果设备上没有可用的模型,或者设备不兼容,canCreate 将返回 “no”,并且不会创建会话或流式传输结果。

2.3 Session options 会话选项

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

const defaults = await window.ai.defaultTextSessionOptions();
const session = await window.ai.createGenericSession(
    {
      temperature: 0.6, 
      topK: defaults.topK
    }
);

temperature 参数控制生成文本的创造性,较高的值会增加结果的多样性。topK 参数控制从可能的下一个词中选择时考虑的词的数量,较高的值可以增加生成文本的连贯性。

2.4 Terminating a session 终止会话

如果您不再需要会话,可以调用 destroy() 来释放资源。当会话被销毁时,它将不再可用,并且任何正在进行的执行将被中止。如果您打算经常向模型提问,您可能希望保留会话,因为创建会话可能需要一些时间。

await session.prompt(`
  You are a friendly, helpful assistant specialized in clothing choices.
`);

session.destroy();

销毁会话后,尝试再次使用会话将会导致错误。

// Promise 将因会话已被销毁而被拒绝,并附带解释错误的信息。
await session.prompt(`
  What should I wear today? It's sunny and I'm unsure between a t-shirt and a polo.
`);

这段代码演示了如何创建一个具有特定参数的会话,并使用它来向模型提出问题。然后,它展示了如何销毁会话以及销毁会话后尝试再次使用会话会发生什么。

2.5 Streaming

当前,promptStreaming() 方法返回一个 ReadableStream,其块(chunks)是相互叠加的。例如,下面的代码会依次记录一个序列,比如 “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);

这段代码的意思是,我们初始化一个空字符串 result 来累积最终结果,并使用 previousLength 来记录上一个块的结束位置。在每次迭代中,我们通过 slice 方法从当前块中提取从上一个块结束位置开始的新内容,并将其打印出来。 然后,我们将 previousLength 更新为当前块的长度,并将新内容追加到 result 字符串中。最后,打印出累积的最终结果。

3 FAQ

3.1 输出质量

当前的Prompt API实现主要是为了实验,可能不会反映我们计划与任务API一起发布的最终输出质量。

话虽如此,如果你看到模型生成了有害内容或有问题的回应,我们鼓励你分享关于输出质量的反馈。你的报告对于帮助我们改进和完善我们的模型、API和AI运行时层的组件,确保安全和负责任的使用是无价的。

3.2 有没有办法知道输入提示的token长度?

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

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

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

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

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

3.5 使用流执行时,一些提示会停止。

如果你能重现这个问题,请告诉我们:提示、会话选项、设备详情等。与此同时,重新启动Chrome再试一次。

AI API

AI API提供了一个与Web IDL定义的语言兼容的接口集合,允许我们在Web页面或Web Worker中轻松集成AI功能。

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(); // Not yet implemented (see persistence and cloning for context)
};

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

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

WindowOrWorkerGlobalScope接口: 首先,我们看到WindowOrWorkerGlobalScope接口,这是一个部分接口,它提供了一个只读属性ai。这意味着无论是在浏览器窗口还是Web Worker中,我们都可以通过window.aiworkerGlobalScope.ai访问AI功能。

AI接口: 接下来是AI接口,它提供了几个关键的方法:

  • canCreateTextSession(): 返回一个Promise,告诉我们是否能够创建文本会话。
  • createTextSession(options): 创建一个新的文本会话,options是一个可选参数,用于定义会话的配置。
  • defaultTextSessionOptions(): 返回默认的文本会话选项。

AITextSession接口: AITextSession接口提供了与AI模型交互的方法:

  • prompt(input): 接收一个输入字符串,返回一个Promise,其中包含AI模型的响应。
  • promptStreaming(input): 接收一个输入字符串,返回一个ReadableStream,用于流式传输AI模型的响应。
  • destroy(): 销毁当前的文本会话。
  • clone(): 克隆当前的文本会话,但目前尚未实现。

AITextSessionOptions字典: 这个字典定义了可以传递给createTextSession方法的选项:

  • topK: 一个无符号长整数,用于定义模型生成响应时考虑的前K个概率最高的选项。
  • temperature: 一个浮点数,用于控制模型生成响应的随机性。

AIModelAvailability枚举: 最后,AIModelAvailability枚举定义了模型的可用性状态:

  • readily: 模型已经准备好使用。
  • after-download: 模型需要下载后才能使用。
  • no: 模型当前不可用。

附注

  • https://docs.google.com/document/d/1VG8HIyz361zGduWgNG7R_R8Xkv0OOJ8b5C9QKeCjU0c/edit#heading=h.8sq1lhu4vsb6
  • 视频教程 https://www.bilibili.com/video/BV1jf421Q7S8/?vd_source=686e239bf2d58dc1425f04669317f5db
  • chrome新AI Gemini Nano 模型离线体验前端地址 https://mojotv.cn/gemini (必须按照上面教程开启AI feature才能正常运行)
目录