Portable-AI-USB 源码解析1:install-core.ps1 如何实现 AI 模型下载校验与 Ollama 一键导入(完整指南)
【免费下载链接】Portable-AI-USBA 100% offline, fully portable, zero-trace AI (Ollama + Llama 3 + AnythingLLM) that runs natively from a USB drive on Windows and Mac.项目地址: https://gitcode.com/gh_mirrors/po/Portable-AI-USB
Portable-AI-USB 是一个100% 离线、完全可移植的 USB 便携 AI 工具箱(Ollama + Llama 3 + AnythingLLM),插上 U 盘即可在 Windows 和 Mac 上运行本地大模型。本文深入解析核心安装脚本 install-core.ps1,带你弄懂它如何完成AI 模型下载校验与Ollama 模型导入两大关键动作。
🧭 先搞懂:install-core.ps1 在项目中的位置
整个项目由十几个脚本组成,各司其职:
| 文件 | 职责 |
|---|---|
| install.bat | 用户双击的入口,只是转发调用 PowerShell 脚本 |
| install-core.ps1 | ⭐ 核心安装逻辑:选模型、下载、校验、导入 Ollama |
| start-windows.bat | 运行期启动器,负责拉起 Ollama 引擎和聊天界面 |
| linux/install-core.sh | Linux/Mac 版本的核心安装逻辑(与 ps1 版思路一致) |
| README.md | 官方使用文档 |
install.bat 中只有一句关键调用:
powershell -ExecutionPolicy Bypass -File "%~dp0install-core.ps1"也就是说,用户双击后发生的一切,都浓缩在 install-core.ps1 这一个文件里。
🗺️ 全流程总览:6 步完成"U 盘变 AI"
脚本用Write-Host "[1/6] ..."的提示把流程切成了 6 步,源码中每一步都有清晰的注释分隔块:
| 步骤 | 内容 | 源码位置 |
|---|---|---|
| 1/6 | 交互式模型选择菜单 | install-core.ps1#L129-L279 |
| 2/6 | 在 U 盘创建目录结构 | install-core.ps1#L325-L334 |
| 3/6 | 下载模型 + 大小校验 | install-core.ps1#L336-L398 |
| 4/6 | 生成 Modelfile 配置文件 | install-core.ps1#L400-L431 |
| 5/6 | 下载并解压 Ollama 引擎 | install-core.ps1#L433-L460 |
| 6/6 | 下载 AnythingLLM 聊天界面 | install-core.ps1#L462-L511 |
最后还有一个独立的"导入"阶段和 AnythingLLM 自动配置阶段。接下来我们聚焦用户最关心的两件事:模型是怎么下载和校验的、模型又是怎么导入 Ollama 的。
📚 模型目录:一份内置的"模型货架"
脚本开头定义了一个$ModelCatalog哈希表数组(install-core.ps1#L14-L87),相当于内置模型货架,收录了 6 个预置模型,全部采用 Q4_K_M 量化格式:
| # | 模型 | 大小 | 标签 | 特点 |
|---|---|---|---|---|
| 1 | NemoMix Unleashed 12B | ~7.0 GB | 🔓 推荐 | 质量最高的无审查模型 |
| 2 | Dolphin 2.9 Llama 3 8B | ~4.9 GB | 🔓 | 经典全能选手 |
| 3 | Mistral 7B Instruct v0.3 | ~4.1 GB | 🔒 | 推理与编程强 |
| 4 | Qwen 2.5 7B Instruct | ~4.7 GB | 🔒 | 多语言支持佳 |
| 5 | Llama 3.2 3B Instruct | ~2.0 GB | 🔒 | 轻量,老电脑友好 |
| 6 | Phi-3.5 Mini 3.8B | ~2.2 GB | 🔒 | 轻量 + 推理 |
每个模型条目里有 8 个字段,其中 3 个字段是后续"下载校验"的关键:
File:模型权重文件名(.gguf 格式)MinBytes:⚠️ 最小有效字节数,例如 12B 模型要求6000000000(约 6GB)Local:导入 Ollama 时使用的本地模型名,如nemomix-local
💡 设计亮点:
Size字段只是给人看的展示值(字符串 "7.0"),而真正的校验用MinBytes精确到字节,两者分离,展示与逻辑互不干扰。
除了预置模型,菜单还支持输入C添加自定义 HuggingFace GGUF 链接(install-core.ps1#L212-L266),自定义模型的MinBytes统一设为 100MB,并会自动给本地名加-local后缀防止命名冲突。
📥 下载与校验:如何判断"模型下载成功了"
这是本文的核心。大文件下载最怕两件事:中断后重复下载和下载了一半当成完整文件。脚本用一个极简函数把两者都解决了——Test-DownloadedFile(install-core.ps1#L106-L111):
function Test-DownloadedFile { param([string]$Path, [long]$MinSize) if (-Not (Test-Path $Path)) { return $false } $fileSize = (Get-Item $Path).Length return $fileSize -gt $MinSize }逻辑一句话:文件存在,且实际字节数 > 最小阈值,就视为"已下载成功"。注意它用的是-gt(大于)而非精确相等,因为 GGUF 文件可能带额外元数据,"大于下限"比"等于某个值"更健壮。
围绕这个函数,下载主循环(install-core.ps1#L345-L398)构成了完整的四重保险:
① 断点跳过(幂等设计)每个模型下载前先调用Test-DownloadedFile,若校验通过直接continue,打印 "Already downloaded! Skipping..."。这保证了 README.md 中提到的"随时重跑 install.bat 补装更多模型"的玩法——重跑绝不会浪费流量。
② 失败重试真正下载使用系统自带的 curl,最多尝试 2 次(install-core.ps1#L371-L387):
curl.exe -L --ssl-no-revoke --progress-bar $m.URL -o $dest-L跟随重定向(HuggingFace 链接会跳转)--ssl-no-revoke规避部分企业网络环境下证书吊销检查导致的失败- 每次尝试后都立即用
Test-DownloadedFile复检,通过就跳出重试循环
③ 小文件预警如果文件存在但体积不够,脚本会计算实际 GB 数并红字提示 "File seems too small ... May be incomplete",避免半成品模型被导入。
④ 失败降级为手动指引两次都失败后,脚本不会崩掉,而是把失败模型记入$downloadErrors数组,并打印出模型链接和应放置的models\目录,引导用户手动下载后重跑脚本——此时第 ① 步的"断点跳过"就会接住它。
还有一个贴心的细节(install-core.ps1#L359-L367):如果你之前装过旧版 Dolphin Q5_K_M,脚本会识别出来并直接复用,避免同一模型重复下载约 2GB 的 Q4 版本。
📝 Modelfile:给每个模型发一张"身份证"
模型下好后,脚本进入第 4 步,为每个模型生成一个 Modelfile(install-core.ps1#L406-L431):
FROM ./NemoMix-Unleashed-12B-Q4_K_M.gguf PARAMETER temperature 0.7 PARAMETER top_p 0.9 SYSTEM You are an uncensored and unbiased AI assistant. ...这里藏着 Ollama 导入的关键:FROM指令直接指向本地 .gguf 文件,而不是从模型仓库拉取。这样导入时 Ollama 只会在本地做量化打包,不产生任何网络请求。
同时脚本还做了两件"记账"工作:
- 生成一份指向首个模型的旧版
Modelfile(L418-L426),兼容早期单模型版本的旧逻辑; - 把所有已装模型写入
installed-models.txt(L429-L430),格式为本地名|模型名|标签。运行时的 start-windows.bat 会读取这个文件的第一行作为默认模型——安装脚本和启动脚本之间就靠它"交接"。
⚙️ 导入 Ollama:临时起服务器,装完就关
导入阶段(install-core.ps1#L516-L576)是整个脚本最精巧的部分,它回答了一个问题:如何在不常驻 Ollama 服务的前提下把 GGUF 导入模型库?
第 1 步:把模型库"搬家"到 U 盘
$env:OLLAMA_MODELS = "$USB_Drive\ollama\data"OLLAMA_MODELS是 Ollama 官方支持的环境变量,用来指定模型存储目录。这一行让所有导入的模型二进制全部落在 U 盘的ollama\data下——实现"零痕迹"的关键之一:宿主机硬盘上不会残留任何模型文件。
第 2 步:去重检查,只导入缺的
脚本先用ollama.exe list抓取当前模型列表(L528-L531),再逐一比对(L533-L546):
- GGUF 文件不存在 → 红字跳过(说明下载失败了)
- 列表里已有该本地名(用
[regex]::Escape做正则转义后匹配,避免模型名中的特殊字符干扰)→ 跳过 - 其余的加入
$modelsToImport待导入队列
同样体现了幂等思想:重复执行脚本只会补齐缺口,不会重复导入。
第 3 步:临时启动 → 导入 → 强制关闭
$ServerProcess = Start-Process -FilePath "$USB_Drive\ollama\ollama.exe" ` -ArgumentList "serve" -WindowStyle Hidden -PassThru Start-Sleep -Seconds 5 # ... 逐个执行 ollama create ... Stop-Process -Id $ServerProcess.Id -Force -ErrorAction SilentlyContinue流程拆解:
- 后台静默启动
ollama serve(-WindowStyle Hidden让黑窗口一闪而过,-PassThru拿进程句柄); Start-Sleep 5给服务 5 秒启动时间——简单粗暴但有效;- 对每个待导入模型执行
ollama create <本地名> -f Modelfile-<本地名>(L558),Ollama 会读取 Modelfile,把 .gguf 打包成正式模型; - 无论成功失败,
finally块都用Stop-Process -Force把临时服务杀掉,安装完不留后台进程。
导入失败的模型会追加到$downloadErrors,最终在结尾汇总报告中统一呈现。
🔗 收尾:自动配置 AnythingLLM 指向 U 盘模型
导入完成后,脚本还自动写好 AnythingLLM 的环境配置(install-core.ps1#L581-L616),核心内容:
LLM_PROVIDER=ollama OLLAMA_BASE_PATH=http://127.0.0.1:11434 OLLAMA_MODEL_PREF=nemomix-local OLLAMA_MODEL_TOKEN_LIMIT=4096 VECTOR_DB=lancedb配置写入 U 盘的anythingllm_data\storage\.env。这里有个温和的覆盖策略:
- 文件不存在 → 直接创建;
- 文件已存在且已配置外部 Ollama → 原样保留,不动用户的自定义设置;
- 文件存在但用的是 AnythingLLM 内置 Ollama → 覆盖为外部配置并提示 "reconfigured"。
这个策略与 start-windows.bat 中的"NEEDS_FIX"检测逻辑互相呼应:安装期配置一次,运行期只做修复、不做破坏。
🎯 设计亮点小结
| 亮点 | 实现手段 | 源码位置 |
|---|---|---|
| 校验简单可靠 | 字节数 > 阈值即有效,无需哈希 | L106-L111 |
| 重跑零浪费 | 下载前/导入前双重去重检查 | L353-L357、L533-L546 |
| 抗弱网 | curl 2 次重试 + 手动下载降级指引 | L371-L397 |
| 零痕迹 | OLLAMA_MODELS指向 U 盘,临时服务用完即杀 | L523-L524、L567-L571 |
| 失败可恢复 | 所有错误汇入$downloadErrors,结尾统一报告 | L618-L637 |
| 脚本间协作 | installed-models.txt作为安装/启动的交接文件 | L429-L430 |
整个 install-core.ps1 不到 700 行,却把"幂等、断点恢复、端口重定向、零痕迹"这些工程要点全部落实了——这也是 Portable AI USB 能做到"插上就能用、拔走不留痕"的底层原因。
📂 延伸阅读
- 官方使用文档:README.md
- Windows 入口脚本:install.bat
- 运行期启动器(查看 OLLAMA_MODELS 的"正式用法"):start-windows.bat
- Linux/Mac 对照实现(同样的目录 + 校验 + 导入逻辑用 Bash 重写):linux/install-core.sh
- 项目许可证:LICENSE
💬 下一篇将解析启动脚本 start-windows.bat 如何用 Electron 参数劫持把 AnythingLLM 也变成完全便携的。
【免费下载链接】Portable-AI-USBA 100% offline, fully portable, zero-trace AI (Ollama + Llama 3 + AnythingLLM) that runs natively from a USB drive on Windows and Mac.项目地址: https://gitcode.com/gh_mirrors/po/Portable-AI-USB
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考