深度探索 | 新版 Chrome 内置 AI 模型 Gemini Nano 使用指南
Gemini Nano 简介
在Gemini家族里,Nano是最小的那个,但它可不是“体验版”或者“缩水版”——它是专门为了让AI在设备本地跑起来而设计的。换句话说,它已经内建在Chrome浏览器里了,只要你的电脑配置不算太老,就能在本地运行它,完全不依赖云端。摘要、翻译、写作这类常见需求,它都能干。而且,它完全支持本地和离线使用,当然,也不用另外付费。
默认情况下,Gemini Nano的上下文窗口是1024个令牌。从技术上说,它可以最多扩展到32k,但容量大了性能就会打折扣,这个权衡得心里有数。
在设备上跑有哪些好处?
- :不用把数据传到云端,安全。
敏感数据本地处理
- :没网的时候它照样干活。
离线也能用AI
安装和配置
系统要求
你得用Chrome Canary或Chrome Dev,版本不低于128.0.6545.0。特别提醒一下,Chrome在127和128之间出过一个回退问题,所以最好用这个版本或者更高。
另外,Chrome下载和运行Gemini Nano还得满足下面这些条件:
| 方面 | Windows | MacOS | Linux |
|---|---|---|---|
操作系统 |
10, 11 | ≥ 13 (Ventura) | 未指定 |
存储器 |
包含Chrome配置文件的卷上至少有22GB可用空间。注意,模型实际占用小得多,这里只是留足余量。 | ||
GPU |
集成或独立显卡 | ||
显存 |
4GB(最低) | ||
网络连接 |
非计量连接 |
目前尚不支持:
安装步骤
启用Gemini Nano和Prompt API
-
在Chrome里打开新标签页,访问
chrome://flags/#optimization-guide-on-device-model -
选择“启用 BypassPerfRequirement”。这一步是为了绕过性能检查,避免它阻止模型下载到你的设备上。
-
访问
chrome://flags/#prompt-api-for-gemini-nano
-
选择“启用”。
-
重启Chrome。
确认Gemini Nano是否可用
-
打开开发者工具,在控制台输入
await window.ai.canCreateTextSession();。如果返回“readily”,那就说明一切就绪了。
- 如果没返回,那就强制Chrome识别你想用这个API。在控制台输入
await window.ai.createTextSession();。 - 再次重启Chrome,打开新标签页,访问
chrome://components。 - 确认“Optimization Guide On Device Model”的版本号是否大于等于 。
2024.5.21.1031
- 如果没看到版本号,点击“检查更新”来强制下载。

