window.ai+transformers.js - 在本地跑AI大模型

之前介绍了如何在控制台使用window.ai的功能,多少体验上不太好。这次结合transformers.js来看看最新的打开方式。

transformers.js 是一个 JavaScript 库,直接在浏览器运行,不需要服务器。支持如下功能:

  • 📝自然语言处理:文本分类、命名实体识别、问题回答、语言建模、总结、翻译、多项选择和文本生成。
  • 🖼️计算机视觉:图像分类、对象检测和分割。
  • 🗣️音频:自动语音识别和音频分类。
  • 🐙多模态:零拍摄图像分类。

最近它也支持谷歌内置的模型,具体可以参考:github.com/xenova/tran...

在这里,我们直接来看看它是如何跟谷歌内置模型搭配使用的。先来体验一下案例。

Demo案例

结合transformers.js使用,速度还是很快的。

windowai.miniwa.site/

主要包含以下功能

开启浏览器支持window.ai可以参考这个文章:juejin.cn/post/738730...

模型相关的实现

首先需要加载模型,transformers.js提供了简单的api来实现模型加载

arduino 复制代码
pipeline('text-generation', 'Xenova/gemini-nano');

作者使用的是一个单例的模式:

csharp 复制代码
class TextGenerationPipeline {
    static model_id = 'Xenova/gemini-nano';
    static instance = null;

    static async getInstance() {
        this.instance ??= pipeline('text-generation', this.model_id);
        return this.instance;
    }
}

主要流程是加载和通信,考虑到ai交互可能是一个耗时的操作。作者使用了worker处理。以下是worker的主要代码:

php 复制代码
import {
    pipeline,
    InterruptableStoppingCriteria,
    RawTextStreamer,
} from '@xenova/transformers';

async function generate(messages) {
    const generator = await TextGenerationPipeline.getInstance();

    const cb = (output) => {
        self.postMessage({
            status: 'update',
            output,
        });
    }

    const streamer = new RawTextStreamer(cb);
    self.postMessage({ status: 'start' });

    const output = await generator(messages, {
        streamer,
        stopping_criteria,

        // Greedy search
        top_k: 1,
        temperature: 0,
    })

    if (output[0].generated_text.length === 0) {
        // No response was generated
        self.postMessage({
            status: 'update',
            output: ' ', tps: null, numTokens: 0,
        });
    }

    // Send the output back to the main thread
    self.postMessage({
        status: 'complete',
        output: output[0].generated_text,
    });
}

async function load() {
    self.postMessage({
        status: 'loading',
        data: '正在加载模型...'
    });

    // 获取模型实例
    const generator = await TextGenerationPipeline.getInstance(x => {
        self.postMessage(x);
    });

    self.postMessage({
        status: 'loading',
        data: '正在加载模型...'
    });

    // 检测是否已经ready
    await generator('1+1=');
    self.postMessage({ status: 'ready' });
}
// 监听消息
self.addEventListener('message', async (e) => {
    const { type, data } = e.data;

    switch (type) {
        case 'load':
            load().catch((e) => {
                self.postMessage({
                    status: 'error',
                    data: e,
                });
            });
            break;

        case 'generate':
            stopping_criteria.reset();
            generate(data);
            break;

        case 'interrupt':
            stopping_criteria.interrupt();
            break;

        case 'reset':
            stopping_criteria.reset();
            break;
    }
});

可以看到这里主要是通过监听message消息跟外界交互。

  • self,类似于主线程中的 window 对象,指向woker自身;
  • 收到load指令时,启动模型加载,并内部测试
  • 收到generate指令时,调用模型的generator方法获取模型结果,并通过postMessage传递出去
相关推荐
夏幻灵几秒前
Express 静态资源托管详解:从本地 HTML 到 express.static()
前端·html·express
yyuuuzz25 分钟前
云服务器部署 web 项目的进程常驻记录
运维·服务器·前端·阿里云·云计算·aws
IT_陈寒28 分钟前
一文搞懂React的核心概念
前端·人工智能·后端
“AI国潮设计-小江”30 分钟前
《【AIGC实战】Python+SDXL批量生成“猫咪英歌舞蛋挞”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc
薛一半1 小时前
Redux实战:组件状态管理全解析
开发语言·前端·javascript·react.js
风骏时光牛马1 小时前
功能模块性能测试用例验证
前端
对空六课2 小时前
两个统计平台数据不同:用同一时间窗和事件样本做差异定位
大数据·前端·网络·数据库
小虎AI生活10 小时前
ChatGPT for Chrome 扩展升级解读:从「你复制给它」到「替你操作浏览器」(附三步上手流程)
aigc·ai编程
lpfasd12310 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
wangruofeng10 小时前
GPT-6.1 辅助我半天完成架构升级:GPT Image 提示词网站 9K+ 图片迁入 Cloudflare R2
aigc·ai编程