Ollama 本地起一个开发助手

0 阅读7分钟

Ollama 本地起一个开发助手

本文是一篇 完全实践向 的指南,每条命令都在 M2 Pro / 32 GB 的 MacBook 上实测过。Linux 用户也基本一样,差别会单独标注。

image.png 把 LLM 跑在本地,对前端开发者有三个独立价值:

  1. 隐私:公司内部代码、半成品方案不外传。
  2. 省钱:日常 IDE 补全、commit message 这种 99% 不需要顶级模型的活儿,本地跑零成本。
  3. 离线:飞机上、咖啡馆、ICP 备案出问题的那一周,依然能写代码。

下面这套配置我用了大概八个月,结论:M 系列芯片 + Qwen2.5-Coder 7B + Continue.dev,可以替代 80% 的 Copilot 日常使用场景。

::: tip 本文路线

  1. 装 Ollama 并拉一个模型
  2. 命令行先把它用起来
  3. 用 OpenAI 兼容 API 接入任何工具
  4. 在 VS Code / Cursor 里替代 Copilot
  5. 性能、显存、模型选择的实测对比
  6. 我踩过的 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.5b1.0 GB~2 GB120 t/s极速补全
qwen2.5-coder:7b4.7 GB~6 GB50 t/s日常开发助手
qwen2.5-coder:14b9 GB~11 GB25 t/s复杂重构
qwen2.5-coder:32b20 GB~24 GB12 t/s接近 Claude 3.5 Sonnet
deepseek-coder-v2:16b9 GB~11 GB30 t/s推理类任务好
llama3.1:8b4.7 GB~6 GB55 t/s非编码对话
nomic-embed-text274 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/v1OPENAI_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。

  1. VS Code 装 Continue 插件;
  2. 打开 ~/.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.5b0.3s122 t/s850
qwen2.5-coder:7b0.6s51 t/s1240
qwen2.5-coder:14b1.4s24 t/s1380
deepseek-coder-v2:16b1.5s30 t/s1520
llama3.1:8b0.7s55 t/s1100

结论:日常补全 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
  - 终端 aliasalias 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 相关阅读