在 Chrome 中使用内置 AI 功能进行摘要

发布时间:2024 年 11 月 11 日

想象一下,您可以让用户能够将冗长的文章、复杂的文档甚至生动的聊天对话提炼成简洁而富有洞见的摘要。

Summarizer API 可用于生成不同长度和格式的不同类型的摘要,例如句子、段落、项目符号列表等。我们认为此 API 在以下情况下非常有用:

  • 总结某篇文章或聊天对话的要点。
  • 为文章建议标题和标题。
  • 为长篇幅文本创建简明扼要的信息性摘要。
  • 根据图书评价为图书生成预告片。

可用性

  • 加入 Summarizer API 源试用(从 Chrome 131 到 Chrome 136),在正式版中使用真实用户测试该 API。初始试用会为您源网域中使用 Chrome 的所有用户启用该功能。了解如何开始使用来源试用版
    • 虽然可能存在使用限制,但您可以集成这些功能以进行实时测试和收集用户反馈。我们的目标是,在我们努力扩大此 API 的适用范围时,为其未来的迭代提供参考。
  • 请在 Chrome 状态中了解我们的实现方式。
  • Summarizer API 提案是一系列编写 API 的一部分,欢迎大家讨论
  • 加入早期预览版计划,抢先体验新的内置 AI API,并参与论坛上的讨论。

源试用期间的限制

在源试用期间,Summarizer API 仅支持英语文本的摘要,因为模型质量仅在英语内容上进行了全面测试。我们打算在测试其他语言的质量和安全性,并在 API 广泛推出后解除此限制。

使用 Summarizer API

首先,运行功能检测以查看浏览器是否支持 Summarizer API。

if ('ai' in self && 'summarizer' in self.ai) {
  // The Summarizer API is supported.
}

模型下载

Summarizer API 使用经过训练可生成高质量摘要的强大 AI 模型。虽然该 API 已内置到 Chrome 中,但网站首次使用该 API 时,系统会单独下载该模型。

如需确定模型是否可供使用,请调用异步 ai.summarizer.capabilities() 函数。它会返回一个 AISummarizerCapabilities 对象,其中包含一个 available 字段,该字段可以采用以下三种可能的值:

  • no:当前浏览器支持 Summarizer API,但目前无法使用。这可能有多种原因,例如可用磁盘空间不足,无法下载模型。
  • readily:当前浏览器支持 Summarizer API,可立即使用。
  • after-download:当前浏览器支持 Summarizer API,但需要先下载模型。

如需触发模型下载并创建摘要生成器,请调用异步 ai.summarizer.create() 函数。如果对 capabilities() 的响应为 after-download,最佳实践是监听下载进度。这样,如果下载需要一些时间,您就可以通知用户。

const summarizer = await ai.summarizer.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  }
});

API 功能

借助 create() 函数,您可以根据需要配置新的摘要器对象。它接受一个可选的 options 对象,该对象具有以下参数:

  • sharedContext:可帮助摘要生成器的其他共享上下文。
  • type:汇总的类型,允许的值为 key-points(默认值)、tl;drteaserheadline
  • format:摘要的格式,允许的值为 markdown(默认值)和 plain-text
  • length:摘要的长度,允许的值为 shortmedium(默认值)和 long。这些长度的含义因请求的 type 而异。例如,在 Chrome 的实现中,一个简短的要点摘要由 3 个项目符号组成,一个简短摘要由一句话组成;一个长要点摘要由 7 个要点组成,而一份长摘要则由一个段落组成。

以下示例演示了如何初始化摘要生成器。

const options = {
  sharedContext: 'This is a scientific article',
  type: 'key-points',
  format: 'markdown',
  length: 'medium',
};

const available = (await self.ai.summarizer.capabilities()).available;
let summarizer;
if (available === 'no') {
  // The Summarizer API isn't usable.
  return;
}
if (available === 'readily') {
  // The Summarizer API can be used immediately .
  summarizer = await self.ai.summarizer.create(options);
} else {
  // The Summarizer API can be used after the model is downloaded.
  summarizer = await self.ai.summarizer.create(options);
  summarizer.addEventListener('downloadprogress', (e) => {
    console.log(e.loaded, e.total);
  });
  await summarizer.ready;
}

运行汇总器

运行总结器的方式有两种:流式传输和非流式传输。

非流式摘要

使用非流式摘要时,模型会将输入作为一个整体进行处理,然后生成输出。

如需获取非流式摘要,请调用总结器的异步 summarize() 函数。该函数的第一个参数是您要总结的文本。第二个可选参数是包含 context 字段的对象。您可以在此字段中添加有助于改进摘要的背景详细信息。

const longText = document.querySelector('article').innerHTML;
const summary = await summarizer.summarize(longText, {
  context: 'This article is intended for a tech-savvy audience.',
});

流式摘要

流式总结功能会实时提供结果。随着输入的添加和调整,输出会不断更新。

如需获取流式摘要,请调用总结程序的 summarizeStreaming() 函数。然后,迭代流中可用的文本片段。

let result = '';
let previousChunk = '';
for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

summarizeStreaming() 会返回一个 ReadableStream,其中响应片段会依次构建。这意味着,每个响应都包含到该时间点生成的整个摘要,而不仅仅是下一个片段,这并不是预期的行为。

我们打算与平台上的其他流式传输 API 保持一致,其中片段是单个长流的连续部分。目前,为了实现预期行为,您可以实现以下代码:

let result = '';
let previousLength = 0;
for await (const segment of stream) {
  const newContent = segment.slice(previousLength);
  console.log(newContent);
  previousLength = segment.length;  
  result += newContent;
}
console.log(result);

演示

您可以在 Summarizer API Playground 中试用 Summarizer API。

标准化工作

我们正在努力标准化 Summarizer API,以确保跨浏览器兼容性。

我们的 API 提案获得了社区支持,并已移至 W3C Web Incubator 社区群组以供进一步讨论。Chrome 团队向 W3C 技术架构组征求了反馈,并询问了 MozillaWebKit 的标准立场。

参与并分享反馈

立即加入源试用,开始测试 Summarizer API,并分享您的反馈。您的反馈将直接影响我们构建和实现此 API 及所有内置 AI API 的未来版本的方式。