GPT4All TypeScript 绑定 v4 破坏性变更:EmbeddingResult 与移除的类型如何迁移
【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all
如果你用 Node.js / TypeScript 项目通过 npm 包gpt4all调用本地 LLM,把包升级到 v4 后会遇到三处破坏性变更:createEmbedding与EmbeddingModel.embed()的返回值从Float32Array变成了EmbeddingResult对象,废弃类型ModelType与ModelFile被删除,以及“只传一个字符串路径”初始化模型的用法被移除。这篇文章给出基于仓库文档的迁移路径:升级包、改写 embedding 调用、替换被移除的模型初始化方式,并验证迁移结果。适用环境要求 Node.js>= 18.x.x(见 package.json 中的engines字段,当前仓库版本为4.0.0)。
v4 的三处变更
gpt4all-bindings/typescript/README.md 的 “Changes” 一节明确列出 Version 4 的 breaking changes:
createEmbedding与EmbeddingModel.embed()返回对象EmbeddingResult,而不再是 float32array;- 移除了废弃类型
ModelType和ModelFile; - 移除了只以字符串路径初始化模型的废弃用法(Removed deprecated initiation of model by string path only)。
此外 README 提示:旧的 gpt4all-ts 仓库绑定已过时,应迁移到本仓库的 Node.js 绑定。
升级到 v4 包
按 README 给出的安装命令,用任一包管理器更新依赖:
yarn add gpt4all@latest # 或 npm install gpt4all@latest # 或 pnpm install gpt4all@latest模型默认会下载到(homedir)/.cache/gpt4all/(此路径来自 src/gpt4all.d.ts 中DEFAULT_DIRECTORY的注释),后端动态库的默认搜索顺序为DEFAULT_DIRECTORY/libraries、cwd/libraries,最后是cwd。
迁移 embedding 代码:从 Float32Array 到 EmbeddingResult
v3 时代,createEmbedding/EmbeddingModel.embed()直接返回一个Float32Array,因此旧代码通常把返回值当数组直接索引或计算。v4 中,这两个函数的返回值变为EmbeddingResult。按 gpt4all.d.ts 的定义:
interface EmbeddingResult<T> { /** * Encoded token count. Includes overlap but specifically excludes tokens used for the prefix/task_type, BOS/CLS token, and EOS/SEP token */ n_prompt_tokens: number; embeddings: T; }类型参数T取决于输入:
- 传入单个
string,createEmbedding返回EmbeddingResult<Float32Array>,即embeddings是单个向量; - 传入
string[],返回EmbeddingResult<Float32Array[]>,embeddings是向量数组(见createEmbedding的第二个重载)。
对应地,旧代码里直接使用返回值的写法要改为从结果对象取embeddings:
// v3 风格:返回值被当作 Float32Array 使用 // const vec = createEmbedding(embedder, text); // vec.length、vec[i] 等 // v4:返回值是 EmbeddingResult 对象 const result = createEmbedding(embedder, text); const vec = result.embeddings; // Float32Array console.debug(result.n_prompt_tokens); // 编码的 token 数n_prompt_tokens是新返回值带来的附加信息:它是编码 token 数,包含 overlap,但不包含 prefix/task_type、BOS/CLS、EOS/SEP 所消耗的 token(引自 d.ts 注释)。如果你之前自己估算 token 用量,可以直接改用这个字段。
README 中的 Embedding 示例(模型名与参数均照抄原文):
import { loadModel, createEmbedding } from '../src/gpt4all.js' const embedder = await loadModel("nomic-embed-text-v1.5.f16.gguf", { verbose: true, type: 'embedding'}) console.log(createEmbedding(embedder, "Maybe Minecraft was the friends we made along the way"));从 npm 安装的包应改为从'gpt4all'导入(README “Offline usage” 一节即使用import { ... } from 'gpt4all')。
embedding 调用时的可选项
EmbeddingOptions(d.ts 中定义)提供了四个可选项,迁移时如果旧代码用别的方式控制这些行为,需要改走选项对象:
prefix:任务前缀(不带结尾冒号)。对 Nomic Embed,可为search_query、search_document、classification、clustering。仓库示例 spec/embed.mjs 中的用法是:
console.log(createEmbedding(embedder, ["Accept your current situation", "12312"], { prefix: "search_document" }))dimensionality:用于 Matryoshka-capable models 的嵌入维度,默认全尺寸。实现上(src/gpt4all.js 的createEmbedding)dimensionality未传时按-1处理;传了0或负数会抛Dimensionality must be undefined or a positive integer错误;低于model.MIN_DIMENSIONALITY时会打印性能可能下降的警告。longTextMode:"mean"或"truncate",默认"mean",控制超出模型长度限制的长文本如何处理;atlas:默认false,开启后追求与 Atlas API 完全兼容(d.ts 注释:long_text_mode="mean"时超过 8192 tokens 的文本会报错)。
EmbeddingModel.embed()的低层签名是embed(text, prefix, dimensionality, doMean, atlas);createEmbedding是它的高层封装,迁移时优先改createEmbedding的调用即可。
处理被移除的 ModelType / ModelFile 与字符串路径初始化
ModelType与ModelFile两个类型不再从模块导出,引用它们的 import 语句需要删除。模型初始化统一改用loadModel(modelName, options):
loadModel的第一个参数是模型名(如"nomic-embed-text-v1.5.f16.gguf"),不是完整路径;- 返回类型由
options.type决定:type: "embedding"时返回EmbeddingModel,否则默认"inference"返回InferenceModel(见 gpt4all.js 中loadModel的实现,非法type会抛出Invalid model type); - 默认行为是“本地没有就从 GPT4ALL 官网下载”(
allowDownload默认为true,modelPath默认为DEFAULT_DIRECTORY)。离线使用可配合modelConfigFile指定本地模型配置文件,例如 README 示例中的:
const model = await loadModel('mistral-7b-openorca.gguf2.Q4_0.gguf', { verbose: true, device: 'gpu', modelConfigFile: "./models3.json" })如果确实要直接构造原生LLModel(低层用法),构造函数现在接收的是LLModelOptions对象而不是字符串路径:
interface LLModelOptions { type?: string; // 目前仅作描述性标识,无实际功能 model_name: string; model_path: string; library_path?: string; }model_name与model_path均为必填,字符串路径初始化不再可用。
验证迁移结果
- 类型层面:TypeScript 项目升级后,
src/gpt4all.d.ts是类型的权威来源。凡是把createEmbedding返回值当Float32Array使用的地方(如直接vec.length、传入期望Float32Array的参数),编译器会报类型不匹配;改为解构embeddings后应通过类型检查。 - 运行层面:仓库 spec/ 目录下的示例展示了 v4 的调用形态,其中 spec/embed.mjs 覆盖了 embedding 路径,运行前需保证工作目录中已有对应模型文件和本地库(README 说明 spec 示例“Should work assuming a model and libraries are installed locally in working directory”)。成功标志是
createEmbedding输出为含n_prompt_tokens与embeddings字段的对象,而非裸数组。 - 单测:按 README 的 Test 一节执行
yarn test(jest)跑仓库导出的函数单测。
限制与注意
- README 的 Roadmap 明确写着“breaking changes may happen until the api stabilizes”,v4 之后仍可能出现破坏性变更,升级时建议锁定版本并核对 Changes 一节。
- 示例与 README 的 Known Issues 均要求在脚本结束时调用
model.dispose()/embedder.dispose(),否则 GPU 占用可能不释放;这是 embedding 迁移后代码容易遗漏的一步。 - 本文的变更清单只覆盖 README “Changes” 一节列出的三项;v3 到 v4 的其他行为差异(如流式、会话接口)不在本次迁移范围内。
参考文档
- gpt4all-bindings/typescript/README.md —— 变更清单、安装命令、示例与测试方式
- gpt4all-bindings/typescript/src/gpt4all.d.ts ——
EmbeddingResult、EmbeddingOptions、loadModel等类型定义 - gpt4all-bindings/typescript/src/gpt4all.js ——
loadModel/createEmbedding的实现与默认值 - gpt4all-bindings/typescript/spec/embed.mjs —— v4 形态的 embedding 调用示例
【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考