1. 为什么要折腾本地大模型
先聊点实际的。你可能已经用过 ChatGPT、DeepSeek 这类在线服务,体验确实不错,但遇到三件事就很烦:第一,涉及内部数据,不敢随便往公网传;第二,API 按 token 计费,团队人一多,账单压力不小;第三,网络环境不稳定,关键时刻服务不可用,只能干瞪眼。
本地部署大模型就是绕开这些问题的路子。把模型文件下载到自己的电脑或者内网服务器上,用 Ollama 这层运行时跑起来,然后不管是 IDE 写代码、Web 应用还是 API 调用,全部走你本地地址,数据不出内网,速度也快。整个过程并不复杂,但有不少坑——单是"下载慢"这一个问题就能劝退不少人。
这篇文章就按我的实际部署经历来写,从环境准备、模型下载,到接入 IDE、Web 和 API 全流程走一遍,把踩过的坑和解决办法都整理出来。先说我这次的部署环境:一台 Windows 11 机器,显卡是 RTX 4070 12G,内存 32G。这个配置跑 7B~14B 参数量的模型很舒服,32B 以上的就得显存吃紧,后面我会细说选型的逻辑。
Ollama 这个项目本质上是把 llama.cpp 之类的底层推理引擎包装成了一个开箱即用的服务,自带模型管理、进程守护和 HTTP API。你只需要安装它、拉取模型、启动服务,剩下的推理细节它全包了。最适合的场景是个人开发机、团队内网的 AI 服务和私有化知识库。这篇文章适合谁?有编程基础但对大模型部署不熟的人,以及想快速把大模型接入日常开发工具的团队。
2. 环境准备:安装和模型下载的一堆坑
2.1 下载安装为什么这么慢
如果你直接去官网下载 Ollama 安装包,大概率会卡在几十 KB/s。这不是你网络的问题,是默认分发节点对国内连接不友好。解决办法是走国内加速镜像,不少开源镜像站和加速服务都同步了 Ollama 的安装包和模型仓库。
这里给 Windows 用户一个实测可行的路径。先去 Ollama 的 GitHub Releases 页面确认最新版本号,然后把下载链接里的域名替换成加速地址,浏览器里就能跑满带宽。安装的时候它默认会装到 C 盘,装完用系统托盘里的 Ollama 图标就能确认服务是否在跑。macOS 和 Linux 同理,用安装脚本时加上代理环境变量就行。
提示:安装完成后,Ollama 会自动注册一个系统服务(Windows 下是 Ollama.exe),默认监听 11434 端口。这步不用手动配置,但下面说的模型路径调整一定要看。
安装包搞定了,更大的坑是模型文件。一个 7B 参数的模型 Q4 量化版大概 4.7GB,要在默认模型库里拉,又是龟速甚至断连。我实际测试下来,把 Ollama 的模型源切到国内镜像之后,千问 7B 不到十分钟就拉完了。具体做法是设置环境变量 OLLAMA_MODELS 指向你的模型存放目录,同时把模型下载的 registry 指向镜像地址,这个在 Ollama 的官方文档里有说明,照着改就行。
2.2 模型文件放哪个盘,怎么改路径
对大多数人来说,Ollama 默认把模型装在系统盘是个隐患。C 盘空间紧张的话,跑两个模型就爆了。强烈建议装完第一步就修改模型存储路径。
在 Windows 上,右键"此电脑"-"属性"-"高级系统设置"-"环境变量",新建一个用户变量,变量名 OLLAMA_MODELS,变量值填你希望存放模型的目录,比如 D:\ollama_models。Linux 和 macOS 就改 .bashrc 或 .zshrc,export OLLAMA_MODELS=/data/ollama。改完必须重启 Ollama 服务才生效。
另一个值得提前设的是 OLLAMA_HOST。默认只监听 127.0.0.1,如果团队其他同事要访问你这台机器上的服务,得改成 0.0.0.0。这个我后面讲局域网部署的时候会细说。
2.3 模型怎么选:跑得动比跑得大重要
选模型是最容易上头的一步。看到 Llama 3 70B 很强,就想往自己 12G 显存里塞,结果下载半天,跑起来一个 token 要好几秒,根本没法用。
我的推荐标准很简单:显存 8G 以下用 7B 模型,12G 到 16G 用 14B 模型,24G 以上才考虑 32B。参数量往上走,先死的不是显存,是内存带宽——Apple Silicon 统一内存跑大模型的体验差距就是从这里来的。
在 Ollama 生态里,命令是 ollama run qwen2.5:7b,拉取指令是 ollama pull qwen2.5:7b。qlora 微调过的版本、非量化版本,通常在模型描述里会标注,选默认的 latest 就行,它会自动选择适合当前硬件的量化格式。
2.4 第一条命令:跑起来看看
装好、配好路径、拉完模型之后,验证一下:
ollama run qwen2.5:7b出现 "Send a message" 提示符,说明成功了。先问它一句"你好,介绍一下你自己",响应速度如果快,说明环境没问题。在交互里可以用 /bye 退出,用 /set 设置参数。
注意:首次运行会有一个加载模型的过程,如果显存不够,Ollama 会自动把不用的层卸载到内存(甚至 CPU 推理),速度会明显下降。这种情况可以先 Ctrl+C 退出,用小一号的模型。
3. 把本地模型接入 IDE:写代码的体验直接拉满
3.1 Continue 插件:本地模型最舒服的搭档
IDE 接入这块,我试过好几条路,最顺的还是 VS Code 的 Continue 插件。这个插件天然支持 Ollama 的本地模型,不用像其他方案那样折腾各种中转层。
安装方式就不多废话了,直接在 VS Code 插件市场搜 "Continue" 安装。装完之后它在左侧边栏有一个对话框,你可以把本地代码文件拉进去作为上下文,让它解释代码、补全代码、改 Bug。更关键的是 Continue 提供了"Codebase"索引模式,会把当前项目的代码做成向量索引,问问题的时候自动检索相关代码片段,这对老项目的理解特别有帮助。而这一步用 Ollama 的 embedding 模型就能完成,不用额外的向量数据库。
Continue 的原理是:通过 OpenAI 兼容接口连到本地 11434 端口,配置的时候在模型供应商选择 "Ollama",然后在模型栏填你下载好的模型名,比如 qwen2.5-coder:7b。如果你还想用 Continue 的代码补全功能,需要同时在 "Autocomplete" 配置里启用同样的模型。启动补全之后,写代码会有 AI 联想的效果,延迟取决于显卡算力,4070 跑 7B 大概三四百毫秒,体感很跟手。
3.2 用模型解释一段历史代码
接好之后我第一件事是找之前接手的一个老 Java 项目,让 Continue 分析一下整个模块的职责和数据库设计。它把 mapper.xml 里的 SQL 逐条解读,定位到几个存在笛卡尔积的连接查询,连优化建议都给了。这种体验能节省大量读代码的时间。
需要提醒的是,Continue 的对话上下文是保存在本地 session 里的,重启 VS Code 不会丢。如果你换了模型或者改过 embedding 配置,历史索引记得重建一次,否则检索出来的代码可能是旧的。重建在 Continue 面板的命令里找 Reindex Project 即可。
3.3 JetBrains 全家桶怎么接
如果你主力是 IntelliJ IDEA 或者 PyCharm,也有路子。除了 Continue(JetBrains 版),还有个叫 BW-Forge 的插件能连 Ollama,界面很像 GitHub Copilot,能对话能补全。配置方式类似:在设置里填 Ollama 服务的 base URL 和模型名。
我的建议是:日常写 Python 用 Continue + 14B 模型就够,因为非代码生成场景下模型理解能力更重要,7B 也能扛;但生成代码补全建议用专门的 coder 模型,质量高不少。另外注意 JetBrains 系列的 AI 插件要确认版本兼容性,有些插件要 2024.1 以上的 IDE 才支持。
实操心得:IDE 接入最容易翻车的点不是插件,而是模型名填错。Ollama 的模型名格式是 name:tag,比如 qwen2.5-coder:7b-instruct。如果只填 qwen2.5,有可能拉到通用对话版,代码能力弱很多。拉模型前建议先 ollama list 看一下本地有哪些模型,确认准确名称。
4. 让 Web 应用调用本地大模型:API 才是核心
4.1 Ollama API 速览
本地服务起来之后,Ollama 其实就是一个标准的 HTTP API 服务。它给了一套兼容 OpenAI 的接口路径,这意味着你之前写的 OpenAI SDK 调用代码,只需要改两行配置就能切到本地模型上。这是它最爽的地方。
核心接口有几个:
- POST /api/chat:对话补全,支持多轮消息,适合聊天类和 Agent 场景
- POST /api/generate:单次文本生成,适合写文案、总结等一次性任务
- GET /api/tags:列出本地已安装的模型列表
- POST /api/embeddings:生成文本向量,知识库检索用
- POST /v1/chat/completions:OpenAI 兼容接口,给现有 OpenAI SDK 用
响应格式上,默认流式返回,也就是数据一块一块往外推,和浏览器打字机效果一样。如果不想要流式,请求体加 "stream": false 就行。
先测试一下接口通不通:
curl http://localhost:11434/api/tags返回的是一个 JSON,里面包含 models 数组。看到这个,说明一切正常。
4.2 Python 快速接入:官方 SDK 和请求库两种写法
Python 接入是最常见的场景。先装官方 SDK:
pip install ollama然后就能直接和新模型对话:
import ollama response = ollama.chat( model="qwen2.5:7b", messages=[ {"role": "user", "content": "用一句诗形容晚霞"} ] ) print(response["message"]["content"])如果你不想引入 SDK,curl 也行。我看很多小伙伴喜欢直接用 requests 库,顺手把支持流式和非流式的完整代码贴出来:
import requests import json url = "http://localhost:11434/api/generate" payload = { "model": "qwen2.5:7b", "prompt": "把这段话翻译成英文:今天天气很好,适合出门散步。", "stream": False } resp = requests.post(url, json=payload, timeout=300) data = resp.json() print(data["response"])这里要解释一下为什么 timeout 要拉到 300 秒。本地模型看起来是"即时"生成,但生成长文时,一个 7B 模型在 GPU 上的生成速度也就每秒四五十个 token。你让它生成 1000 个 token 的代码,二十秒以上很正常。请求库默认的超时时间太短,不调高会直接抛 timeout 异常。
4.3 Node.js 和前端页面调用:打通浏览器到本地模型
Web 前端的调用方式要走 HTTP,不能直接在浏览器里写 Ollama 的 SDK。一般做法是在自己的后端(Node、Spring 或 Flask 都行)做一个代理接口,把 Ollama 的服务包一层,前端只管请求你的接口。
Node.js 后端最简单干净:
const express = require("express"); const app = express(); app.use(express.json()); app.post("/api/local-chat", async (req, res) => { const { prompt } = req.body; const resp = await fetch("http://localhost:11434/api/generate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: "qwen2.5:7b", prompt, stream: true, }), }); res.setHeader("Content-Type", "text/plain; charset=utf-8"); const reader = resp.body.getReader(); const decoder = new TextDecoder(); while (true) { const { value, done } = await reader.read(); if (done) break; const text = decoder.decode(value, { stream: true }); // 直接把文本推到前端,浏览器会显示打字机效果 res.write(text); } res.end(); }); app.listen(3000);前端页面里用 fetch 或者 axios 请求这个接口,然后通过 Response.body.getReader() 流式读取文本。这就能做出类似 ChatGPT 网页版那种一段一段蹦字的效果。
这里有个关键点:Ollama 的流式返回是一行一个 JSON 对象,不是明文。如果你前端拿到的是一堆带花括号的 JSON,需要在后端做一次解析,把 data["response"] 字段单独提取出来再 res.write。我这个示例为了直观简化了处理,实际生产代码建议把 SSE(Server-Sent Events)格式封装好。
4.4 局域网部署:同事电脑也能访问
默认 Ollama 只监听本机的 11434 端口,想局域网访问需要改环境变量 OLLAMA_HOST=0.0.0.0,重启服务。改完在你电脑上先验证:
curl http://localhost:11434然后拿手机或者另一台电脑,输入你电脑的局域网 IP 加端口,比如 http://192.168.1.20:11434,能通就说明局域网 OK。
这一步有个很容易踩的坑:Windows 防火墙。就算网线通着,防火墙默认会拦 ollama.exe 的入站连接。第一次测试不通先检查防火墙,在"高级安全设置"里放行 Ollama 或者整个 11434 端口,然后再回头排查其他问题。
5. 更多实操:模型管理、参数优化和常见故障
5.1 换模型、删模型、看模型,一个命令搞定
Ollama 的日常管理全在命令行里。整理一下高频操作:
ollama list # 查看本地已下载的模型列表 ollama pull qwen2.5:7b # 下载指定模型 ollama rm qwen2.5:7b # 删除指定模型 ollama show qwen2.5:7b # 查看模型详情(上下文长度、架构等) ollama stop qwen2.5:7b # 停止正在运行的模型,释放显存日常维护就这几个命令,记不住就贴到笔记里。特别注意 ollama show 输出的 context length 参数,不同模型差异很大,你在代码里设置上下文窗口的时候要以这个为准,否则会报错。
5.2 模型参数微调:温度、上下文长度、重复惩罚
Ollama 的 API 支持很多推理参数,挑三个最常用的说:
temperature 控制随机性,写代码建议 0.2 到 0.4,太高容易胡编代码;写文案可以 0.8 到 1.0。num_ctx 是上下文长度,默认经常是 2048,但现在的模型动辄支持 8K、32K,把代码库贴进去,你得调大这个值。num_predict 是最大生成 token 数,默认 128 太短,生成长报告常被截断,我一般设 2048。
在 API 请求里这样传:
curl http://localhost:11434/api/generate -d '{ "model": "qwen2.5:7b", "prompt": "写一份关于项目架构的说明", "stream": false, "options": { "temperature": 0.4, "num_ctx": 8192, "num_predict": 2048 } }'调参数的核心逻辑是:先跑一个小任务看看默认输出,如果回答明显跑偏就看 temperature 和 repeat_penalty;如果一问到细节就"失忆",看 num_ctx 是否太小;如果回答被截断,看 num_predict。逐个定位,比一并改完要看疗效靠谱。
5.3 常见问题速查表
把这段时间遇到的报错和解决方案整理成了表格,方便直接对照:
| 故障现象 | 可能的根因 | 解决办法 |
|---|---|---|
| ollama pull 卡在几 KB/s | 默认源在国内连接慢 | 配置国内镜像源,或设置镜像加速后重试 |
| 运行时报 "manifest not found" | 模型名写错或模型未下载成功 | 用 ollama list 核对准确名称,重新 pull |
| 生成速度极慢(每秒几个 token) | 显存不够,模型跑到 CPU 上了 | 换更小的模型或量化版本,减少 num_ctx |
| 局域网其他电脑连不上 | 防火墙拦截或未监听 0.0.0.0 | 检查 OLLAMA_HOST,并在 Windows 防火墙放行 11434 |
| API 报 http 400 "context length exceeded" | 输入内容超过模型支持的上下文 | 调小 num_ctx,或使用上下文更长的模型版本 |
| IDE 插件连不上 11434 | 插件地址填错,或多实例端口冲突 | 确认填 http://localhost:11434,检查端口占用 |
5.4 提高性能的一些小心得
跑本地模型要快,除了显卡本身,还有几个软性优化点值得注意。
第一,优先使用量化模型。Ollama 拉取模型默认就会选 Q4_K_M 这类常见量化格式,显存占用小、速度影响不大,这是最划算的一档。第二,关掉占用显存的其他程序,特别是浏览器开满标签页,100 多 MB 的显存被吃掉很正常。第三,设置 OLLAMA_NUM_PARALLEL 可以控制并发请求数,默认 1,也就是说同一时刻只能处理一个请求。如果你是拿它当团队服务用,可以调高这个值,但对显存要求也更高。
实操心得:很多人觉得"本地模型"就一定比云上 API 慢,其实在民用显卡上,7B 模型能跑到每秒 50 token 左右,比很多在线 API 的响应还快,而且没有网络延迟。如果只是写个脚本工具、本地知识库问答这类轻量场景,完全够用。
6. 这套东西到底能用在哪,哪些场合不建议硬上
部署好 Ollama 之后,我实际落地的几个用途可以给你参考。
一个是本地知识库问答。用 bge-m3 这类 embedding 模型把内部文档向量化,配合 Ollama 的 embedding 接口做检索增强生成(RAG),比直接微调模型要轻量得多,而且文档更新即时生效。另一个是代码审查助手。把 Continue 接到 CI 的流水线,提交的代码变更自动让模型跑一遍 review,找出潜在的异常边界和明显的逻辑问题。还一个是把 Ollama 当后端的 OpenAI 替代品。很多开源项目已经支持自定义 API 地址,改一个环境变量指向 localhost 就行,离线也能开发调试。
不过也有不适合硬上的场景:如果你们对生成质量要求极高,比如医疗建议、法律文书这类,小尺寸本地模型的输出稳定性比不过旗舰 API 模型。如果并发量要求很高,一台普通机器上跑最大吞吐量的收益很低,分布式部署的成本还不如直接买 API。这些场合不要为了省钱硬上,明确边界才是正确方案。
7. 几点真实体会
最后说点不写在官方文档里的东西。
本地部署大模型的完整链路,最耗时间的往往不是推理配置,而是"模型选型"和"数据准备"。我在第一次部署时花了大半天反复测试不同模型的代码理解能力,最后留下来长期用的是 qwen2.5-coder 和 bge-m3 两个模型,一个处理对话和代码,一个做向量化。不要贪多,精选两三个固定下来,日常效率最高。
跑模型前建议先看一下任务管理器或 nvidia-smi,确认 GPU 利用率跑到 90% 以上而不是 CPU 在硬扛。如果模型一直在 CPU 上跑,跑再快也白搭,直接换小模型才是正解。
这套流程跑通之后,你的开发环境就多了一个完全由自己掌控的 AI 助手。没有调用额度限制,没有隐私外泄风险,局域网内随便用。后续我还在折腾把 Ollama 接入到微信机器人里,让它能被群里的同事直接调用,那块玩明白了我再单独写一篇。