故障排除方法
有些用户在组件里找不到“Optimization Guide On Device Model”。根据一些用户的反馈,下面这个步骤可能管用:
把
chrome://flags/#optimization-guide-on-device-model设置为“启用”而不是“启用并绕过性能要求”,然后再按步骤走一遍。
在实际设置中,我试过最新的Chrome Dev和Canary,启用了Gemini Nano和Prompt API后,重启Chrome,在components里就是找不到它。重复了两次都不行。后来把“test third party cookie phaseout”设置为“enabled”,等了几分钟,在Chrome Canary里终于看到了。
模型下载延迟
浏览器可能不会立刻开始下载模型。如果你的电脑满足所有条件,但调用 window.ai.createTextSession() 之后,在 chrome://components 上没看到下载开始,而且“优化指南设备内模型”显示版本0.0.0.0,那就保持浏览器打开几分钟,等调度程序触法下载。
我的体验
下面这张图是我写的一些脚本,和Gemini对话的过程。
在写脚本的过程中,反复测试、调整提示词,以及topK和temperature参数。一个直观的感受是,Gemini Nano的回复不稳定——Nano这个模型说到底还是太小了。折腾了好久,后来发现同类产品也有类似的问题。
也试过几个插件,对比下来,下面这个相对稳定一些:
当然,它也不算完美,但对比了四五个产品之后,它确实是最稳的。
另外,aichrome.net 这个网站可以检测你的浏览器是否支持Chrome内置AI。
使用指南
基本使用示例
// 首先检查是否可以创建会话,这取决于模型的可用性和设备的特征。
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("给我写一首诗");
console.log(result);
}
这段代码展示了如何用Gemini Nano API创建文本会话并生成内容。先检查能否创建会话,再根据结果决定是否继续。如果能创建,就发一个提示(比如“给我写一首诗”),等模型生成完响应,最后输出到控制台。
流式传输示例
const canCreate = await window.ai.canCreateTextSession();
if (canCreate !== "no") {
const session = await window.ai.createTextSession();
// 向模型提供提示并流式传输结果:
const stream = session.promptStreaming("给我写一首特别长的诗");
for await (const chunk of stream) {
console.log(chunk);
}
}
这段代码展示了流式传输功能。主要步骤是:先检查能否创建会话,能的话就创建一个,然后用 promptStreaming 方法发提示(比如要求写一首长诗),再通过 for await...of 循环逐块接收并处理模型生成的内容,每收到一个数据块就打印出来。
会话选项和管理
每个会话都可以通过topK和temperature来调节。这些参数的默认值可以通过 window.ai.defaultTextSessionOptions() 获取。
const defaults = await window.ai.defaultTextSessionOptions();
const session = await window.ai.createGenericSession({
temperature: 0.6,
topK: defaults.topK
});
终止会话
如果某个会话不再需要,可以调用 destroy() 来释放资源。会话销毁后就不能再用了,正在进行的执行也会被中止。如果你打算频繁提问,保留会话可能更好,因为创建会话需要时间。
await session.prompt(`
你是一个友好、乐于助人的助手,专门提供服装选择建议。
`);
session.destroy();
// 这个 promise 会被拒绝,并返回一个错误,解释会话已被销毁。
await session.prompt(`
今天我该穿什么?天气晴朗,我在T恤和polo衫之间犹豫不决。
`);
流式传输
目前,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);
从 Chrome 128.0.6606.0 开始,会话期间发送给模型的信息会被保留,不需要每次都重新发整个对话。换句话说,每次调用 prompt() 或 promptStreaming() 都是连续的交互。不过要注意,上下文窗口会随着每次提示不断填充,最终会开始淘汰最旧的令牌。如果想重新开始,可能需要调用 destroy() 或者新建一个会话。
提示建议
| 应该做的 | 不应该做的 |
|---|---|
在提示中包含示例。 |
避免有对错之分的用例。 |
添加规则。 |
避免绕过用户的用例。 |
添加角色。 |
避免自定义参数。 |
指定输出语言。 |
如何使用控制序列
控制序列用于帮助模型理解对话回合以及何时该回应。下面是一个使用示例:
单次提示示例
"[示例文章的全文]
这篇文章的改写摘要是:[示例摘要]
[要summarize的文章全文]
这篇文章的改写摘要是:"
少量示例提示
"[示例文章#1的全文]
这篇文章的改写摘要是:[示例摘要#1]
[示例文章#2的全文]
这篇文章的改写摘要是:[示例摘要#2]
[示例文章#3的全文]
这篇文章的改写摘要是:[示例摘要#3]
[要summarize的文章全文]
这篇文章的改写摘要是:"
异常处理和故障排除
| 方法 | DOM异常 | 错误消息 | 注释 |
|---|---|---|---|
All methods |
InvalidStateError |
执行上下文无效。 | JS上下文无效(例如,已分离的iframe)。确保从有效的JS上下文调用API。 |
createTextSession, defaultTextSessionOptions |
OperationError |
模型执行服务不可用。 | 重试,可能需要重启Chrome。 |
流式传输时 |
UnknownError |
发生未知错误:<错误代码> | 重试,可能需要重启Chrome。 |
NotSupportedError |
请求无效。 | ||
UnknownError |
发生了其他一般性故障。 | ||
NotReadableError |
响应被禁用。 | ||
AbortError |
请求被取消。 | ||
prompt, promptStreaming |
InvalidStateError |
模型执行会话已被销毁。 | 发生在会话被销毁后调用prompt或promptStreaming时。创建一个新会话。 |
createTextSession |
NotSupportedError |
初始化新会话时必须同时指定topK和temperature,或者两者都不指定。 | 发生在调用createTextSession时只指定部分可选参数。调用时要同时指定topK和temperature,或者都不指定。如果只想改一个参数,用defaultTextSessionOptions里的值。 |
InvalidStateError |
无法创建会话。 | 如果 canCreateTextSession 返回“readily”,则不应发生。重试,可能需要重启Chrome。 |
更多内容,可查看 prompt API explainer。
未来应用场景
等Chrome内置AI能力再提升一些,可能的应用场景包括:
- :浏览外语网页时一键翻译整个页面,相比传统翻译,AI模型能更好地理解上下文,翻译更自然准确。
智能翻译插件
- :阅读长文章时自动生成关键摘要,帮用户快速把握主旨,提高阅读效率。
内容摘要生成器
- :输入搜索词时自动扩展和优化查询,帮助找到更相关的结果。
智能搜索助手
- :浏览技术博客或代码仓库时自动解释复杂代码段,帮开发者更快理解陌生代码。
代码解释器
- :填写在线表单时根据字段名和类型自动推荐内容,简化过程,提高准确性。
智能表单填充
- :基于浏览历史和当前页面内容推荐相关文章或产品,提供更精准的个性化体验。
个性化内容推荐
- :在浏览器中写作时提供实时建议和纠错,提高写作质量。
实时写作助手
- :填写敏感信息时提醒隐私风险并提供保护建议。
隐私保护助手
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名