1. 为什么本地跑 deepseek-r1 还需要一层“接入层”很多人第一次在终端里跑通ollama run deepseek-r1:7b之后会陷入一种微妙的失落模型确实在回答但只能对着黑底白字的命令行敲字历史对话翻不回去代码片段复制出来还带着一堆换行。更关键的是它和你的 Vscode 是割裂的——你在编辑器里写代码想让它帮忙看一段逻辑只能切窗口、复制、粘贴、再复制回来。这个链路一旦超过三次人就不想用了。所以“本地部署 deepseek-r1”这件事真正的分水岭不在模型能不能跑起来而在于它能不能变成你日常工作流里顺手的一环。我自己的判断标准很简单如果调用它需要我离开当前编辑器超过 5 秒那它就不算落地。这篇要做的就是把三个东西串成一条线Ollama 负责把 deepseek-r1 拉起来并提供标准推理端点web-ui 负责给你一个能管理对话历史的网页界面Vscode 插件负责把同一个推理端点接进代码编辑器。三者共用同一个http://localhost:11434端点模型只加载一份显存不重复占用。适合谁看手上有 16G 内存以上、有一块 8G 显存左右显卡的个人开发者已经装过 Ollama 但只会在终端里用的人想给团队内部做一个不联网的代码助手原型的人。如果你还没装 Ollama下面第二节会从零给命令。先明确一个概念避免后面混淆。Ollama 本身是一个模型运行时它启动后会在本地监听一个 HTTP 服务默认端口 11434。这个服务提供两类接口一类是 Ollama 自己的/api/chat、/api/generate另一类是兼容 OpenAI 格式的/v1/chat/completions。web-ui 和 Vscode 插件本质上都是这个端点的客户端。理解这一点后面所有配置就都是在填“Base URL 模型名”这两个字段。我试过把 web-ui 和编辑器插件分别指向不同的模型实例结果 8G 显存直接爆掉两个进程互相抢显存最后都卡死。所以本文的核心原则是一个 Ollama 服务多个客户端共用。2. 用 Ollama 拉起 deepseek-r1 并确认推理端点可用这一节的目标是让你得到一个稳定运行的本地推理服务并且能用 curl 验证它真的在流式输出。如果你已经跑通了可以快速扫一眼启动参数部分重点看OLLAMA_HOST和OLLAMA_KEEP_ALIVE这两个环境变量它们决定了后面 web-ui 和 Vscode 能不能连上。2.1 安装与拉取模型Windows 和 macOS 直接去 Ollama 官网下载安装包Linux 用一行脚本curl -fsSL https://ollama.com/install.sh | sh安装完成后验证版本ollama --version拉取 deepseek-r1。这里要按显存选型号别盲目上 14b模型型号参数量量化后体积建议显存适用场景deepseek-r1:1.5b1.5B约 1.1GB2GB轻量补全、低配笔记本deepseek-r1:7b7B约 4.7GB6GB日常代码问答推荐起点deepseek-r1:8b8B约 5.2GB7GB比 7b 略强显存够就选deepseek-r1:14b14B约 9GB12GB复杂推理8G 卡会溢出到内存8G 显存的卡我建议从deepseek-r1:7b或8b起步。14b 在 8G 卡上会部分卸载到 CPUtoken 速度会掉到个位数体验很差。ollama pull deepseek-r1:7b拉取完成后确认模型在列表里ollama list2.2 带参数启动服务默认ollama serve只监听127.0.0.1:11434。如果你后面要用 Docker 跑 web-ui容器内的localhost指向的是容器自己连不到宿主机所以要么用host.docker.internal要么让 Ollama 监听0.0.0.0。我选择后者配置更省心。Linux/macOS 下用环境变量启动export OLLAMA_HOST0.0.0.0:11434 export OLLAMA_KEEP_ALIVE24h export OLLAMA_NUM_PARALLEL2 ollama serveWindows PowerShell$env:OLLAMA_HOST0.0.0.0:11434 $env:OLLAMA_KEEP_ALIVE24h $env:OLLAMA_NUM_PARALLEL2 ollama serve三个参数的作用OLLAMA_HOST让服务对外可访问Docker 和局域网设备都能连OLLAMA_KEEP_ALIVE24h让模型在最后一次请求后 24 小时内常驻显存避免每次提问都重新加载冷启动那十几秒真的很劝退OLLAMA_NUM_PARALLEL2允许两个并发请求web-ui 和编辑器同时用不会互相阻塞。注意OLLAMA_HOST设为0.0.0.0后同局域网的其他机器也能访问你的模型。如果只在个人电脑上用可以改回127.0.0.1然后 Docker 那边用host.docker.internal连接。2.3 用 curl 验证流式输出服务起来后先别急着装 web-ui用 curl 确认端点正常。这一步能帮你排除掉后面 80% 的“连不上”问题。curl http://localhost:11434/api/chat -d { model: deepseek-r1:7b, messages: [ {role: user, content: 用一句话解释什么是递归} ], stream: true }如果返回的是一行行 JSON每行带一个message.content字段说明流式输出正常。你会看到类似这样的分块{model:deepseek-r1:7b,message:{role:assistant,content:递归},done:false} {model:deepseek-r1:7b,message:{role:assistant,content:就是},done:false} {model:deepseek-r1:7b,message:{role:assistant,content:函数},done:false}再验证一下 OpenAI 兼容接口因为 Vscode 的 Continue 和 Cline 默认走这个格式curl http://localhost:11434/v1/chat/completions -d { model: deepseek-r1:7b, messages: [{role: user, content: hello}], stream: false }两个接口都通说明 Ollama 这一层已经稳了。接下来所有客户端都只需要填http://localhost:11434和deepseek-r1:7b。3. 搭建 web-ui 对话界面并配置环境变量web-ui 我选 Open WebUI原因是它对 Ollama 的原生支持最好装完基本不用改配置就能识别本地模型而且对话历史、多会话管理、Markdown 渲染都齐全。这一节给出 Docker 启动命令和关键环境变量重点解决“容器连不上宿主机 Ollama”这个高频坑。3.1 Docker 启动命令先确认 Docker 已安装并运行docker --version docker ps然后拉取并启动 Open WebUIdocker run -d -p 3000:8080 \ --add-hosthost.docker.internal:host-gateway \ -e OLLAMA_BASE_URLhttp://host.docker.internal:11434 \ -e WEBUI_AUTHtrue \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main逐项说明-p 3000:8080把容器内 8080 映射到宿主机 3000浏览器访问http://localhost:3000--add-hosthost.docker.internal:host-gateway让容器内能用host.docker.internal解析到宿主机这是 Linux 上必须加的Windows/macOS 的 Docker Desktop 自带OLLAMA_BASE_URL指向宿主机的 Ollama 服务WEBUI_AUTHtrue开启登录本地单人用也可以设false免登录-v open-webui:/app/backend/data把对话数据持久化到命名卷容器重建不丢历史。如果你在第二节把OLLAMA_HOST设成了0.0.0.0也可以直接用宿主机 IP-e OLLAMA_BASE_URLhttp://192.168.1.100:11434把 IP 换成你机器的实际地址。两种方式都行host.docker.internal更通用。3.2 环境变量配置文件如果你不想每次都用一长串docker run可以写一个docker-compose.yml把配置固化下来。这也是我推荐的方式改参数不用重敲命令version: 3.8 services: open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui ports: - 3000:8080 extra_hosts: - host.docker.internal:host-gateway environment: - OLLAMA_BASE_URLhttp://host.docker.internal:11434 - WEBUI_AUTHtrue - WEBUI_NAMELocal DeepSeek - DEFAULT_MODELSdeepseek-r1:7b volumes: - open-webui:/app/backend/data restart: always volumes: open-webui:DEFAULT_MODELS让新会话默认选中 deepseek-r1:7b省得每次手动切。WEBUI_NAME只是改页面标题无所谓。启动docker compose up -d查看日志确认没有报错docker logs -f open-webui看到Uvicorn running on http://0.0.0.0:8080就说明起来了。3.3 首次登录与模型选择浏览器打开http://localhost:3000第一次会让你注册一个管理员账号这个账号只存在本地数据库里随便填。登录后进入设置确认模型列表里出现了deepseek-r1:7b。如果没有去设置 - 连接里检查 Ollama 地址是否填对点一下刷新按钮。选中模型后发一条消息测试。正常的话你会看到文字逐字出现这就是流式输出在工作。如果转圈很久才一次性出结果说明流式没生效回去检查OLLAMA_BASE_URL是否指向了正确的端点。提示Open WebUI 的对话历史存在open-webui这个 Docker 卷里。想备份就docker run --rm -v open-webui:/data -v $(pwd):/backup alpine tar czf /backup/webui-backup.tar.gz -C /data .恢复同理。到这里网页对话界面就通了。同一个 Ollama 服务现在同时服务浏览器和终端显存里只有一份模型。4. 把 Vscode 接到同一推理端点做代码补全这一节是整篇的重点。web-ui 解决的是“聊天”编辑器插件解决的是“在写代码的地方直接问”。两者连的是同一个http://localhost:11434所以不需要额外加载模型。我给出 Continue 和 Cline 两套配置你可以都装按场景切换。4.1 Continue 配置 config.json在 Vscode 扩展市场搜 Continue 安装。装完后左侧会出现 Continue 图标点开再点设置齿轮选择打开config.json。这个文件的位置在~/.continue/config.jsonWindows 是C:\Users\你的用户名\.continue\config.json。把 models 数组改成下面这样{ models: [ { title: deepseek-r1:7b, provider: ollama, model: deepseek-r1:7b, apiBase: http://localhost:11434, systemMessage: You are an expert software developer. Answer in Chinese, be concise and give runnable code. }, { title: deepseek-r1:8b, provider: ollama, model: deepseek-r1:8b, apiBase: http://localhost:11434, systemMessage: You are an expert software developer. Answer in Chinese, be concise and give runnable code. } ], tabAutocompleteModel: { title: deepseek-r1:1.5b, provider: ollama, model: deepseek-r1:1.5b, apiBase: http://localhost:11434 } }三个字段必须对齐provider填ollamamodel填ollama list里显示的完整名字apiBase填 Ollama 地址。名字写错一个字符就会报model not found。tabAutocompleteModel是行内补全用的模型建议单独用 1.5b因为补全触发频繁7b 会拖慢输入。1.5b 虽然能力弱但补全这种短任务够用。保存后回到 Continue 面板模型下拉框里应该能看到两个选项。选中deepseek-r1:7b在编辑器里选中一段代码按CtrlL把选中内容发到对话框问它“这段代码有什么问题”。如果它能基于你选中的代码回答说明编辑器接入成功。4.2 Cline 配置与三件套Cline 是另一个 Vscode 插件特点是能自主读写文件、执行命令适合让它帮你改多个文件。安装后在设置里选 API Provider 为Ollama然后填三件套配置项填写值Base URLhttp://localhost:11434API Key随便填如ollama本地不校验Model IDdeepseek-r1:7bCline 走的是 OpenAI 兼容接口所以 Base URL 后面不用加/v1插件会自己拼。如果它报 404试着改成http://localhost:11434/v1不同版本行为略有差异。填完点保存在对话框里输入“用中文回答写一个 Python 函数计算斐波那契数列”。如果它开始输出并给出代码块说明通了。Cline 的自主模式会请求文件写入权限第一次用会弹确认框本地自己用可以允许。4.3 验证流式输出与代码补全两个插件都配好后做三个验证第一流式输出。在 Continue 里问一个需要长回答的问题观察文字是否逐字出现。如果卡住几秒后整段蹦出来说明流式被缓冲了检查 Ollama 是否用了stream: true以及插件版本是否过旧。第二代码补全。在.py文件里输入def quick_sort(arr):然后换行等一两秒看是否出现灰色补全建议。没有的话检查tabAutocompleteModel是否配了 1.5b 模型以及该模型是否已ollama pull。第三上下文引用。在 Continue 里用引用一个文件问它这个文件的作用。能正确回答说明文件索引正常。三个都通过你的本地代码编辑器就算接上了 deepseek-r1。整个过程模型只加载了一份web-ui 和 Vscode 共享同一个推理端点。5. 常见报错排查401、local proxy failed 与 reading choices这一节按真实报错来。下面这些是我和身边人踩过的按出现频率排序。报错一401 UnauthorizedContinue 或 Cline 报 401通常不是 Ollama 的问题而是插件把请求发到了需要鉴权的云端。检查apiBase或 Base URL 是否被自动填成了https://api.openai.com。本地 Ollama 不校验 Key但插件如果 provider 选错会带上错误的鉴权头。解决确认 provider 是ollamaBase URL 是http://localhost:11434API Key 留空或填任意字符串。报错二local proxy failed或connect ECONNREFUSED 127.0.0.1:11434这个报错说明客户端连不上 Ollama。三种可能Ollama 没启动端口不是 11434或者 Docker 容器里的localhost指向了自己。排查顺序先在宿主机curl http://localhost:11434/api/tags能返回模型列表说明服务正常如果 web-ui 在 Docker 里报这个错把OLLAMA_BASE_URL改成http://host.docker.internal:11434如果 Vscode 插件报这个错确认apiBase没写成0.0.0.0客户端要用localhost或127.0.0.1。报错三Error reading choices或choices field missing这个报错一般出现在 Cline 这类走 OpenAI 格式的插件上。原因是 Ollama 的/v1/chat/completions返回结构和插件预期不完全一致或者模型名写错导致返回了错误对象。先确认ollama list里的名字和插件里填的 Model ID 完全一致包括冒号和后面的 tag。如果名字对试着把 Base URL 从http://localhost:11434改成http://localhost:11434/v1或者反过来。不同插件版本对路径拼接处理不同。报错四model requires more system memory这是显存/内存不足。8G 卡跑 14b 会触发。解决换 7b 或 8b或者设置OLLAMA_NUM_GPU限制卸载层数。也可以关掉 web-ui 和编辑器插件中的一个减少并发。报错五OAuth 或登录循环Open WebUI 如果开了WEBUI_AUTHtrue但数据库卷权限有问题会出现登录后跳回登录页。检查docker logs open-webui有没有数据库写入错误。解决删掉容器和卷重建docker rm -f open-webui docker volume rm open-webui然后重新docker compose up -d。数据会丢但首次搭建阶段无所谓。报错六流式输出变成一次性返回检查 Ollama 版本老版本对/v1/chat/completions的流式支持不完整。升级到最新版curl -fsSL https://ollama.com/install.sh | sh。另外确认插件里没有开启“等待完整响应”之类的选项。排查通用思路先在终端用 curl 确认 Ollama 端点本身正常再确认客户端填的地址和模型名最后看插件日志。90% 的问题出在地址和模型名这两个字段上。6. 把本地推理端点固定下来后续按需扩展走到这里你手上应该有三个能用的入口终端 curl、浏览器 web-ui、Vscode 里的 Continue 和 Cline。它们背后是同一个 Ollama 服务、同一份 deepseek-r1 权重。这个结构的好处是扩展成本低——以后想加一个新客户端只要它能填 Base URL 和模型名就能直接接进来不用重新部署模型。如果你后面想让这套东西更稳定有两个方向可以继续。一是把 Ollama 做成系统服务开机自启省得每次手动ollama serve。Linux 用 systemdWindows 用任务计划程序macOS 用 launchd。二是如果你需要在多台机器之间共享这个推理端点或者想用更大的模型但本地显卡扛不住可以考虑把请求转发到统一的 API 网关。我目前个人项目里用的是 TaoToken 的接入方式它的 API 地址是https://taotoken.net/api兼容 OpenAI 格式把 Continue 的apiBase从本地地址换成它、再填上对应的 Key 和模型 ID 就能切换本地和远端两套配置可以并存按场景选。具体操作上如果你要试远端接入去控制台建一个 Key然后在 Continue 的config.json里加一个 provider 为openai的模型条目apiBase填https://taotoken.net/apiapiKey填你建的 Keymodel填平台上对应的模型 ID。这样本地 deepseek-r1 和远端模型就在同一个下拉框里写代码时按需切换。模型对话入口在https://taotoken.net/models接入文档在https://taotoken.net/docAPI Key 管理在https://taotoken.net/api-keys。如果你主要做长期编码和 Agent 任务可以看下 Coding Planhttps://taotoken.net/coding-plan。回到本地这套。最后给你一个实用技巧把 Ollama 的OLLAMA_KEEP_ALIVE设长一点比如24h然后每天第一次用之前先发一条短消息“hi”把模型预热到显存后面所有请求都是秒回。这个习惯能省掉大量等待时间。另外web-ui 里的对话历史定期导出别只依赖 Docker 卷卷删了就没了。整套链路的核心就一句话Ollama 提供端点其他都是客户端。把端点地址和模型名这两个字段填对剩下的就是顺手用起来。