Node JS 调用模型Xenova_all-MiniLM-L6-v2实战

本篇通过将句子数组转换为句子的向量表示,并通过平均池化和归一化处理,生成适合机器学习或深度学习任务使用的特征向量为例,演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。

关于 all-MiniLM-L6-v2 的介绍,可以参照上一篇:

一篇吃透模型:all-MiniLM-L6-v2

可以访问 Hugging Face的状况

Hugging 的站点是:

https://huggingface.co/

如果可以访问该站点的话,则直接安装 Hugging Face 的 Transformers 库。

npm i @huggingface/transformers

之后就可以编写代码:

import { pipeline } from '@huggingface/transformers';

// Create a feature-extraction pipeline
const extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');

// Compute sentence embeddings
const sentences = ['This is an example sentence', 'Each sentence is converted'];
const output = await extractor(sentences, { pooling: 'mean', normalize: true });
console.log(output);

上面代码作用就是加载模型,将语句转换为向量,细节的部分下面再介绍,执行的效果如下:

到此,就成功的运行了。

但是如果无法访问Hugging Face 的化, 运行就会出现如下错误:

PS D:\devworkspace\vs\ai_ency\ai_nodejs_ency> node .\src\llm\minilm\huggingface-minilm.js
node:internal/deps/undici/undici:12502
      Error.captureStackTrace(err, this);
            ^

TypeError: fetch failed
    at node:internal/deps/undici/undici:12502:13
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runNextTicks (node:internal/process/task_queues:64:3)
    at process.processImmediate (node:internal/timers:449:9)
    at async getModelFile (file:///D:/devworkspace/vs/ai_ency/ai_nodejs_ency/node_modules/@huggingface/transformers/dist/transformers.mjs:31325:24)
    at async getModelJSON (file:///D:/devworkspace/vs/ai_ency/ai_nodejs_ency/node_modules/@huggingface/transformers/dist/transformers.mjs:31427:18)
    at async Promise.all (index 0)
    at async loadTokenizer (file:///D:/devworkspace/vs/ai_ency/ai_nodejs_ency/node_modules/@huggingface/transformers/dist/transformers.mjs:24731:18)
    at async AutoTokenizer.from_pretrained (file:///D:/devworkspace/vs/ai_ency/ai_nodejs_ency/node_modules/@huggingface/transformers/dist/transformers.mjs:29020:50)
    at async Promise.all (index 0) {
  [cause]: ConnectTimeoutError: Connect Timeout Error
      at onConnectTimeout (node:internal/deps/undici/undici:6635:28)
      at node:internal/deps/undici/undici:6587:50
      at Immediate._onImmediate (node:internal/deps/undici/undici:6617:37)
      at process.processImmediate (node:internal/timers:478:21) {
    code: 'UND_ERR_CONNECT_TIMEOUT'
  }
}

因为默认会从Hugging Face下载模型文件,无法下载,报上面的fetch 获取错误, 有解决方法吗?

答案就是从ModelScope 下载模型文件。

从 ModelScope 下载模型文件

ModelScope上面也维护了 Xenova/all-MiniLM-L6-v2 的模型文件, 地址是:

https://www.modelscope.cn/models/Xenova/all-MiniLM-L6-v2/files

但是,ModelScope提供了Python的库,却没有NodeJS的库,所以无法直接通过ModelScope的来下载,但是可以下载模型的文件,下载方式就是先安装ModelScope,然后用ModelScope 的命令行下载模型文件:

modelscope download --model Xenova/all-MiniLM-L6-v2

下载后的文件目录如下图:

下载后,将这个目录中的内容复制到NodeJS 项目的node_modules 目录下的 node_modules@huggingface\transformers.cache 目录下, 这也是Hugging Face下载模型文件的目录,结构如下图:

复制完成之后,就可以正常运行了。

补充介绍: Transformers 是什么?

Transformers 是由 Hugging Face 团队开发的开源 库,专注于提供基于 Transformer 架构 的预训练模型和工具。它简化了自然语言处理(NLP)任务的实现流程,支持文本生成、翻译、分类、问答等场景,并兼容 PyTorch、TensorFlow 等深度学习框架。

Transformers 有Python 和 NodeJS 两个版本。

如果Hugging Face无法访问

  • Python 版本可以使用ModelScope提供的库
  • NodeJS

补充介绍: 代码详细解释

const extractor = await pipeline(...) 是使用 Hugging Face Transformers.js 库的核心方法之一,用于创建一个 预训练模型的推理管道。通过 pipeline,可以轻松加载模型并执行各种任务(如文本分类、特征提取、问答等)。


pipeline 的作用是:

  1. 加载模型:从本地或远程加载预训练模型和分词器。
  2. 封装推理逻辑:将模型的输入预处理、推理和后处理逻辑封装成一个简单的接口。
  3. 执行任务:根据任务类型(如 feature-extractiontext-classification 等),对输入数据进行处理并返回结果。

参数详解

pipeline 方法的完整签名如下:

const pipeline = await transformers.pipeline(task, model, options);
1. task(必需)

指定要执行的任务类型。常见的任务包括:

  • feature-extraction:特征提取(生成句子或词的嵌入向量)。
  • text-classification:文本分类。
  • question-answering:问答任务。
  • translation:翻译任务。
  • text-generation:文本生成。
  • 其他任务:如 summarizationfill-mask 等。

示例

const extractor = await pipeline('feature-extraction');

2. model(可选)

指定要加载的模型。可以是以下之一:

  • 模型名称:从 Hugging Face Hub 加载的模型名称(如 Xenova/all-MiniLM-L6-v2)。
  • 本地路径:本地模型文件的路径(如 ./custom_model)。
  • 未指定:如果不提供,库会加载默认模型。

示例

// 从 Hugging Face Hub 加载模型
const extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');

// 从本地路径加载模型
const extractor = await pipeline('feature-extraction', './custom_model');

3. options(可选)

一个配置对象,用于自定义模型加载和推理行为。常见选项包括:

选项类型描述
local_files_onlyboolean是否仅从本地加载模型(默认 false)。设置为 true 可禁用网络请求。
revisionstring模型版本(如 main 或特定 commit hash)。
cache_dirstring缓存目录路径。设置为 null 可禁用缓存。
quantizedboolean是否加载量化模型(默认 false)。
progress_callbackfunction加载模型时的进度回调函数。
devicestring推理设备(如 cpugpu)。
poolingstring特征提取时的池化方式(如 meanmax)。
normalizeboolean是否对特征向量进行归一化(默认 false)。

示例

const extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', {
  local_files_only: true, // 仅从本地加载
  revision: 'main',       // 使用主分支版本
  pooling: 'mean',        // 使用均值池化
  normalize: true,        // 对输出向量归一化
});

返回值

pipeline 返回一个 推理函数,可以直接用于处理输入数据。具体返回值类型取决于任务类型。

示例

// 特征提取任务
const extractor = await pipeline('feature-extraction');

// 使用推理函数
const sentences = ['This is an example sentence'];
const embeddings = await extractor(sentences, { pooling: 'mean' });
console.log(embeddings);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oscar999

送以玫瑰,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值