想一想再戳进来:怎么用 JS 写一个智能总结工具?

💰 点进来就是赚到知识点!本文带你光速手搓一个 AI 总结工具点赞收藏评论更能促进消化吸收!

🚀 想解锁更多 Web AI 的强大能力吗?快来订阅专栏「Web AI 进化录」!

先尝后买

老规矩,先玩玩 Demo:一个用浏览器内置 AI 实现的文字提炼工具

直接看录屏效果也行:

假设(或者根本不用假设😜)你正在上班摸鱼,刷到了一篇万字长文《如何比 99% 的前端同行先帅(美)起来》,但显然摸鱼一刻值千金,你完全不想逐字逐句地读完。又或者你和产品经理在微信上高强度对需求一整个上午,下午开发时你实在懒得再把好几米长的聊天记录从头到尾翻一遍。

此时如果有一个趁手的工具,能把核心信息迅速提炼出来,让你提高效率、提前下班,岂不是很棒?

其实市面上也已经有非常多的此类服务了。在本文发布时,掘金官方就已经支持了为每篇文章生成智能总结。

但不是所有的文字内容都适合上传给第三方处理,还有些工具有访问和付费门槛,更别说功能不够定制化、不能一站解决问题等痛点了。

本地模型 正是用来解决这些痛点的,而浏览器内置模型 则更是直接把智能能力递到了你手里。Chrome 里就是内置了 Gemini Nano 这个多模态模型,并且提供了配套的 Summarizer API ,简直是前端开发者的大利好。无需联网,不用付费,只需要几行 JS 代码,你轻轻松松就能写一个智能总结工具出来,真正是「如意如意,趁我心意」。

如果你此时的内心独白是「哟?有点儿意思!」,那本文正是为你而写的。

解锁方法

目前,Chrome 内置的 Summarizer API 还处于内测阶段,离成为 W3C 标准还尚有差距。但最新的正式版 Chrome 已经把内置 AI 装载进来了,我们只需要按照窍门操作几步,就可以立刻尝鲜,早用早享受。

首先要明确一些使用限制:

  1. 内置 AI 暂时只对桌面端开放
  2. 你的设备至少要有 4GB 显存,不限集成显卡或者独立显卡
  3. 你的磁盘需要有 22GB 的剩余空间,虽然内置的 Gemini Nano 体积远远达不到 22GB,但还是要先预留充足

确保你的设备满足上述条件后,就可以简单几步走了:

  1. 在 Chrome 地址栏输入 chrome://flags/#optimization-guide-on-device-model,在高亮条目右侧选择 「Enabled BypassPerfRequirement」

  2. 用同样的方式,把 chrome://flags/#summarization-api-for-gemini-nano 设为「Enabled」

  3. 重启 Chrome

  4. 在 Chrome Console 里执行 await ai.summarizer.capabilities(),如果看到如下运行结果,那么恭喜解锁成功!

如果你没能顺利解锁,可以在评论区留言,我会帮你一起搞定。

速通智能总结工具

将内置模型准备就绪后,我们就可以开始动手开发了。

检测可用性

由于浏览器内置 AI 还没有在各厂商中全面普及,所以为了保证优雅降级,我们要切记在调用相关 API 之前,总是先检测可用性。

那么具体到 Summarizer API,我们可以像下面这样判断可用性:

JavaScript 复制代码
async function check () {
  if (!ai?.summarizer?.capabilities) return false;

  const res = await ai.summarizer.capabilities();
  if (res?.available === 'readily') return true;

  if (res?.available === 'after-download') return alert('请等待模型下载');

  return false
}

如果你暂时还不想深入了解 capabilities() 的用法,完全可以把上述代码复制带走,然后直接跳到「创建 session」小节继续阅读。

capabilities() 的执行结果中,除了用于判断可用状态的 available 属性之外,我们还可以调用到下列函数:

  • supportsType()
  • supportsFormat()
  • supportsLength()

它们都是用来检测 API 对具体配置项的支持情况,关于这些配置项,我们将在下文 create() 方法的参数部分详细讲解。

该 API 还支持一个方法,可以用来判断输入文本的语种是否被模型所支持。但这里有一个实现上的分叉:

  • Chrome 正式版 130 中,这个方法的名称是 supportsInputLanguage
  • 而在 Chrome Canary 版 132 中,方法名却是 languageAvailable

