如何从源码构建 GPT4All TypeScript 绑定(Node.js)?
2026/9/9 21:14:05 网站建设 项目流程

如何从源码构建 GPT4All TypeScript 绑定(Node.js)?

【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all

如果你的项目需要修改、调试 gpt4all 的 Node.js 原生绑定(而不是直接使用 npm 上发布好的gpt4all包),就需要从 GPT4All 仓库源码出发,编译出两部分产物:Node.js 原生模块(native addon)和平台相关的后端动态库。本文按照 gpt4all-bindings/typescript/README.md 中 “Develop” 一节的构建说明,给出在 Linux / Windows / macOS 上完成这次构建的完整路径,以及如何验证构建结果。

构建前置条件

README 明确列出了构建要求,缺一不可:

  • git
  • node.js >= 18.0.0
  • yarn
  • node-gyp,及其自身的全部依赖
  • Python 3
  • Unix 平台:gcc 12;Windows 平台:msvc 143(可通过 Visual Studio 2022 Build Tools 获得)
  • Windows 和 Linux 构建 GPT4All 需要完整的 Vulkan SDK;macOS 用户不需要 Vulkan,因为 GPT4All 在 macOS 上使用 Metal

README 对平台测试程度的说明是:Ubuntu 上完整测试通过,Windows 上工作正常,macOS 仅做过少量测试(sparse testing)。

另外注意 package.json 中的两项声明:packageManageryarn@3.6.1engines要求node >= 18.x.x。构建用到的prebuildify(原生模块预构建)和jest(测试)都声明在 devDependencies 里,所以构建前先按仓库声明的 yarn 版本安装好依赖。

获取源码并初始化

git clone https://github.com/nomic-ai/gpt4all.git cd gpt4all-bindings/typescript

后续所有 shell 命令都假定当前工作目录是typescript目录。

gpt4all 依赖的 llama.cpp 以 git submodule 形式存在,仓库中可能缺失(未初始化)。如果gpt4all-backend/deps/llama.cpp-mainline/目录是空的,需要在 llama.cpp 的父目录中执行:

git submodule update --init --recursive

执行构建

1. 构建 Node.js 原生模块

node scripts/prebuild.js

这条命令通过 prebuild.js 调用prebuildify,以 N-API 方式(targets: ["18.16.0"])为当前平台构建原生模块,各平台实际构建的组合是:

  • Windows(win32):win32/x64
  • Linux:linux/x64(arm64、armv7 组合在源码中被注释掉了)
  • macOS(darwin):darwin/x64darwin/arm64

构建成功时脚本会为每个平台/架构组合打印Build succeeded for platform ... and architecture ...,全部完成后打印All builds succeeded;某个组合失败时会打印Error building for platform ...及具体错误。

2. 构建后端动态库

yarn build:backend

README 说明该命令会构建平台相关的动态库,产物位于runtimes/(platform)/native。真正执行编译的是各平台构建脚本,它们用 CMake 构建../../gpt4all-backend并把产物拷贝到runtimes下:

  • build_unix.sh(Linux / macOS):根据uname -s选择目录,Linux 用runtimes/linux-x64、macOS 用runtimes/osx,依次执行cmake -S ../../gpt4all-backend -B "$BUILD_DIR"cmake --build "$BUILD_DIR" -j --config Release,然后把libgptj*libllama*两个动态库(.so/.dylib)拷入对应的native目录。副作用:脚本开头会先rm -rf掉对应的runtimes/linux-x64runtimes/osx目录再重建,目录内已有内容会被清除。
  • build_msvc.bat(Windows / MSVC):以 Release、x64 架构构建,把产物拷贝到runtimes\win32-x64\native\,构建失败时会自动重试。副作用:脚本会删除并重建build\win-x64-msvcruntimes\win32-x64目录。
  • build_mingw.ps1(MinGW):README 明确提示该脚本仅保留备用,此包只兼容 MSVC 构建的 dll,Windows 上应使用 MSVC 路径。

验证构建结果

yarn test

yarn test对应 package.json 中的jest。test/gpt4all.test.js 通过node-gyp-buildtypescript目录加载刚编译出的原生模块,并覆盖以下几类用例:

  • 默认路径常量:DEFAULT_DIRECTORY应为~/.cache/gpt4allDEFAULT_LIBRARIES_DIRECTORY应包含runtimes/<platform>-<arch>/native等查找路径
  • listModels:远程模型列表加载、本地文件加载、参数缺失时报错
  • appendBinSuffixIfMissing:无后缀的文件名会被补成.gguf.bin保持原样
  • downloadModel:fetch 被 mock,验证下载 URL、md5 校验失败时清理临时文件等

如果测试全部通过,说明原生模块可以被 Node.js 正常加载,构建链路是通的。若想让构建产物真正跑一次推理,可以运行 spec/ 下的示例脚本(如spec/stateless.mjs),README 说明其前提是“模型和库已安装在工作目录中”(should work assuming a model and libraries are installed locally in working directory)。

构建产物与源码结构速览

理解这些文件有助于你修改后重建:

  • binding.gyp:node-gyp 编译配置,target 名为gpt4all,源码包括index.ccprompt.ccgpt4all-backend下的llmodel.cppllmodel_c.cpp,并按平台定义LIB_FILE_EXT.so/.dll/.dylib
  • index.cc:Node.js 与 C 的桥接层,即绑定本体;prompt.cc 负责以线程安全、异步的方式处理提示与推理
  • src/:JavaScript 接口与原生附加组件的类型定义
  • prebuilds/runtimes/prebuild.jsbuild:backend的输出位置,也是package.json发布时打包的文件

已知问题与限制

README “Known Issues” 一节列出的现象与构建后使用直接相关:

  • 模型输出无意义内容:通常是模型文件本身损坏,重装或从官方站点重新下载
  • 调用 generate tokens 后模型挂起:可能是nPast设置过高(README 记录于 2024-03-16,Linux Mint / Ubuntu 22.04)
  • Node.js 进程退出后 GPU 占用仍然偏高:必须在退出前调用model.dispose()

另外,Version 4 包含若干破坏性变更(createEmbeddingEmbeddingModel.embed()返回EmbeddingResult对象而非 float32array、移除ModelType/ModelFile类型、移除仅用字符串路径初始化模型的方式),从源码构建后写代码时应对照这些变更。macOS 目前只有 sparse testing,构建产物在 darwin 上未经充分验证。

【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询