1. 单机跑 DeepSeek Coder 33B 到底解决什么问题
如果你手头有一台显存 24GB 左右的机器,又不想把公司代码片段发到外部服务,那本地跑一个能补全、能对话的代码模型就是刚需。DeepSeek Coder 33B 在代码补全和指令跟随上的表现,对日常写 Python、Go、前端都够用,量化到 q4_0 之后显存占用大概 19~20GB,24GB 卡刚好能塞下。这篇就围绕「Ollama 拉起 DeepSeek Coder 33B + VS Code 自动补全 + Gradio 本机 Web Chat」这条链路,把每一步命令、配置、验证方式都写清楚,你照着敲就能复现。
先说清楚这套方案适合谁:一是手里有单张 24GB 显卡(3090/4090/A5000 之类)或 128GB 内存想纯 CPU 慢跑的开发者;二是希望补全和对话都在本机回环地址完成、不依赖外部网络的人;三是想拿 Continue 插件把「补全规范」固化下来的团队。整条链路只有三个进程:Ollama 提供 11434 的推理 API,VS Code 里的 Continue 通过这个 API 做补全和 Chat,Gradio 起一个 3000 端口的网页聊天。三者互不干扰,任何一个挂了都不影响另外两个。
时间上按 5 分钟切:0:00–1:30 装 Ollama 并拉模型,1:30–3:00 配 Continue,3:00–5:00 起 Gradio。实际拉 33B 模型受网速影响可能更久,但配置动作本身很快。下面按这个节奏展开,每一步都给可复制的内容。
需要提前说明的是,Ollama 的 11434 是 API 地址,不是聊天网页,浏览器直接打开只会看到一句提示,这是正常的,别以为装坏了。真正的网页聊天是你自己用 Gradio 起的 3000 端口。这个区分后面排障会反复用到。
2. Ollama 拉取 DeepSeek Coder 33B 与显存验证
2.1 安装 Ollama 并确认版本
到 Ollama 官网下载对应系统的安装包,Windows 直接双击安装,装完打开 PowerShell 敲:
ollama version正常会输出类似ollama version is 0.15.2的版本号。版本号能打出来,说明服务已经注册成后台进程,11434 端口默认就监听了。如果提示找不到命令,重开一个终端让 PATH 生效。
2.2 拉取量化模型
33B 全精度对单卡不现实,用 q4_0 量化版:
ollama pull deepseek-coder:33b-instruct-q4_0拉完确认列表:
ollama list你会看到模型名、大小、修改时间三列。q4_0 的 33B 大概 18~19GB 磁盘占用。如果拉取中断,重新执行同一条 pull 命令会断点续传,不用删了重来。
2.3 验证模型能加载、显存占用正常
最直接的验证是在 Ollama 客户端界面里选这个模型发一句话,比如「写一个 Python 快排」,有回复就说明加载成功。同时打开任务管理器看 GPU 显存,24GB 卡上这个模型加载后大约占 19.8GB,属于正常水位。如果显存直接爆掉或者模型加载失败,多半是量化版本选错或驱动太旧。
也可以用命令行验证 API 是否活着:
curl http://127.0.0.1:11434/api/tags返回一段 JSON,里面列出你本地所有模型,就说明推理服务正常。这一步很关键,因为后面 Continue 和 Gradio 都是打这个接口,这里不通后面全白搭。
2.4 关于模型选择的取舍
33B 在 24GB 显存上是临界状态,补全和长对话同时高频跑会明显变慢。一个实用做法是拆分职责:Chat 和 Edit 用 33B 保证质量,Autocomplete 换更轻的模型,比如qwen2.5:14b,补全对延迟敏感,轻模型响应快很多。你可以两个都 pull 下来,在 Continue 里分别指定。
ollama pull qwen2.5:14b这样一套组合下来,补全几乎无感,对话质量也不掉。显存方面,两个模型不会同时常驻,Ollama 会按需加载和卸载,实际峰值还是单个大模型的水位。
3. VS Code Continue 配置自动补全与 Chat
3.1 安装 Continue 插件
在 VS Code 扩展市场搜 Continue 安装。装完左侧会出现 Continue 面板。它读取的配置文件是config.yaml,路径在用户目录下的.continue文件夹里,Windows 一般是C:\Users\你的用户名\.continue\config.yaml。直接编辑这个文件,把下面内容覆盖粘贴进去:
name: Local Config version: 1.0.0 schema: v1 models: - name: DeepSeek Coder 33B provider: ollama model: deepseek-coder:33b-instruct-q4_0 apiBase: http://127.0.0.1:11434 roles: - chat - edit - apply - name: Qwen2.5 14B Autocomplete provider: ollama model: qwen2.5:14b apiBase: http://127.0.0.1:11434 roles: - autocomplete - name: Autodetect provider: ollama model: AUTODETECT roles: - summarize - embed - rerank这里三件套要写全:Base URL 是http://127.0.0.1:11434,Key 对本地 Ollama 不需要(留空即可),Model ID 就是deepseek-coder:33b-instruct-q4_0和qwen2.5:14b。roles 决定这个模型在哪些场景被调用,autocomplete 单独给小模型,chat/edit/apply 给 33B。
3.2 用 rules 固化补全规范
Continue 支持在配置里写 rules,影响 Chat、Edit、Autocomplete 的行为风格。比如你希望补全永远不加多余注释、遵循项目缩进,可以加一段:
rules: - "补全代码时不要添加解释性注释,除非用户明确要求" - "遵循当前文件的缩进风格,Python 用 4 空格" - "生成函数时补全类型标注"rules 是纯文本指令,会拼进每次请求的上下文。写得太长会挤占 token,建议控制在几条核心约束内。改完保存,Continue 面板会自动重载配置。
3.3 在面板里分别选择模型
打开 Continue 面板,Chat、Autocomplete、Edit 三个位置分别下拉选择。Chat 选 DeepSeek Coder 33B,Autocomplete 选 Qwen2.5 14B,Edit 选 33B。选完在编辑器里敲代码,比如输入def fib(,停一下看是否弹出灰色补全建议,按 Tab 接受。如果没反应,检查 Autocomplete 模型是否选中、Ollama 是否在跑。
Chat 侧边栏直接提问,比如「解释这段代码的边界条件」,能流式返回就说明 33B 通过 Continue 调通了。Edit 模式选中一段代码让它改写,验证 apply 角色是否生效。
4. Gradio 本机 Web Chat 启动与请求验证
4.1 编写 main.py
新建项目目录,比如C:\Users\admin\Desktop\webchat\local-webui,在里面建main.py:
import requests import gradio as gr OLLAMA_URL = "http://127.0.0.1:11434/api/generate" MODEL = "deepseek-coder:33b-instruct-q4_0" def chat(prompt: str) -> str: prompt = (prompt or "").strip() if not prompt: return "请输入内容。" r = requests.post( OLLAMA_URL, json={ "model": MODEL, "prompt": prompt, "stream": False, }, timeout=600, ) r.raise_for_status() data = r.json() return data.get("response", "") with gr.Blocks(title="Local LLM Web Chat (Ollama)") as demo: gr.Markdown("# 本地大模型 Web Chat(Ollama)") gr.Markdown(f"- Model: `{MODEL}`\n- API: `{OLLAMA_URL}`") inp = gr.Textbox(label="输入", lines=6, placeholder="输入问题,例如:写一个 Python 斐波那契函数并解释边界条件") out = gr.Textbox(label="输出", lines=16) btn = gr.Button("发送") btn.click(chat, inputs=inp, outputs=out) demo.launch(server_name="127.0.0.1", server_port=3000)这里打的是/api/generate,非流式,timeout 给到 600 秒,因为 33B 首次加载加推理可能比较慢。
4.2 建虚拟环境并装依赖
进入项目目录:
cd C:\Users\admin\Desktop\webchat\local-webui python -m venv .venv推荐不激活 venv,直接用绝对路径调 python,避开 PowerShell 执行策略的坑:
.\.venv\Scripts\python.exe -m pip install --upgrade pip .\.venv\Scripts\python.exe -m pip install gradio requests .\.venv\Scripts\python.exe .\main.py终端出现Running on local URL: http://127.0.0.1:3000就说明起来了。浏览器打开这个地址,输入问题点发送,能返回内容就验证通过。
4.3 验证请求链路
想确认 Gradio 确实打到了 Ollama,可以在发送时看终端有没有报错,或者单独用 curl 测 generate 接口:
curl http://127.0.0.1:11434/api/generate -d "{\"model\":\"deepseek-coder:33b-instruct-q4_0\",\"prompt\":\"hi\",\"stream\":false}"返回 JSON 里有response字段就说明推理链路通。Gradio 只是把这层包了个网页壳,底层是同一个接口。
5. 常见报错排查:401、local proxy failed、reading choices
5.1 401 与鉴权类报错
本地 Ollama 默认不校验 Key,如果你在 Continue 里看到 401,多半是配置里误填了 apiKey 或者 provider 写成了需要鉴权的云端。检查 config.yaml,provider 必须是ollama,apiBase 指向http://127.0.0.1:11434,不要带多余路径。如果之前配过云端模型残留了 Key,删掉即可。
5.2 local proxy failed
Continue 报local proxy failed通常是它连不上 11434。先在 PowerShell 里curl http://127.0.0.1:11434/api/tags确认服务活着。如果 curl 通但 Continue 不通,检查是否有安全软件拦截了 VS Code 的回环访问,放行即可。另外确认 apiBase 写的是127.0.0.1而不是localhost,某些环境下 localhost 解析会绕路。
5.3 reading choices 报错
这个报错一般出现在把 Ollama 当 OpenAI 兼容接口用时,响应结构对不上。Continue 的 ollama provider 会自己处理格式,如果你手动把 provider 改成 openai 再指向 11434,就可能出现解析choices失败。改回provider: ollama即可。Gradio 侧如果自己拼 OpenAI 格式请求,也会遇到同样问题,直接用/api/generate最省事。
5.4 端口占用与 3000 打不开
Gradio 起不来先看终端有没有报端口占用。把server_port=3000改成 3001 再试。如果终端显示已启动但浏览器打不开,检查是不是被安全软件拦了回环端口,或者地址写成了外网 IP。必须是127.0.0.1:3000。
5.5 模型慢或卡顿
33B 在 24GB 显存上是临界,长上下文加并发会明显变慢。优化顺序:先缩短输入,长代码分段喂;再避免自动补全和大段对话同时高频触发;最后把 Autocomplete 换成 qwen2.5:14b 这类轻模型。如果还是慢,考虑把 Chat 也降到 14B,质量换速度。
5.6 PowerShell 执行策略导致 venv 激活失败
报错类似「无法加载 Activate.ps1,因为在此系统上禁止运行脚本」。三个方案任选:仅当前用户放开Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned;仅当前窗口放开Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass;或者干脆不激活,直接用.\.venv\Scripts\python.exe调,最稳。
6. 把本地推理接到更顺手的调用入口
上面这套跑通之后,你手里其实有了一个标准的 OpenAI 兼容之外的本地推理端点。日常如果只是本机用,Ollama 的 11434 就够了。但如果团队里有人想复用同一套模型能力、又不想每人本地拉一遍 33B,可以考虑把请求统一走一个兼容层,把 Base URL、Key、Model ID 三件套固定下来,客户端只改这三项就能切换。
具体做法是:Base URL 填https://taotoken.net/api,Key 在控制台生成,Model ID 按你实际要调的模型名填。这样 VS Code 插件、脚本、Gradio 都能用同一套配置,不用每个工具单独适配。生成 Key 的入口在 API Keys,接入细节看 接入文档。想先验证模型返回是否正常,可以直接在 模型对话 里发一句话试。如果是长期做编码和 Agent 任务,Coding Plan 更适合按量跑。
回到本地这条链路,最后再确认一遍三个进程的状态:Ollama 在 11434 提供推理,Continue 通过 config.yaml 里的 Base URL、Model ID 和 roles 做补全与对话,Gradio 在 3000 起网页聊天。三者都指向同一个本地端点,任何一个出问题都能单独排查,不会互相拖累。把 config.yaml 和 main.py 存好,下次换机器直接复制这两个文件加一条 pull 命令就能重建整套环境。