Prompt API

发布时间:2024 年 11 月 11 日;最后更新时间:2025 年 5 月 20 日

说明类视频 Web 扩展程序 Chrome 状态 意向
GitHub 实验性EPP Chrome 138 视图 意图进行实验

借助 Prompt API,您可以在浏览器中向 Gemini Nano 发送自然语言请求。

您可以通过多种方式在 Chrome 扩展程序中使用 Prompt API。例如:

  • 即时日历活动。开发一个 Chrome 扩展程序,用于自动从网页中提取活动详情,以便用户只需几步即可创建日历条目。
  • 顺畅地提取联系人。构建一个可从网站中提取联系信息的扩展程序,让用户更轻松地与商家联系或向其联系人列表中添加详细信息。
  • 动态内容过滤。创建一个 Chrome 扩展程序,用于分析新闻报道,并根据用户定义的主题自动模糊处理或隐藏内容。

以上只是一些可能的用途,我们期待看到您的创作成果。

查看硬件要求

语言检测器 API 和 Translator API 仅适用于桌面版 Chrome。

当满足以下条件时,Prompt API、Summarizer API、Writer API 和 Rewriter API 可在 Chrome 中正常运行:

  • 操作系统:Windows 10 或 11;macOS 13 或更高版本(Ventura 及更高版本);或 Linux。由 Gemini Nano 支持的 API 尚不支持 Android 版、iOS 版和 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:默认的前 K 个值(默认值:3)。
  • maxTopK前 K 个值的数量上限 (8)。
  • defaultTemperature:默认温度 (1.0)。温度值必须介于 0.02.0 之间。
  • maxTemperature:最高温度。
await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 8, defaultTemperature: 1, maxTemperature: 2}

创建会话

Prompt API 可运行后,您可以使用 create() 函数创建会话。您可以使用 prompt()promptStreaming() 函数向模型提示。

自定义会话

您可以使用可选的 options 对象,通过 topKtemperature 自定义每个会话。这些参数的默认值会从 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() 函数的可选 options 对象还接受 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 字段的可选选项对象,以便您传递 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 上找到。

Prompt API 的演示接口

参与并分享反馈

您的反馈将直接影响我们构建和实现此 API 以及所有内置 AI API 的未来版本的方式。