发布时间:2024 年 11 月 11 日;上次更新时间:2025 年 5 月 20 日
说明类视频 | Web | 扩展程序 | Chrome 状态 | 意向 |
---|---|---|---|---|
GitHub | 视图 | 实验意向 |
借助 Prompt API,您可以向浏览器中的 Gemini Nano 发送自然语言请求。
您可以在 Chrome 扩展程序中通过多种方式使用 Prompt API。 例如:
- 即时日历活动。开发一款可自动从网页中提取活动详情的 Chrome 扩展程序,以便用户只需几个步骤即可创建日历条目。
- 无缝提取联系人信息。构建一个可从网站提取联系信息的扩展程序,让用户更轻松地联系商家或向其联系人列表添加详细信息。
- 动态内容过滤。创建一个 Chrome 扩展程序,用于分析新闻文章并根据用户定义的主题自动模糊或隐藏内容。
以上只是几个示例,我们期待看到您的创作成果。
查看硬件要求
语言检测器和翻译器 API 仅在 Chrome 桌面版中有效。
当满足以下条件时,Prompt API、Summarizer API、Writer API 和 Rewriter API 可在 Chrome 中正常运行:
- 操作系统:Windows 10 或 11;macOS 13 及更高版本(Ventura 及更高版本);或 Linux。由 Gemini Nano 提供支持的 API 尚不支持 Android 版 Chrome、iOS 版 Chrome 和 ChromeOS 版 Chrome。
- 存储空间:包含 Chrome 个人资料的卷上至少有 22 GB 的可用空间。
- GPU:VRAM 严格大于 4 GB。
- 网络:无限流量或非按流量计费的连接。
您在开发过程中以及使用您构建的功能的用户都需要满足这些要求。
在扩展服务中使用 Prompt API
在使用此 API 之前,请确认您已了解《Google 的生成式 AI 使用限制政策》。
LanguageModel
命名空间中有两个可供您使用的扩展函数:
availability()
,以查看模型的功能以及是否可用。create()
即可开始语言模型会话。
模型下载
Prompt API 使用 Chrome 中的 Gemini Nano 模型。虽然该 API 已内置到 Chrome 中,但扩展程序首次使用该 API 时,系统会单独下载相应模型。
如需确定模型是否已准备就绪,请调用异步 LanguageModel.availability()
函数。此方法应返回以下某个响应:
"unavailable"
表示实现不支持所请求的选项,或者根本不支持提示语言模型。"downloadable"
表示实现支持所请求的选项,但必须先下载某些内容(例如语言模型本身或微调),然后才能使用这些选项创建会话。"downloading"
表示实现支持所请求的选项,但需要先完成正在进行的下载操作,然后才能使用这些选项创建会话。"available"
表示实现支持所请求的选项,而无需任何新的下载。
如需触发模型下载并创建语言模型会话,请调用异步 LanguageModel.availability()
函数。如果对 availability()
的响应为 'downloadable'
,则最好监听下载进度。这样,您就可以在下载需要时间时通知用户。
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener("downloadprogress", (e) => {
console.log(`Downloaded ${e.loaded * 100}%`);
});
},
});
模型功能
params()
函数可告知您语言模型的参数。该对象具有以下字段:
defaultTopK
:默认的 top-K 值(默认值:3
)。maxTopK
:最大 Top-K 值 (8
)。defaultTemperature
:默认温度 (1.0
)。温度值必须介于0.0
和2.0
之间。maxTemperature
:最高温度。
await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 8, defaultTemperature: 1, maxTemperature: 2}
创建会话
Prompt API 可以运行后,您可以使用 create()
函数创建会话。您可以使用 prompt()
或 promptStreaming()
函数提示模型。
自定义会话
您可以使用可选的 options 对象,通过 topK
和 temperature
自定义每个会话。这些参数的默认值是从 LanguageModel.params()
返回的。
const params = await LanguageModel.params();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
temperature: Math.max(params.defaultTemperature * 1.2, 2.0),
topK: params.defaultTopK,
});
create()
函数的可选选项对象还包含一个 signal
字段,可用于传递 AbortSignal
以销毁会话。
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const session = await LanguageModel.create({
signal: controller.signal,
})
初始提示
借助初始提示,您可以为语言模型提供有关之前互动的上下文,例如,允许用户在浏览器重启后继续之前存储的会话。
const session = await LanguageModel.create({
initialPrompts: [
{ role: 'system', content: 'You are a helpful and friendly assistant.' },
{ role: 'user', content: 'What is the capital of Italy?' },
{ role: 'assistant', content: 'The capital of Italy is Rome.'},
{ role: 'user', content: 'What language is spoken there?' },
{ role: 'assistant', content: 'The official language of Italy is Italian. [...]' }
]
});
会话次数限制
给定的语言模型会话可处理的令牌数量有上限。您可以使用会话对象的以下属性来查看使用情况和距离该限制的剩余量:
console.log(`${session.inputUsage}/${session.inputQuota}`);
会话持久性
每个会话都会跟踪对话的上下文。在会话的上下文窗口已满之前,系统会在未来的互动中考虑之前的互动。
const session = await LanguageModel.create({
initialPrompts: [{
role: "system",
content: "You are a friendly, helpful assistant specialized in clothing choices."
}]
});
const result1 = await session.prompt(
"What should I wear today? It is sunny. I am unsure between a t-shirt and a polo."
);
console.log(result1);
const result2 = await session.prompt(
"That sounds great, but oh no, it is actually going to rain! New advice?"
);
console.log(result2);
克隆会话
如需保留资源,您可以使用 clone()
函数克隆现有会话。对话上下文会重置,但初始提示会保持不变。clone()
函数接受一个带有 signal
字段的可选 options 对象,该字段可让您传递 AbortSignal
来销毁克隆的会话。
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const clonedSession = await session.clone({
signal: controller.signal,
});
提示模型
您可以使用 prompt()
或 promptStreaming()
函数提示模型。
非流式传输输出
如果您希望获得简短的结果,可以使用 prompt()
函数,该函数会在获得回答后立即返回回答。
// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const {defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
await LanguageModel.params();
const available = await LanguageModel.availability();
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and wait for the whole result to come back.
const result = await session.prompt("Write me a poem!");
console.log(result);
}
流式输出
如果您希望获得更长的回答,则应使用 promptStreaming()
函数,该函数可让您在模型返回部分结果时显示这些结果。promptStreaming()
函数会返回一个 ReadableStream
。
const {defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
await LanguageModel.params();
const available = await LanguageModel.availability();
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and stream the result:
const stream = session.promptStreaming('Write me an extra-long poem!');
for await (const chunk of stream) {
console.log(chunk);
}
}
停止运行提示
prompt()
和 promptStreaming()
都接受带有 signal
字段的可选第二个参数,该参数可让您停止运行提示。
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const result = await session.prompt(
'Write me a poem!',
{ signal: controller.signal }
);
终止会话
如果您不再需要会话,请调用 destroy()
以释放资源。当会话被销毁时,它将无法再使用,并且任何正在进行的执行都会中止。如果您打算经常提示模型,则可能需要保持会话处于活动状态,因为创建会话可能需要一些时间。
await session.prompt(
"You are a friendly, helpful assistant specialized in clothing choices."
);
session.destroy();
// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
"What should I wear today? It is sunny, and I am unsure between a
t-shirt and a polo."
);
演示
如需在 Chrome 扩展程序中测试 Prompt API,请安装演示扩展程序。扩展程序源代码可在 GitHub 上获取。
参与并分享反馈
您的反馈可以直接影响我们构建和实现此 API 和所有内置 AI API 的未来版本的方式。
- 如需针对 Chrome 的实现提供反馈,请提交 bug 报告或功能请求。
- 如需就 API 形状分享反馈,请在现有问题中添加评论,或在 Prompt API GitHub 代码库中打开新问题。
- 下载 GitHub 上的 Prompt API 示例扩展程序。
- 加入 Web Incubator Community Group,参与标准制定工作。