Skip to content
This page has been auto-translated and may contain errors.View in English

在本地运行开源模型项目 ​

用这个页面在你的电脑上运行一个已提取的开源模型项目。这个模块包含两种项目。一种在浏览器内用 Transformers.js 运行物体检测模型,加载前需要添加一处设置。另一种是小型 Express 服务器,它把你的问题转发给运行在 Ollama 中的模型,其 package.json 需要修复。两种都不需要 API 密钥。

你首先需要的 ​

安装受支持的 LTS 版本 Node.js。推荐 Node 24,它包含 npm。如果 Node 和 npm 对你来说还很陌生,在本地运行代码会引导你完成安装和检查步骤。

检查两个命令都能用。你的版本号可能不同:

bash
$ node --version
v24.18.0
$ npm --version
11.18.0

浏览器项目第一次加载时还需要网络连接,因为页面要下载约 20 MB 的库文件和模型文件。

Ollama 项目还需要 Ollama 和它的 mistral 模型,下载量约 4.4 GB。你可以在下面 Ollama 部分开始那个下载。

Juno你首先需要的 安装包含 npm 的 Node.js LTS,并检查 node --version 和 npm --version 都能输出版本号。

两个项目都不需要 API 密钥。如果 index.js 开头是 import ollama,那也要装 Ollama 应用。

Juno你首先需要的 两个项目都在自己的机器上运行模型,所以不需要密钥。浏览器项目把模型下载到标签页中,Ollama 项目则请求一个独立程序 Ollama,后者把模型保存在你的磁盘上。
Juno你首先需要的 两个下载的大小相差两个数量级:浏览器模型约 10 MB 的量化权重,而 mistral 约 4.4 GB,而且在 Ollama 运行它时还需要几 GB 的可用内存。

识别你提取的项目 ​

在提取的文件夹中打开终端。这是包含 package.json 和 index.js 的文件夹:

bash
$ cd path-to-your-extracted-project

打开 index.js 并读其第一行。浏览器项目用 Transformers.js 在浏览器中运行 AI 模型的开头是:

js
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.8.0'

Ollama 项目在电脑上用 Ollama 下载和运行 AI 模型的开头是:

js
import ollama from "ollama";

浏览器项目还有 index.html 和一个 road.jpeg 照片;Ollama 项目两者都没有。只按你的项目所属的部分操作。

Juno识别你提取的项目 打开 index.js 看第一行。@xenova/transformers 表示浏览器项目;ollama 表示 Ollama 项目。

然后跳到对应项目的部分。两个设置不能混用。

Juno识别你提取的项目 两个 package.json 文件除了名称和描述行外完全一致:都用 Vite 启动。这对浏览器页面是对的,对 Ollama 服务器则是错的,因为它是没有页面的 Node 程序。
Juno识别你提取的项目 Ollama 项目的修复用 node index.js 替换 Vite。如果用在浏览器项目上,Node 会在第一行就停止,抛出 ERR_UNSUPPORTED_ESM_URL_SCHEME,因为它不能从 https: 地址 import 模块。

运行 Transformers.js 项目 ​

安装依赖:

bash
$ npm install

npm 完成后会报告它添加了多少个包。

启动前,改 index.js 中的一行。页面加载时,Transformers.js 首先在与页面同一服务器上的 /models/ 目录下寻找模型文件。Vite 对它不认识的任何地址都用页面本身来应答,所以库收到的是 HTML 而非期望的模型设置,页面会永远停留在加载模型中...。一个设置可以告诉 Transformers.js 跳过本地检查,直接从 Hugging Face 下载模型。

把第一行:

js
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.8.0'

改为这两行:

js
import { pipeline, env } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.8.0'
env.allowLocalModels = false

启动开发服务器:

bash
$ npm start

Vite 可能会先打印一条以 (!) Your Vite config uses features 开头的警告。这不会停止应用。下面,Vite 会打印要打开的地址:

text
  VITE v8.3.4  ready in 99 ms

  ➜  Local:   http://localhost:5173/

打开那个 Local 地址。页面在灰显的检测物体按钮上显示加载模型中...,同时库和模型在下载。当状态变为就绪,点击检测物体。几秒后(在较慢的机器上可能长达二十秒),状态显示完成!,照片上出现标注的框,比如 bus: 99%、car: 97% 和几个红绿灯。后续加载会更快,因为浏览器会保留下载的文件。

如果状态停留在加载模型中...或一直没出现,打开浏览器的开发者工具(F12,或 Mac 上 Chrome 的 Cmd+Option+J),读控制台标签;下面的故障排除会对应每条消息。favicon.ico 的红色 404 是无害的。

用 Ctrl+C 停止项目。

Juno运行 Transformers.js 项目 运行 npm install,在 index.js 顶部添加 env 和 env.allowLocalModels = false 行,然后运行 npm start 并打开 Local 地址。

等待就绪,然后点击检测物体。照片上有标注框的标签意味着模型有效。

Juno运行 Transformers.js 项目 Vite 只服务你的文件:index.html、index.js 和照片。库来自 jsDelivr,模型来自 Hugging Face,两者都直接进入浏览器,然后浏览器在照片上自己运行检测。
Juno运行 Transformers.js 项目env.allowLocalModels 在 Transformers.js 2.8.0 中默认打开。Vite 的回退对 /models/Xenova/yolos-tiny/config.json 应答 200 和 index.html,所以库永远看不到会把它送到 Hugging Face 的 404;而是把 HTML 解析为 JSON 时失败。

