声明:
- 基于Nodejs
- 能在本地跑的,都在本地
- nextjs: https://nextjs.org/learn/dashboard-app/getting-started
- shadcnUI: https://ui.shadcn.com/docs
- 预训练模型:
- Embeddings:
- Summarization:
- Text Generation:
https://llm.mlc.ai/docs/get_started/quick_start.html#quick-start
本章节主要以搜读所用到的技术点来说明,不表示所述套件的全部功能和用途。
提供向量数据库应有的能力,不过一切都是本地化服务。搜读使用本地Docker化环境开发...
加载本地文档,并分割其内容
由于langchain.js
本地库对于非结构化数据处理不太理想,所以用到了unstructured
使用转换为 ONNX 的HG模型创建嵌入模型(createEmbedding)
主包onnxruntime-node
,其官方文档稀烂,特别是没有typings
定义。在引用依赖时需要自己定义.d.ts
文件
- 通过
InferenceSession
加载本地模型 - 通过
Tensor
构建特征数据
通过optimum-cli导出并存放在本地,作为项目公共库: ~/.llm_onnx/all-MiniLM-L6-v2/model.onnx
JavaScript版本的onnx可以说没有正式文档,可能官方觉得过于简单了吧,所以基本上只能去github看源码、以及看象征性的例子去使用...
分为@huggingface/inference
和@turingscript/tokenizers
两个包,其中后者为基于官方的升级包(主要解决原生模块引用的问题)
- inference:通过APIKey加载远程模型,通过模型创建Embeddings并调用模型的推理能力。若不直接使用HG Hub的模型,这个包可以不用
- tokenizer:负责将
langchian split
的结果转化为大模型能直接处理的数据。若本地化运行,一定需要这个
有两种方式调用来自Hugging Face的模型:
- 官方:
@huggingface/inference
,直接通过API Key调用; - xenova出品:https://www.npmjs.com/package/@xenova/transformers
PS:目前有个@huggingface/transformers的库,不过目前处于3.0.0-alpha.xx
版本,如果直接调用transformers
,可能还是需要直接使用:@xenova/transformers
,这个目前版本是2.7.12
如果不用官方的API调用,也不使用xenova开发的
transformers.js
,则需要自己处理tokenizer
。注意事项:
- HG官包
@huggingface/xxx
系列并不包括tokenizers
,它是一个看似独立的包tokenizers@latest
; - 虽然提供Tokenizer的Nodejs解决方案,但是不太容易找到入口、而且有一年没有更新了,并且官方的示例代码都比较旧;
- 官仓构建后缺失native modules,这就会导致
Cannot find module 'tokenizers-darwin-arm64'
类似的错误,详见:issues, PR-1459 和 PR-6 - 官方示例(走投无路时可以参考):https://github.com/huggingface/tokenizers/blob/main/bindings/node/examples/documentation/pipeline.test.ts
如果能忍受这些坑点,那就接着奏乐接着舞吧...
# 前文提过,通过这个方式安装的依赖,运行时会出现:Cannot find module
pnpm add tokenizers@latest
# 因此需要换成这个
pnpm add @turingscript/tokenizers
基于Nextjs的项目,还需要额外配置:
const nextConfig = {
experimental: {
serverComponentsExternalPackages: ['onnxruntime-node', '@turingscript/tokenizers'],
},
};
如果更新NPM包或删除node_modules后,重新运行发生如下错误:
ModuleBuildError: ./node_modules/.pnpm/@[email protected]/node_modules/@turingscript/tokenizers/index.js
Package @turingscript/tokenizers.js (serverComponentsExtenalPackages or default list) can't be external
则需要改一下导包指令
import type { JsEncoding, Tokenizer as TokenizerType } from '@turingscript/tokenizers';
// for reason: The request could not be resolved by Node.js from the importing module.
const { Tokenizer } = require('@turingscript/tokenizers');
种种迹象说明,想通过Nodejs本地化愉快的玩,往往会让人血压一路飙升...