Ollama 本地起一个开发助手
本文是一篇 完全实践向 的指南,每条命令都在 M2 Pro / 32 GB 的 MacBook 上实测过。Linux 用户也基本一样,差别会单独标注。
把 LLM 跑在本地,对前端开发者有三个独立价值:
- 隐私:公司内部代码、半成品方案不外传。
- 省钱:日常 IDE 补全、commit message 这种 99% 不需要顶级模型的活儿,本地跑零成本。
- 离线:飞机上、咖啡馆、ICP 备案出问题的那一周,依然能写代码。
下面这套配置我用了大概八个月,结论:M 系列芯片 + Qwen2.5-Coder 7B + Continue.dev,可以替代 80% 的 Copilot 日常使用场景。
::: tip 本文路线
- 装 Ollama 并拉一个模型
- 命令行先把它用起来
- 用 OpenAI 兼容 API 接入任何工具
- 在 VS Code / Cursor 里替代 Copilot
- 性能、显存、模型选择的实测对比
- 我踩过的 5 个坑 :::
一、安装
macOS
brew install ollama
# 或者直接下安装包:https://ollama.com/download
装完启动后台服务:
ollama serve # 前台跑(可看日志)
# 或
brew services start ollama # 开机自启
验证:
curl http://localhost:11434/api/tags
# {"models":[]} ← 还没拉模型,这个返回是对的
Linux
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable --now ollama
Windows
Ollama for Windows 安装包。原生 Windows,不需要 WSL。
二、第一个能用的模型:Qwen2.5-Coder
我推荐 新手直接拉这个,原因下面会展开:
ollama pull qwen2.5-coder:7b
# 4.7 GB,三五分钟下完
跑一下:
ollama run qwen2.5-coder:7b
>>> 用 TypeScript 写一个防抖函数
function debounce<T extends (...args: any[]) => any>(
fn: T,
wait: number
): (...args: Parameters<T>) => void {
let timer: ReturnType<typeof setTimeout> | null = null;
return (...args: Parameters<T>) => {
if (timer) clearTimeout(timer);
timer = setTimeout(() => fn(...args), wait);
};
}
7B 的 coder 模型对这种"写一个工具函数"的需求已经够用,速度大概 40-60 tokens/s(M2 Pro),打字基本跟得上你的眼睛。
退出:/bye 或 Ctrl+D。
模型选择对照表(实测)
| 模型 | 体积 | RAM 占用 | 速度 (M2 Pro) | 适合场景 |
|---|---|---|---|---|
qwen2.5-coder:1.5b | 1.0 GB | ~2 GB | 120 t/s | 极速补全 |
qwen2.5-coder:7b | 4.7 GB | ~6 GB | 50 t/s | 日常开发助手 ⭐ |
qwen2.5-coder:14b | 9 GB | ~11 GB | 25 t/s | 复杂重构 |
qwen2.5-coder:32b | 20 GB | ~24 GB | 12 t/s | 接近 Claude 3.5 Sonnet |
deepseek-coder-v2:16b | 9 GB | ~11 GB | 30 t/s | 推理类任务好 |
llama3.1:8b | 4.7 GB | ~6 GB | 55 t/s | 非编码对话 |
nomic-embed-text | 274 MB | <1 GB | — | 嵌入模型(RAG 用) |
::: warning 选模型的简单原则 RAM ≤ 16 GB:跑 7B;RAM 32 GB:跑 14B;RAM 64 GB:可以挑战 32B。 模型大小 × 1.3 ≈ 实际 RAM 占用。 :::
三、OpenAI 兼容 API
Ollama 从 0.1.24 起内置 OpenAI 兼容端点,这是它真正强大的地方。
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5-coder:7b",
"messages": [
{ "role": "system", "content": "你是一个简洁的代码助手。" },
{ "role": "user", "content": "用 zsh 写一个找出 docs 下所有空 markdown 文件的命令" }
],
"stream": false
}'
返回结构跟 OpenAI 一模一样。这意味着任何支持 OpenAI 的客户端都能直接接 Ollama:把 OPENAI_API_BASE 改成 http://localhost:11434/v1、OPENAI_API_KEY 随便填一个非空值就行。
Node.js 调用示例
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama', // 必须有值,但内容随意
});
const stream = await client.chat.completions.create({
model: 'qwen2.5-coder:7b',
messages: [{ role: 'user', content: '解释 useEffect 的依赖数组' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}
跟调 OpenAI 完全一样,只是 baseURL 换了。
四、接入 VS Code(替代 Copilot)
方案 A:Continue.dev(强烈推荐)
Continue 是一个开源的 Copilot 替代品,原生支持 Ollama。
- VS Code 装 Continue 插件;
- 打开
~/.continue/config.yaml(按 cmd+L 后点齿轮),把内容改成:
name: Local Dev Assistant
version: 1.0.0
schema: v1
models:
- name: Qwen Coder 7B (chat)
provider: ollama
model: qwen2.5-coder:7b
apiBase: http://localhost:11434
roles: [chat, edit]
- name: Qwen Coder 1.5B (autocomplete)
provider: ollama
model: qwen2.5-coder:1.5b
apiBase: http://localhost:11434
roles: [autocomplete]
- name: Nomic Embed
provider: ollama
model: nomic-embed-text
apiBase: http://localhost:11434
roles: [embed]
context:
- provider: code
- provider: docs
- provider: diff
- provider: terminal
- provider: codebase
注意我用了 两个不同体积的模型:补全用 1.5B(要快),对话/重构用 7B(要质量)。这是 Continue 的关键设计——别用同一个大模型干所有事。
补全模型也要 pull 一下:
ollama pull qwen2.5-coder:1.5b
ollama pull nomic-embed-text # 给 @codebase 用的嵌入模型
重启 VS Code,按 cmd+I 唤起编辑、cmd+L 唤起对话。
方案 B:Cursor
Cursor 设置里有个 "Override OpenAI Base URL"。但 Cursor 的本地模型支持长期不稳定,2026 初这个功能时好时坏。如果你已经付费用 Cursor,建议保留它的云端模型,本地只用 Continue 兜底。
方案 C:Zed
Zed 的 Ollama 集成最干净,配置在 settings.json:
{
"language_models": {
"ollama": {
"api_url": "http://localhost:11434",
"available_models": [
{ "name": "qwen2.5-coder:7b", "max_tokens": 32768 }
]
}
}
}
五、性能与续航实测(M2 Pro / 32 GB)
我用一个固定提示「用 React 18 + TypeScript 写一个虚拟列表组件,要求支持动态高度」分别跑五个模型,记录三个指标:
| 模型 | 首 token 延迟 | 速度 | 总 token | 风扇噪音 |
|---|---|---|---|---|
| qwen2.5-coder:1.5b | 0.3s | 122 t/s | 850 | 无 |
| qwen2.5-coder:7b | 0.6s | 51 t/s | 1240 | 轻 |
| qwen2.5-coder:14b | 1.4s | 24 t/s | 1380 | 中 |
| deepseek-coder-v2:16b | 1.5s | 30 t/s | 1520 | 中 |
| llama3.1:8b | 0.7s | 55 t/s | 1100 | 轻 |
结论:日常补全 1.5B 完胜,需要"想清楚再写"的复杂任务才换 7B 或 14B。
电池:纯本地推理 7B,1 小时大概掉 25-30% 电量。比开 4 个 Chrome tab + Slack 还便宜点。
六、踩过的坑
坑 1:模型一加载就卡死
通常是 RAM 不够。Ollama 不会 主动挑你装得下的模型,它只会努力加载然后狂用 swap。检查:
ollama ps
# NAME ID SIZE PROCESSOR UNTIL
# qwen2.5-coder:7b ... 6.0 GB 100% GPU 4 minutes from now
如果 PROCESSOR 显示 100% CPU 而不是 GPU,说明模型 spill 到 CPU 了,速度会从 50 t/s 掉到 5 t/s。换更小的模型。
坑 2:第一次问完答完,就再也不响应
这是 8 个月前我遇到过的,现在已经修了。如果还碰到,重启 ollama 服务:
brew services restart ollama
# 或 systemctl restart ollama
坑 3:Continue 的 @codebase 慢得离谱
第一次用 @codebase 时 Continue 会把整个仓库做嵌入,几千个文件可能跑 10 分钟。让它跑完,之后就快了。可以先在 .continue/config.yaml 里限制目录:
context:
- provider: codebase
params:
nFinal: 10
nRetrieve: 25
坑 4:跨主机访问 Ollama
默认只监听 localhost。如果想从公司另一台机器调用:
# macOS
launchctl setenv OLLAMA_HOST 0.0.0.0:11434
brew services restart ollama
# Linux 改 systemd unit
sudo systemctl edit ollama
# [Service]
# Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl restart ollama
::: warning 暴露到公网就是给陌生人免费送算力,一定 套一层带鉴权的反代。 :::
坑 5:并发请求会排队
Ollama 默认串行处理请求。开发助手场景下没事,但如果你拿它做 RAG 或 batch 处理,需要:
OLLAMA_NUM_PARALLEL=4 ollama serve
参数会吃成倍 RAM,按机器配置量力而行。
七、什么场景不适合用本地 Ollama
不适合:
- 长 context(>32k token)的整库分析——本地小模型质量明显不行;
- 强 reasoning(数学、复杂规划)——这是 Claude / GPT 的强项;
- 多模态(图片、PDF 视觉理解)——本地 VLM 还在追赶。
很适合:
- IDE 补全 / inline edit;
- commit message / PR 描述 / changelog 生成;
- 解释一段代码、解释报错、写 unit test 草稿;
- 跑 RAG 时的 embedding(
nomic-embed-text就足够好); - 把"敏感代码不上云"作为公司硬性要求时的合规出口。
八、我的最终配置
放出来供参考:
模型常驻:
- qwen2.5-coder:1.5b # autocomplete(始终加载)
- nomic-embed-text # codebase 嵌入
按需加载:
- qwen2.5-coder:7b # 对话和小重构
- qwen2.5-coder:14b # 复杂重构、长 prompt 任务
- deepseek-r1:14b # 需要深度思考时(推理模型,很慢但很稳)
工具:
- VS Code + Continue.dev
- 终端 alias:alias q='ollama run qwen2.5-coder:7b'
- 用 mods (charmbracelet/mods) 把 ollama 接到 shell 管道里
shell 管道的玩法值得单独提一下:
git diff main | mods -m qwen2.5-coder:7b "总结这次改动并起一个 conventional commit message"
写 commit message 我已经几个月没自己手打了。
九、下一步
如果想再省一点资源、把模型推到浏览器里跑(比如做一个完全离线的 PDF 阅读器),下一篇 transformers.js:在浏览器里跑模型 接着这个话题。
::: info 相关阅读