修复和运行 Ollama 项目 ​

安装 Ollama 并打开它。在 macOS 和 Windows 上,应用启动 Ollama 的本地服务;在 Linux 上,安装程序会设置好。如果 ollama 命令说无法连接,在另一个终端运行 ollama serve 并让它保持运行。

下载课程代码要求的模型。约 4.4 GB,所以你可以在另一个终端进行下面的编辑时同时下载:

bash
$ ollama pull mistral
$ ollama ls

第二个命令应该列出 mistral:latest。

现在处理项目本身。它的 package.json 是为 Vite 网页生成的:npm start 运行 Vite,唯一列出的包是 Vite。但 index.js 是导入 express 和 ollama 的 Node 服务器。如下载的那样,npm start 启动 Vite,它打印的地址显示 HTTP ERROR 404,因为没有页面要服务。

在 package.json 中做两处编辑:添加 "type": "module" 并把启动脚本改为 node index.js。文件顶部就变成了:

json
{
  "name": "Scrim-s06c53f",
  "description": "https://scrimba.com/ai-engineer-path-c02v/~07uj",
  "type": "module",
  "scripts": {
    "start": "node index.js",
    "dev": "vite",

文件其余部分保持不变。"type": "module" 告诉 Node 这个 index.js 使用 import;不加的话,Node 仍会运行文件但会先打印一条 MODULE_TYPELESS_PACKAGE_JSON 警告。

安装 index.js import 的两个包,然后启动服务器:

bash
$ npm install express ollama
$ npm start

服务器打印:

text
Server is running on port 3000

打开 http://localhost:3000/。页面应该显示:

text
Ask something via the `?question=` parameter

只在 ollama pull 完成后才问。然后向模型提一个问题:

text
http://localhost:3000/?question=Why%20is%20the%20sky%20blue%3F

Mistral 完成写答案后,答案以纯文本显示。第一个答案最慢,因为 Ollama 需要先把模型加载到内存;页面在那之前不显示任何东西。

用 Ctrl+C 停止服务器。Ollama 在后台继续运行,直到你退出应用或停止 ollama serve。

Juno修复和运行 Ollama 项目 运行 ollama pull mistral 并保持 Ollama 打开。在 package.json 中,添加 "type": "module" 并把启动脚本改为 node index.js。

然后运行 npm install express ollama 和 npm start,并打开问题地址。第一个答案慢是正常的。

Juno修复和运行 Ollama 项目 两个程序协作:你的 Express 服务器在 3000 端口接收问题,ollama 包把它发给 11434 端口上的 Ollama 服务,后者运行 mistral。Express 不启动 Ollama,所以两者都必须运行。
Juno修复和运行 Ollama 项目npm install express 现在安装 Express 5,它在异步路由中捕获被拒的 ollama.chat 调用,并用 500 页面应答而不是崩溃。它的 app.listen 回调在端口被占用时也会运行,所以仅启动消息不能证明服务器在监听。

故障排除 ​

Transformers.js 页面停留在 加载模型中...,控制台显示 Unexpected token '<', "<!DOCTYPE "... is not valid JSON: 缺少 env.allowLocalModels = false 行,或 env 不在 import 中。如上所示添加两者并重新加载页面。

页面只显示灰显的检测物体按钮,上面没有状态,控制台提到 cdn.jsdelivr.net: 库无法下载。通常是内容拦截器或受限网络所致;允许 cdn.jsdelivr.net 或尝试另一个网络。

页面停留在 加载模型中...,控制台对 huggingface.co 显示 Failed to fetch: 模型无法下载。在内容拦截器或网络中允许 huggingface.co,然后重新加载。

在 Ollama 项目中,npm start 打印 VITE 且地址显示 HTTP ERROR 404: 启动脚本仍在运行 Vite。改为 node index.js。

Node 显示 Cannot find package 'ollama' 或 Cannot find package 'express': 在包含 package.json 的文件夹中运行 npm install express ollama。

问题地址显示 TypeError: fetch failed,终端显示 ECONNREFUSED 127.0.0.1:11434: Express 在运行但 Ollama 不是。打开 Ollama 应用或运行 ollama serve,然后再问。

问题地址显示错误,说找不到 mistral 模型: Ollama 在运行但没有模型。运行 ollama pull mistral 并等待完成。

npm start 打印 Server is running on port 3000 然后返回提示符: 另一个程序已在使用 3000 端口。停止它,或改 index.js 中的 port 常量并打开匹配的地址。

Juno故障排除 对浏览器项目,读控制台中除 favicon.ico 外第一条红线。对 Ollama 项目,读问题地址显示的内容和终端打印的内容。然后在上面对应加粗的标题。
Juno故障排除 浏览器项目按加载顺序失败:jsDelivr 的库,然后模型文件,然后模型。Ollama 项目按问题传递顺序失败:npm start、Express、Ollama 服务、模型。
Juno故障排除fetch failed 伴随 ECONNREFUSED 意味着没有东西监听 11434,所以请求从未到达 Ollama。来自 Ollama 本身的错误,比如模型缺失,意味着连接成功了,服务有应答。