招募活动投稿展示|就算大雨让整座城市断网,我还有浏览器内置 AI
活动介绍
谷歌开发者招募活动是专为 Google 技术的爱好者及开发者们开展的活动,旨在鼓励大家通过多种形式 (文章/视频/coding 等) 创作与 Google 技术相关的讲解分享、实践案例或活动感受等内容,展示代码、框架、平台在真实世界中的生动表现,以及分享您应用 AI 技术的故事经历与成果。
作者简介
本文作者 Jax,从事 Web 开发工作已有 7 年,也从中获得了很多乐趣。
文章导读
本文作者将带您了解 Chrome 内置 AI 的最新进展,手把手解锁 Web 端侧智能,并借助 Prompt API 实现几个小应用,为您落地 AI 灵感提供指导。
*以下为投稿原文
先配齐运行环境
一个好消息是,不像之前那样需要额外安装 Chrome Canary,现在我们已经可以在 Chrome 最新的正式版 (131.0.6778.140) 中使用内置 AI 了。但因为功能更新和 Bug 修复总是会最先、最及时地更新到 Canary 版本上,所以我们还是用最新版 Canary 来进行本文的实操。
4. 最后,在 Console 中打印 ai 这个全局对象,如果一切顺利,你将会看到如下结果:
再看看整体变化
我们刚刚测试解锁时,打印了全局对象 `ai`,可以看到,它的成员已经是四个新对象了:
```JavaScript{languageModel,writer,rewriter,summarizer,}```
新的模型入口: languageModel 对象
检测可用性
由于 API 还不稳定,所以我们在使用时,应该总是先检测其可用性。
`languageModel` 对象具有一个 `capabilities` 方法,可以提供给我们一些内置 AI 的状态信息:
`no`: 当前设备或浏览器不支持 `after-download`: 需要等模型下载完成后才可用 `readily`: 可用
所以我们可以用这样的逻辑来检测可用性:
```JavaScriptconst capabilities = window.ai?.languageModel?.capabilitiesif (!capabilities) return falseconst { available } = await capabilities()return available === 'readily'```
创建对话
```JavaScriptconst session = await window.ai.languageModel.create()const result = await session.prompt('Who are you and what can you do?')console.log(result)```
执行上面的代码后,你可能会等上一小会儿,才会看见一整段文字被一次性打印出来。其实模型并不是吭哧瘪肚半天才憋出来一段话。文本生成的原理是根据上文递归推断下一个字 (或者说 token),所以在我们等待的过程中,模型实际上每秒都在生成一定字数的内容。只不过 `prompt()` 就是这种不到火候不揭锅的调性,会等全部生成完成才肯吐口。
为了减轻等待的感觉,API 提供了另一个方法 `promptStreaming`,让模型能够对答如流。
```JavaScriptconst stream = await session.promptStreaming('Can you tell me a joke?')for await (const chunk of stream) {console.log(chunk)}```
这一次,你会在浏览器 Console 里看到一条信息流倾泻而出,行云流水、从上至下:
因为目前返回的 `stream` 并不真的是流式数据,而是每个 `chunk` 都是最新的完整回答。但好在我们已经可以在提问后立即得到反馈了。
你一定觉得这样在 Console 运行代码的对话形式太不方便了,肯定想要更流畅地领略端侧大语言模型的魅力。我就猜到你是有品味的程序员,所以写了一个对话界面 —— https://rejax.fun/chrome-ai/prompt/#/chat-bot,你可以直接和内置 AI 聊天,而且聊天记录还会保存在 localStorage 里哦~
设置系统提示词
在提示词工程中有这样一个技巧: 你可以给大模型设定一个角色,比如「你是一个 Web 开发专家」、「你是一个数据分析师」或者「你是一个乐于点赞、收藏的读者 ❤️」…… 其作用在于让具备通用泛化能力的大模型在生成内容时,专注于某一块特定的领域,以便于更好地处理我们提出的特定问题,忽略无关的信息。这个技巧能够大幅提升生成内容的质量和相关度,从而提高体验和效率。
而 Prompt API 也为这个技巧提供了接口: 在创建 `session` 时,我们可以给 `create()` 传入配置参数:
```JavaScriptconst session = await ai.languageModel.create({systemPrompt: 'You are a web development expert……'})```
由此创建出来的 `session`,在后续对话中,会牢牢记住自己的使命,按照 `systemPrompt` 中的指令来推理。
还有一种更通用、更易扩展的配置方法:
```JavaScriptconst session = await ai.languageModel.create({initialPrompts: [{role: 'system',content: 'You are a web development expert……'}]})```
这种 `role: 'system'` 的方式能起到相同的效果,只不过更符合提示词工程的通用范式,Open AI、LangChain 等提示词的组织形式都是如此。
`systemPrompt` 和 `role: 'system'` 不能混用
`role: 'system'` 只能有一组,且必须放在 `initialPrompts` 的首位
在提示词中附带示例
现在假设要开发一个对联机器人,我们的系统提示词可能会是「你是一个语言学家,你对给定的上联返回下联……」。实测中可能会发现,大模型不是很能理解「上下联」是什么意思。在这种情况下,你当然可以选择整理一批对联数据集,然后对模型进行训练、微调或者蒸馏。但还有一个更简洁、更经济的方法能迅速带来优化效果,那就是 N-Shot 提示词。
N-Shot 也是提示词工程中的一个技巧,N 代表非负整数,Shot 代表样本或者示例。二者合在一起的意思就是在提示词中带上 N 个示例。比如在上文的几个对话中,提示词只给出了指令,那这就属于 0-Shot 提示词。
示例能帮助模型更好地「理解」指令要求中的含义。仍以对联机器人为例,我们把提示词改为「你是一个语言学家,你对给定的上联返回下联。下面是几个例子: 上联: 大江东流去,下联: 小河西淌来。……」,可以以最低的成本获得效果的提升。
回到 Prompt API,`initialPrompts` 参数是一个数组,除了系统提示词,我们还可以预先传入几轮对话,作为 `session` 的背景上文,就像这样:
```JavaScriptinitialPrompts: [{role: 'system',content: '你是一个语言学家,你对给定的上联返回下联'},{role: 'user',content: '大江东流去'},{role: 'assistant',content: '小河西淌来',}]```
Token 计算
内置 AI 也同样为开发者提供了一套计量 token 的工具:
`session` 实例上有一个 `countPromptTokens` 方法,可以计算传入的字符串参数相当于多少 token `session` 还有三个可读属性:
`maxTokens`: 数量上限 `tokensSoFar`: 目前消耗了多少 token `tokensLeft`: 还剩多少 token 可用
这样,开发者就能在对话过程中对 token 消耗程度进行把控,从而能够及时处理信息丢失的问题了。
ShowCase: 三分钟写一个小玩具
这个脑洞来自那句歌词「What does the fox say?」
在这个小玩具里,用户输入动物名称,大模型返回这种动物的叫声。如果用户输入的不是动物,就会返回「走开」。
核心代码如下:
```JavaScriptconst session = await window.ai.languageModel.create({initialPrompts: [{role: 'system',content: 'You are a animal expert, user will give you a name of animal, you return the sound of the animal. If the name is not an animal, you return "go away". Return less than 3 words.'},{role: 'user',content: 'dog'},{role: 'assistant',content: 'woof',},{role: 'user',content: 'table'},{role: 'assistant',content: 'go away',}],})const sound = await session.prompt(userPrompt)```
结语
写在最后
感谢 Jax 的创作分享,我们也期待更多 Web 开发者能够借助内置 AI 落地应用灵感。如果您也想将自己的实践案例与更多开发者分享,欢迎报名参与谷歌开发者招募活动,积累资源和开发经验,收获灵感和惊喜,探索技术的无限可能!
扫描二维码提交报名
和伙伴们一起探索 Google 技术