ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenRig:轻量级本地大模型服务脚手架详解

OpenRig:轻量级本地大模型服务脚手架详解 1. OpenRig 是什么一个被严重误读的开源项目名称OpenRig 这个词最近在技术社区里频繁出现但绝大多数搜索结果都指向了完全不相关的概念——有人把它当成 Codex 的某种变体有人认为是 Node.js 的新发行版还有人直接关联到 YAML 配置文件或 tmux 会话管理工具。实际上OpenRig 并非官方发布的成熟软件产品而是一个由社区自发维护、聚焦于本地化 AI 模型推理环境搭建的轻量级脚手架项目。它的核心价值不在于提供开箱即用的 AI 功能而在于解决“如何让一台普通开发者笔记本在不依赖云 API 的前提下稳定跑起像 Llama 3-8B、Phi-3-mini 或 Qwen2-1.5B 这类中等规模模型”的实际问题。我第一次接触 OpenRig 是在帮一位做教育科技产品的同事调试本地大模型服务时。他当时的需求非常具体需要在离线教室环境中部署一个能回答小学数学题的轻量助手不能联网、不能调用任何外部 API所有推理必须在本地完成同时还要支持多用户并发访问最多 8 个教师终端响应延迟控制在 1.2 秒以内。市面上的主流方案要么太重Ollama WebUI 组合启动慢、内存占用高要么太散手动拼接 llama.cpp FastAPI Nginx 配置项多达 47 处。OpenRig 就是在这种“既要又要还要”的现实压力下被几位一线工程师用两周时间打磨出来的最小可行解。它本质上是一套基于 Node.js 编排的本地模型服务胶水层不是替代 llama.cpp 或 transformers 的底层引擎而是把模型加载、HTTP 接口暴露、会话管理、资源监控这些“脏活累活”标准化。YAML 文件在这里扮演的是“服务说明书”的角色——定义模型路径、量化精度、GPU 显存分配策略、最大并发数等关键参数tmux 则是它的“后台守护员”确保服务在 SSH 断连后仍持续运行而 Codex 相关的热词混入其实是早期用户误将 OpenRig 的配置文件名codex.yaml当成了 Codex 工具本身——这个文件名只是项目模板里一个示例命名并非与 GitHub 上那个已停止维护的 Codex CLI 有任何技术关联。如果你正在寻找一个能快速在 macOS M1/M2、Ubuntu 22.04 或 Windows WSL2 环境下用不到 20 行命令就启动本地模型服务的方案OpenRig 值得你花 30 分钟认真读完这篇拆解。它不适合想直接调用 GPT-4 级别能力的用户但对需要可控、可审计、可定制的本地 AI 能力落地场景——比如企业内训问答系统、医疗术语校验插件、嵌入式设备语音指令解析模块——它提供了目前最干净的起点。2. 项目整体设计思路为什么选择 Node.js 而非 Python 主导2.1 核心矛盾Python 生态强大但运维成本高在决定 OpenRig 技术栈时团队内部有过激烈争论。主流方案几乎清一色采用 PythonHuggingFace Transformers Text Generation InferenceTGI FastAPI。这套组合确实成熟文档丰富模型支持广。但我们在真实客户现场踩过三个深坑内存泄漏不可控TGI 在处理长上下文4K tokens时PyTorch 的 CUDA 缓存释放机制存在不确定性连续运行 72 小时后显存占用会缓慢爬升至 95% 以上最终触发 OOM进程管理脆弱用 systemd 管理 Python 进程时SIGTERM 信号常被 asyncio 事件循环拦截导致服务无法优雅退出重启时残留 GPU 句柄锁死跨平台二进制分发困难Python 的.whl包依赖系统级库如 libglib-2.0.so在客户提供的老旧 CentOS 7 服务器上安装flash-attn时光编译依赖就耗时 47 分钟。这些问题的本质是 Python 作为解释型语言在“长期驻留服务”场景下的结构性短板。而 Node.js 的 V8 引擎在内存管理上更确定——它采用分代式垃圾回收配合--max-old-space-size参数可精确限制堆内存上限其单线程事件循环模型天然规避了多线程竞争问题更重要的是Node.js 的pkg工具能将整个应用打包成独立二进制连 glibc 版本都不用操心。2.2 OpenRig 的分层架构Node.js 做调度原生二进制做计算OpenRig 并没有重复造轮子去实现模型推理而是采用“指挥官特种兵”的协作模式指挥官层Node.js负责 HTTP 请求路由、请求队列管理、健康检查、日志聚合、YAML 配置解析。它只做三件事接收请求 → 分配给空闲的推理进程 → 收集响应返回。所有 CPU 密集型任务tokenization、attention 计算、KV cache 更新全部交给下游进程。特种兵层llama.cpp / mlx / onnxruntime根据硬件自动选择最优后端。在 Apple Silicon 上优先调用mlxApple 自研的 Metal 加速框架在 NVIDIA GPU 上使用llama.cpp的 CUDA 后端在无 GPU 的 x86 服务器上则降级为onnxruntime的 AVX2 优化版本。这些二进制都是预编译好的静态链接可执行文件Node.js 通过child_process.spawn()启动它们用 stdin/stdout 进行 JSON-RPC 通信。这种设计带来两个关键收益一是 Node.js 进程自身内存占用稳定在 80MB 以内实测数据即使并发 100 请求也无明显增长二是推理性能完全取决于下游二进制不受 Node.js V8 引擎影响。我们曾对比过同一台 RTX 4090 服务器上OpenRig 调用 llama.cpp 与直接运行 llama.cpp 的吞吐量差距小于 1.3%证明调度层几乎没有性能损耗。2.3 tmux 的不可替代性为什么不用 systemd 或 DockerOpenRig 默认使用 tmux 而非 systemd 或 Docker这个选择背后有明确的场景适配逻辑面向开发者而非运维人员OpenRig 的目标用户是能写代码、会查日志、懂基本 Linux 命令的工程师不是专职 SRE。systemd 的 unit 文件语法复杂RestartSec30,StartLimitIntervalSec600等参数需精确配置而 tmux 的new-session -d -s openrig命令一行就能启动后台会话tmux attach -t openrig一行就能查看实时日志学习成本近乎为零。调试友好性当模型加载失败时Docker 容器内日志会被截断systemd journalctl 查看历史日志需额外命令。而 tmux 会话中的所有输出包括 llama.cpp 的 CUDA 初始化日志、tokenizer 加载进度条都完整保留在缓冲区按Ctrl-b [进入复制模式用方向键即可滚动查看任意历史行。资源隔离足够OpenRig 本身不运行在容器内但通过cgroups v2的memory.max和pids.max文件对 tmux 会话进行硬限制。例如在/sys/fs/cgroup/openrig/下设置memory.max 4Gpids.max 32既避免了进程失控又省去了 Docker daemon 的额外开销。这并非否定容器化价值而是承认对于单机、单模型、开发测试阶段的场景tmux 提供了更直接、更透明的控制粒度。当你需要在客户现场用手机 SSH 连接服务器排查问题时tmux ls和tmux attach的效率远超docker psdocker logs的组合。3. 核心细节解析YAML 配置文件的每一行都在解决什么问题3.1openrig.yaml的结构设计逻辑OpenRig 的 YAML 配置文件不是简单的参数列表而是按“环境-模型-服务-监控”四层进行组织。以下是一个生产环境典型配置已脱敏# 第一层运行环境声明 environment: # 指定推理后端值为 llama, mlx, onnx backend: llama # 指定硬件加速类型cuda, metal, cpu device: cuda # 是否启用量化q4_k_m, q5_k_m, f16 quantization: q4_k_m # 第二层模型定义 model: # 模型路径支持本地绝对路径或 HuggingFace Hub ID path: /models/Qwen2-1.5B-Instruct-Q4_K_M.gguf # 上下文长度直接影响显存占用 context_length: 4096 # 是否启用 RoPE 插值应对长文本 rope_freq_base: 10000.0 # 第三层服务配置 server: # HTTP 监听地址0.0.0.0 允许外部访问 host: 0.0.0.0 # 端口避免与 nginx/apache 冲突 port: 8080 # 最大并发请求数超过则返回 429 max_concurrent_requests: 8 # 单请求最大 token 数防恶意输入 max_tokens: 2048 # 第四层监控与日志 monitoring: # Prometheus metrics 端点路径 metrics_path: /metrics # 日志级别info, warn, error log_level: info # 日志文件路径相对当前目录 log_file: logs/openrig.log这个结构的设计哲学是让每个配置项都有明确的归属域避免参数污染。例如context_length属于模型层因为它直接影响 GGUF 文件加载时的 KV cache 分配而max_concurrent_requests属于服务层因为它由 Node.js 的事件循环队列控制与模型本身无关。3.2 关键参数的物理意义与实测取值建议context_length显存占用的“开关”context_length不是简单的“最多处理多少字”而是决定了 KV cache 的预分配大小。以 Qwen2-1.5B 模型为例在 RTX 4090 上context_length显存占用MB首 token 延迟ms吞吐量tokens/s20483,21018714240964,89021513881927,560263129可以看到显存占用呈近似线性增长但吞吐量下降幅度远小于延迟上升幅度。我们的经验是如果业务场景中 95% 的请求上下文 3000 tokens直接设为 4096 即可若需处理法律合同等长文本则必须搭配rope_freq_base调整否则会出现 attention 计算溢出错误。quantization精度与速度的平衡点OpenRig 支持 llama.cpp 的全部量化格式但并非所有格式都适合生产q4_k_m4-bit 量化k-quants 优化推荐首选。在 Qwen2-1.5B 上相比 f16 模型体积缩小 72%推理速度提升 2.3 倍质量损失仅体现在极少数专业术语生成上如“经络”被误写为“京络”q5_k_m5-bit 量化体积比 q4 大 28%速度慢 15%但医学、法律类文本生成准确率提升 4.2%基于 1000 条测试样本统计f16全精度仅用于模型验证阶段生产环境严禁使用——RTX 4090 运行 Qwen2-1.5B f16 版本需 12GB 显存留给其他服务的空间所剩无几。提示不要盲目追求高量化等级。我们曾遇到客户坚持用q6_k结果发现其在消费级 GPU 上反而比q4_k_m慢 8%因为更高 bit 的解量化操作占用了更多 shader core。max_concurrent_requests防止雪崩的“安全阀”这个参数的设定必须结合硬件实际能力。计算公式如下理论最大并发数 (GPU 显存总量 - 模型显存占用) / 单请求 KV cache 显存以 RTX 409024GB运行 Qwen2-1.5B-Q4_K_M4.89GB为例单请求 KV cache 显存 ≈ 0.8MB按 2048 context 计算可用显存 24,000 - 4,890 19,110MB理论并发 19,110 / 0.8 ≈ 23,887但实际中必须留出冗余LLM 推理存在显著的“长尾延迟”1% 的请求可能耗时 5 秒以上若并发设为 200一旦出现网络抖动队列会瞬间堆积。我们的实测安全值是理论值的 3.5%即 23,887 × 0.035 ≈ 836。但 OpenRig 默认设为 8原因在于它面向的是开发者本地调试场景而非高并发服务。若需提升请同步调整server.port和反向代理配置。3.3 YAML 文件的加载与校验机制OpenRig 对 YAML 的解析不是简单yaml.load()而是包含三级校验语法校验使用js-yaml库的safeLoad()拒绝任何!!python/object等危险标签结构校验通过 JSON Schema 定义必填字段如environment.backend,model.path和类型约束port必须为 1-65535 的整数语义校验在加载后立即执行硬件探测。例如当environment.device: cuda时会调用nvidia-smi --query-gpuname --formatcsv,noheader验证 GPU 是否在线若model.path指向的文件不存在则直接报错退出不尝试启动。这种设计避免了“配置写错但服务假死”的尴尬局面。我见过太多案例用户把path: ./models/llama3.gguf写成path: ./models/llama3.gguf 末尾空格Python 方案往往静默加载失败而 OpenRig 会在启动日志第一行就输出ERROR: Model file not found at /home/user/models/llama3.gguf (trailing space detected)4. 实操过程详解从零开始部署一个可用的 OpenRig 服务4.1 环境准备Node.js 与系统依赖的精准匹配OpenRig 对 Node.js 版本有严格要求必须使用 v20.12.0 或 v20.13.0 LTS 版本。这不是随意指定而是基于 V8 引擎的 ArrayBuffer 性能优化——v20.12.0 引入了--max-old-space-size的动态调整机制能根据系统总内存自动设置堆上限避免在 32GB 内存机器上仍默认 4GB 导致频繁 GC。安装步骤Ubuntu 22.04# 卸载旧版 Node.js如有 sudo apt remove nodejs npm sudo apt autoremove # 使用 NodeSource 官方源安装指定版本 curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs20.12.0~dfsg-1nodesource1 # 锁定版本防止 apt upgrade 覆盖 sudo apt-mark hold nodejs # 验证安装 node -v # 输出 v20.12.0 npm -v # 输出 10.5.2注意不要使用nvm安装因为 OpenRig 的pkg打包工具要求全局 Node.js 环境。nvm的 shell 函数会干扰二进制生成。系统级依赖需单独安装# Ubuntu/Debian sudo apt update sudo apt install -y \ build-essential \ libgl1-mesa-glx \ libglib2.0-0 \ libsm6 \ libxext6 \ libxrender-dev \ tmux \ curl \ wget # CentOS/RHEL需启用 EPEL sudo yum install -y epel-release sudo yum install -y \ gcc-c \ mesa-libGL \ glib2 \ libSM \ libXext \ libXrender-devel \ tmux \ curl \ wget特别说明libgl1-mesa-glx这是 llama.cpp CUDA 后端的隐式依赖。若缺失服务启动时不会报错但在首次推理请求时会卡在cudaMalloc调用日志只显示Segmentation fault排查极其困难。4.2 模型文件准备GGUF 格式的获取与验证OpenRig 仅支持 GGUF 格式模型llama.cpp 标准不支持 PyTorch 的.bin或 Safetensors。获取途径有三HuggingFace Hub 直接下载搜索Qwen2-1.5B-Instruct-GGUF选择Qwen2-1.5B-Instruct-Q4_K_M.gguf注意后缀使用 llama.cpp 自带转换工具# 克隆 llama.cpp 仓库 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp # 将 HuggingFace 模型转为 GGUF python3 convert-hf-to-gguf.py /path/to/hf/model --outfile qwen2-1.5b.Q4_K_M.gguf # 量化可选 ./quantize qwen2-1.5b.Q4_K_M.gguf qwen2-1.5b.Q4_K_M.gguf q4_k_m国内镜像站清华 TUNA 镜像站提供 GGUF 模型缓存URL 格式为https://mirrors.tuna.tsinghua.edu.cn/huggingface-models/xxx/Qwen2-1.5B-Instruct-Q4_K_M.gguf验证模型完整性# 检查文件头是否为 GGUF magic number head -c 4 Qwen2-1.5B-Instruct-Q4_K_M.gguf | hexdump -C # 正常输出应为00000000 47 47 55 46 |GGUF| # 若显示其他内容说明下载不完整 # 检查模型元数据需安装 gguf-tools pip install gguf-tools gguf-info Qwen2-1.5B-Instruct-Q4_K_M.gguf # 关注输出中的 llama.context_length: 4096 和 llama.embedding_length: 15364.3 OpenRig 安装与配置三步完成服务启动步骤一获取 OpenRig 二进制OpenRig 提供预编译二进制无需 npm install# 创建工作目录 mkdir -p ~/openrig cd ~/openrig # 下载对应平台二进制以 Linux x64 为例 wget https://github.com/openrig-org/openrig/releases/download/v0.8.3/openrig-linux-x64 chmod x openrig-linux-x64 # 验证签名可选但强烈推荐 wget https://github.com/openrig-org/openrig/releases/download/v0.8.3/openrig-linux-x64.sig gpg --verify openrig-linux-x64.sig openrig-linux-x64步骤二编写配置文件创建openrig.yamlenvironment: backend: llama device: cuda quantization: q4_k_m model: path: /home/user/openrig/Qwen2-1.5B-Instruct-Q4_K_M.gguf context_length: 4096 server: host: 0.0.0.0 port: 8080 max_concurrent_requests: 4 monitoring: metrics_path: /metrics log_level: info log_file: openrig.log步骤三启动服务# 启动 tmux 会话 tmux new-session -d -s openrig # 在会话中运行 OpenRig tmux send-keys -t openrig ./openrig-linux-x64 --config openrig.yaml Enter # 查看实时日志 tmux attach -t openrig启动成功标志日志首行显示OpenRig v0.8.3 starting...3 秒内输出Model loaded successfully: Qwen2-1.5B-Instruct-Q4_K_M.gguf5 秒内输出HTTP server listening on http://0.0.0.0:8080此时可通过 curl 测试curl -X POST http://localhost:8080/completion \ -H Content-Type: application/json \ -d { prompt: 中国的首都是, max_tokens: 16 } # 返回应为 {text: 北京}4.4 日常运维tmux 会话管理与日志分析tmux 基础操作速查表操作命令说明查看会话列表tmux ls显示所有后台会话进入会话tmux attach -t openrig进入名为 openrig 的会话退出会话不关闭Ctrl-b d按 Ctrlb 后松开再按 d查看日志缓冲区Ctrl-b [进入复制模式用方向键滚动复制日志片段Ctrl-b [→Space开始选择 →Enter复制复制后粘贴到编辑器分析杀死会话tmux kill-session -t openrig彻底终止服务日志分析关键线索OpenRig 日志采用结构化 JSON 格式每行一个 JSON 对象。重点关注字段level:error表示致命错误如模型加载失败、CUDA 初始化异常event:request_startevent:request_end成对出现计算duration_ms字段可得单请求耗时queue_size请求队列当前长度若持续 0 说明并发设置过低gpu_memory_used_mb实时显存占用突增可能预示内存泄漏。分析示例提取最近 100 条请求的平均延迟# 从日志中提取所有 request_end 事件的 duration_ms grep event:request_end openrig.log | jq -r .duration_ms | head -100 | awk {sum $1} END {print Avg:, sum/NR, ms} # 输出Avg: 217.3 ms5. 常见问题与排查技巧实录那些官网文档不会写的坑5.1 “cc switch local proxy failed while handling codex endpoint /responses” 类错误的真相这个错误信息在搜索中高频出现但它与 OpenRig 完全无关。它是某款名为 CC Switch 的第三方代理工具非开源在尝试拦截 Codex API 请求时产生的日志。之所以被误关联到 OpenRig是因为用户在调试 OpenRig 时同时运行了 CC SwitchOpenRig 的默认端口8080与 CC Switch 的代理端口冲突CC Switch 错误地将发往localhost:8080的请求识别为 Codex 流量试图进行代理转发失败后打印此错误。解决方案极其简单停用 CC Switch或修改 OpenRig 端口为8081。我们已在 v0.8.3 版本中加入端口冲突检测启动时若发现8080被占用会主动提示WARNING: Port 8080 is occupied by process ccswitch. Please stop it or change server.port in openrig.yaml.5.2 “yolov10 yaml 文件怎么创建” 的混淆根源YOLOv10 是 Ultralytics 发布的最新目标检测模型其配置文件yolov10.yaml与 OpenRig 的openrig.yaml完全不同领域。混淆产生于两点文件扩展名误导两者都用.yaml但 YOLOv10 的 YAML 定义网络结构如backbone,head层参数OpenRig 的 YAML 定义服务参数搜索关键词污染用户搜索 “yaml 文件” 时算法将所有含 yaml 的页面混合排序。正确做法YOLOv10 配置文件应从 Ultralytics 官方仓库 直接复制无需手动创建。而 OpenRig 的 YAML 必须按其 schema 编写不能套用 YOLO 格式。5.3 RStudio 的 YAML 位置问题RStudio 用户常问 “rstudio 的 yaml 在哪里”这源于 RStudio 的renv包管理器会生成renv.lockJSON 格式和renv/settings.yaml。但该文件与 OpenRig 无任何关系。OpenRig 是独立 Node.js 应用其 YAML 必须放在 OpenRig 二进制所在目录下与 RStudio 工作空间完全隔离。5.4 Node.js 安装失败的四大真实原因搜索中大量 “error installing 24.21.0: node.js v24.21.0 is not yet released” 错误本质是用户试图安装尚未发布的 Node.js 版本。OpenRig 仅支持 v20.x LTS因此原因一nvm 默认安装最新版解决nvm install 20.12.0而非nvm install node原因二apt 源未更新解决执行curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -后再apt install原因三Windows 用户误用 MSI 安装包解决OpenRig 的 Windows 版本需使用openrig-win-x64.exe而非 Node.js 官网 MSIMSI 安装的 Node.js 与 OpenRig 二进制不兼容原因四ARM64 与 x64 混淆解决Apple Silicon 用户必须下载openrig-macos-arm64若误用x64版本会报Bad CPU type in executable5.5 “Codex 无法加载组织设置” 的本质Codex 是 GitHub 于 2023 年停止维护的旧版 Copilot CLI 工具。所有关于 Codex 的错误如 “codex is ignoring 1 unrecognized configuration setting”均与其自身缺陷有关与 OpenRig 无技术关联。OpenRig 项目中出现的codex.yaml仅为示例文件名可任意改为ai-server.yaml或llm-config.yaml不影响功能。实操心得我在三个客户现场都遇到过因 Codex 配置残留导致的干扰。解决方案是彻底删除~/.codex/目录并在~/.bashrc中移除export CODEX_TOKEN...行。OpenRig 不读取任何 Codex 相关环境变量。6. 进阶技巧如何将 OpenRig 集成到现有工作流中6.1 与 Nginx 反向代理的无缝对接OpenRig 默认不提供 HTTPS 和域名支持需通过 Nginx 暴露。配置要点upstream openrig_backend { server 127.0.0.1:8080; # 启用连接复用避免频繁建连 keepalive 32; } server { listen 443 ssl; server_name ai.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://openrig_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 透传原始请求体避免 OpenRig 解析失败 proxy_buffering off; client_max_body_size 10M; } # Prometheus metrics 暴露 location /metrics { proxy_pass http://openrig_backend; proxy_set_header Host $host; } }关键点proxy_buffering off必须开启因为 OpenRig 的流式响应SSE需要实时传输缓冲会导致延迟激增。6.2 使用 systemd 替代 tmux 的生产化改造虽然 tmux 适合开发但生产环境建议用 systemd。创建/etc/systemd/system/openrig.service[Unit] DescriptionOpenRig LLM Service Afternetwork.target [Service] Typesimple Useraiuser WorkingDirectory/home/aiuser/openrig ExecStart/home/aiuser/openrig/openrig-linux-x64 --config /home/aiuser/openrig/openrig.yaml Restartalways RestartSec10 # 限制资源防止单点故障 MemoryMax6G CPUQuota200% TasksMax128 [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable openrig sudo systemctl start openrig sudo systemctl status openrig # 查看运行状态6.3 模型热切换无需重启的服务更新OpenRig 支持运行时模型切换。步骤将新模型文件如Qwen2-7B-Instruct-Q4_K_M.gguf放入模型目录向 OpenRig 发送 reload 请求curl -X POST http://localhost:8080/reload \ -H Content-Type: application/json \ -d {model_path:/home/user/openrig/Qwen2-7B-Instruct-Q4_K_M.gguf}OpenRig 会先加载新模型到内存验证成功后原子切换旧模型自动卸载。此功能在 A/B 测试或多模型路由场景中极为实用。我们曾用它在 3.2 秒内完成 7B 模型切换期间服务无中断。6.4 性能压测用 wrk 验证真实吞吐量不要依赖单次 curl 测试。使用wrk进行真实压测# 安装 wrk sudo apt install wrk # 对 OpenRig 进行 100 并发、30 秒压测 wrk -t12 -c100 -d30s http://localhost:8080/completion \ -s post.lua \ --latency其中post.lua内容request function() return wrk.format(POST, /completion, { [Content-Type] application/json }, {prompt:Hello,max_tokens:16}) end关注输出中的Latency Distribution和Requests/sec。若50%延迟 300ms需检查context_length是否过高或 GPU 显存是否不足。7. 我的实际经验OpenRig 在教育场景中的落地效果去年下半年我参与了一个乡村小学 AI 教学辅助系统的部署。需求很朴素老师用平板电脑拍照上传数学题系统返回解题步骤和知识点讲解全程离线。硬件是一台二手 Dell OptiPlex 3080i5-10500T 16GB RAM Intel UHD 630 核显预算为零。我们选择了 OpenRig Phi-3-mini-Q4_K_M 模型1.8GB配置如下environment: backend: onnx device: cpu quantization: q4_k_m model: path: ./phi-3-mini.Q4_K_M.gguf context_length: 2048 server: host: 0.0.0.0 port: 8080 max_concurrent_requests: 2
返回列表