目前无法确定在后续推进过程中,哪个名称会得以保留。所以如果要用到这个方法,我们也要做好兼容。但无论名字叫什么,它都接收一个语种 Tag 作为参数,比如 zh 代表中文,en 代表英文。

创建 session

确保 API 可用后,我们开始实现文本总结逻辑。

Chrome 的内置 AI API 的设计风格是这样的:在全局对象(window / global / self)下,设一个属性 ai 作为命名空间,各项功能的构造器被分配在 ai 对象的各个属性下。构造器创建出实例 session,而 session 带有各种智能方法。

Summarizer API 也不例外。我们可以调用 ai.summarizer.create() 创建出一个实例 session:

JavaScript 复制代码
const session = await ai.summarizer.create({
  format: 'plain-text',
  type: 'teaser',
  length: 'short',
})

我们可以给 create() 传入不同的配置参数组合,创建出满足不同需求的 session。以下是与文本处理风格相关的参数:

  • format:输入文本的格式,可选值:

    • markdown:Markdown 格式
    • plain-text:纯文本格式
  • type:我们想要达到的总结效果,可选值:

    • tl;dr:「too long, didn't read」的缩写,意为「太长不看」,是标准的总结模式
    • key-points:将要点总结出来,并以列表展示
    • teaser:生成一段预告词或者导语,吸引读者注意力
    • headline:提炼成一个简明的标题
  • length:生成文本的长度,可选值为 shortmediumlong

session 一经创建后,就会保持配置参数指定的生成风格。

create() 还接受另外一些用于控制过程的参数:

  • sharedContext:字符串类型,可以用自然语言描述总结内容的场景或背景,提升总结效果
  • signal:用于在必要时中断生成过程
  • monitor:可传入一个回调函数,在函数参数中可以获取到模型下载的进度

调用总结方法

配置好实例 session,我们就可以总结文本了。

Summarizer API 支持两个总结方法:

  • summarizeStreaming()
  • summarize()

从命名可以看出,前者是流式处理,一边生成一边把结果吐出来;而后者则是要等到全部 token 完才返回结果。

而二者接受的参数是一致的:第一个参数是输入文本;第二个参数是一个配置对象,用于控制中断和指定上下文。

JavaScript 复制代码
const result = await session.summarizeStreaming(str, {
  signal,
  context: '',
})

为了减少用户等待时长,我们优先选择流式生成(出于简化演示的目的,我们先不传第二个参数):

JavaScript 复制代码
const result = await session.summarizeStreaming(str)
for await (const chunk of result) {
  resText = chunk
}

在旧版本的实现里,流式生成返回的并不是真正的 stream,而是每次吐出最新生成的 token,所以那时候我们需要用 resText += chunk 的方式拼接。但现在已经不需要这样做了。

当我们把一段长文本传给 summarizeStreaming()之后,顷刻间,精炼后的文本就如流水般顺畅而出了。就这样,简单几行 JavaScript, 我们就实现了一个智能总结小工具。

结语

恭喜你读完了本文!你真棒!

有了浏览器内置 AI 提供的 API,咱们可以非常轻松且快速地把 LLM 的能力落地成好用的工具,简直不要太爽。

当然,内置 AI 的能力还在持续完善和优化中,比如目前对中文的支持还不是非常完美,文本向量化和多模态能力还没开放等等。但作为新时代的开发者,咱们也不必等技术完全成熟再去学习和应用,重要的是尽早培养新的思路,形成新的需求解决意识。

📣 我是 Jax,在畅游 Web 技术海洋的又一年,我仍然是坚定不移的 JavaScript 迷弟,Web 技术带给我太多乐趣。如果你也和我一样,欢迎关注私聊

相关推荐
桃园码工10 分钟前
15_HTML5 表单属性 --[HTML5 API 学习之旅]
前端·html5·表单属性
百万蹄蹄向前冲1 小时前
2024不一样的VUE3期末考查
前端·javascript·程序员
轻口味1 小时前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami1 小时前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
wakangda2 小时前
React Native 集成原生Android功能
javascript·react native·react.js
吃杠碰小鸡2 小时前
lodash常用函数
前端·javascript
emoji1111112 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
泰伦闲鱼2 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
m0_748250032 小时前
Web 第一次作业 初探html 使用VSCode工具开发
前端·html
一个处女座的程序猿O(∩_∩)O2 小时前
vue3 如何使用 mounted
前端·javascript·vue.js