1. 内网工作站为什么需要离线 Deepseek:从公网依赖到本地推理的完整链路
很多做企业内网开发的朋友都遇到过同一个尴尬:手上有一台配置还行的开发机,想跑个代码补全或者文档问答,结果公司网络把 HuggingFace、Ollama 官方源、GitHub Release 全给限了,ollama pull卡在几百 KB 不动,装到一半直接超时。更麻烦的是有些项目源码本身就不能出内网,你不可能把整个 C# 工程丢给云端 API 去解析。这时候「本地部署 Deepseek + Ollama 离线推理」就成了刚需——模型文件、推理进程、调用链路全部落在本机,不依赖公网也能稳定跑。
Ollama 本质上是一个把模型权重、推理引擎(llama.cpp 系)、HTTP 服务打包在一起的运行时。你装完它,本机会多出一个127.0.0.1:11434的本地服务,任何支持 OpenAI 兼容协议的工具(Continue、Cline、OpenAI SDK)都能直接连。Deepseek 系列里适合离线跑的主要是deepseek-coder和deepseek-r1的蒸馏小参数版本,1.3b、6.7b 这种在 4G~8G 显存的工作站上能跑得动,代码补全和简单推理够用。
适合谁:一是内网开发机、涉密项目工作站,源码不能外传;二是个人笔记本想白嫖本地推理,不想每月付云端 token 费;三是网络受限环境,官方源拉不动模型。这篇我会把「离线导入模型 + Ollama 服务搭建 + TaoToken 统一 Key 通道对接」整条链路讲透,包括ollama pull加速、Modelfile 自定义、离线 tar 包导入,以及用统一 Base URL 做连通性验证的完整动作。你照着做,最后能拿到一个不联网也能稳定调用的本地 Deepseek 服务。
需要先说明一个概念:Ollama 的「离线」分两层。第一层是安装和拉模型阶段可以借助镜像加速,第二层是模型落地之后,推理过程完全不需要公网。很多人卡在第一层就放弃了,其实只要把模型文件搞到本地,后面ollama run和 API 调用都是纯本地行为。下面按「先解决拉取,再解决服务,最后解决统一调用」的顺序展开。
2. TaoToken 统一 Key 与 API 通道前置准备:让本地服务也能被标准协议调用
在正式配 Ollama 之前,先把调用侧的通道理清楚。本地 Ollama 默认暴露的是http://127.0.0.1:11434,它自带一个 OpenAI 兼容端点/v1/chat/completions。但实际用起来你会发现两个问题:一是不同工具(Continue、Cline、Codex 类客户端)填 Base URL 的格式不统一,有的要带/v1,有的不要;二是当你想把本地模型和云端模型混用、做统一路由时,每个工具都要单独配一遍 Key 和地址,维护成本高。
TaoToken 在这里的角色是「统一 Key + 统一 API 通道」。你可以把它理解成一个协议适配层:对外暴露一套标准的 OpenAI 兼容接口,对内可以指向本地 Ollama 服务,也可以指向其他模型通道。这样你的 Continue、Cline、脚本里填的 Base URL 和 Key 始终是同一套,换模型只改 Model ID,不用动配置结构。
前置准备分三步。第一步,拿到统一 Key。访问 API Keys 管理页https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite,登录后创建一个 Key,复制保存。这个 Key 后面会填到所有客户端的apiKey字段里。
第二步,确认 API 通道地址。统一 Base URL 是https://taotoken.net/api,注意这个地址不带 UTM 参数,直接作为baseURL使用。如果你用的是 OpenAI SDK,base_url填这个;如果是 Continue 这类插件,apiBase填这个。
第三步,确认 Model ID 的写法。本地 Ollama 拉下来的模型,在 TaoToken 通道里通常用ollama/前缀或者直接模型名映射。具体以你控制台里模型列表显示的 ID 为准,不要自己猜。这一步很关键,Model ID 写错会直接报model not found。
提示:统一 Key 的好处是,你本地 Ollama 服务即使换了端口、换了机器,只要 TaoToken 通道里的映射改一下,所有客户端都不用动。对于内网多台工作站共用一个出口的场景特别省事。
如果你只是想验证模型能不能通,可以直接用模型对话页https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite发一条消息,看返回是否正常。这一步能快速排除 Key 和通道本身的问题,再去折腾 Ollama 就不会混淆故障点。
对于长期做编码、跑 Agent 任务的场景,可以考虑 Coding Planhttps://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite,它更适合高频调用和长上下文任务。而接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有各客户端的完整配置示例,遇到字段对不上时优先查这里。
3. 可复制配置:Ollama 安装、离线模型导入与 Modelfile 完整片段
这一节是全文最核心的可操作部分。我按「安装 Ollama → 配置模型存储路径 → 拉取或离线导入 Deepseek → 写 Modelfile → 启动服务」的顺序给完整命令,你直接复制改路径即可。
3.1 安装 Ollama 并重定向模型目录
Windows 下安装包默认装 C 盘、模型也存 C 盘用户目录,内网工作站 C 盘通常很小,必须改。用命令行指定安装目录:
D:\下载\OllamaSetup.exe /DIR="D:\AI\Ollama"装完后设置模型存储路径,避免模型把 C 盘撑爆。系统环境变量新建:
变量名:OLLAMA_MODELS 变量值:D:\AI\Ollama_Models再设置镜像加速变量,解决ollama pull龟速:
变量名:OLLAMA_REGISTRY 变量值:https://mirrors.aliyun.com/ollama改完环境变量后,一定要完全退出右下角 Ollama 托盘程序再重启,否则变量不生效。验证是否生效:
ollama list如果模型目录为空但命令正常返回,说明服务起来了。
3.2 拉取 Deepseek 模型与离线导入
在线加速拉取(网络还能通的情况):
set OLLAMA_REGISTRY=https://mirrors.aliyun.com/ollama ollama pull deepseek-coder:1.3b完全离线环境的做法是「先在有网机器上导出,再拷贝到内网导入」。导出命令:
ollama pull deepseek-coder:1.3b ollama show deepseek-coder:1.3b --modelfile > deepseek-coder-1.3b.Modelfile然后把OLLAMA_MODELS目录下对应的模型 blob 文件夹整体拷贝到内网机器的模型目录,再用 Modelfile 重建:
ollama create deepseek-coder:1.3b -f deepseek-coder-1.3b.Modelfile3.3 自定义 Modelfile 调整推理参数
Modelfile 是 Ollama 的模型定义文件,可以覆盖系统提示词、温度、上下文长度。新建D:\AI\Modelfile.deepseek:
FROM deepseek-coder:1.3b PARAMETER temperature 0.1 PARAMETER num_ctx 8192 PARAMETER num_gpu 20 PARAMETER top_p 0.9 SYSTEM """ 你是一个内网代码助手,只基于当前项目文件回答,不编造不存在的接口。 """构建自定义模型:
ollama create deepseek-local -f D:\AI\Modelfile.deepseek3.4 客户端配置片段(Continue / Cline 通用)
Continue 的config.yaml或config.json里,对接本地 Ollama:
models: - name: DeepSeek-Coder 本地 provider: ollama apiBase: http://127.0.0.1:11434/v1 model: deepseek-coder:1.3b maxTokens: 8192 temperature: 0.1如果走 TaoToken 统一通道,把apiBase换成https://taotoken.net/api,apiKey填你的统一 Key,model填控制台里对应的 Model ID。这样本地和云端模型可以共用一套配置结构,切换只改 model 字段。
注意:
apiBase到底带不带/v1,取决于客户端实现。Continue 的 ollama provider 通常不带,OpenAI 兼容 provider 要带。填错会报 404,先确认再排查。
4. 验证请求与成功结果:curl、SDK 与客户端三层连通性检查
配置写完必须验证,否则你不知道是 Ollama 没起来、模型没加载,还是通道配错了。我按「本地直连 → 统一通道 → 客户端」三层来验,每层都有明确的成功标志。
第一层,验证 Ollama 本地服务是否存活:
curl http://127.0.0.1:11434/api/tags正常返回是一个 JSON,models数组里能看到你拉下来的deepseek-coder:1.3b。如果连接被拒绝,说明 Ollama 服务没启动,去托盘图标右键启动,或者命令行ollama serve。
第二层,验证本地推理是否正常:
curl http://127.0.0.1:11434/v1/chat/completions -H "Content-Type: application/json" -d "{\"model\":\"deepseek-coder:1.3b\",\"messages\":[{\"role\":\"user\",\"content\":\"用一句话说明什么是递归\"}]}"成功标志是返回体里有choices[0].message.content,内容是模型生成的回答。如果返回model not found,说明模型名写错或没加载;如果卡住很久,说明显存不够在跑 CPU,检查num_gpu参数。
第三层,验证 TaoToken 统一通道:
curl https://taotoken.net/api/v1/chat/completions -H "Authorization: Bearer 你的Key" -H "Content-Type: application/json" -d "{\"model\":\"你的ModelID\",\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}]}"成功返回标准 OpenAI 格式。如果报 401,是 Key 无效或没带Bearer;如果报local proxy failed,说明通道到本地服务的映射没通,检查 Ollama 是否在运行、端口是否被防火墙拦。
第四层,客户端实测。在 Continue 输入框发一句「你当前调用的是什么模型」,正常返回模型名即对接成功。再发项目解析指令,看它能不能跨文件读取。这一步能验证的不只是连通性,还有上下文长度和文件读取权限。
实测下来,最容易出问题的是第三层和第四层之间的 Model ID 映射。本地模型名是deepseek-coder:1.3b,但通道里可能映射成别的 ID,两边对不上就报错。建议先在控制台模型列表里确认 ID,再填客户端。
5. 本篇常见报错排查:401、local proxy failed、reading choices、OAuth 逐条对照
这一节把高频报错和对应解法列清楚,遇到问题直接对号入座。
401 Unauthorized:最常见。原因有三种——Key 没填、Key 填错、请求头没带Authorization: Bearer。检查客户端配置里的apiKey字段,确认没有多余空格。如果是 TaoToken 通道,去 API Keys 页确认 Key 状态是否正常。
local proxy failed / connection refused:通道到本地 Ollama 的连接失败。先确认ollama serve在跑,curl http://127.0.0.1:11434/api/tags能返回。如果本地正常但通道报这个错,说明通道配置里指向的地址不对,或者 Ollama 只监听了127.0.0.1而通道需要访问宿主机 IP。检查 Ollama 启动参数OLLAMA_HOST。
reading choices 相关报错(如 cannot read property 'choices' of undefined):返回体结构不符合预期,通常是接口返回了错误 JSON 但客户端按成功解析。先看原始返回,多半是 404 或 500。404 一般是 Base URL 多了或少了/v1;500 多半是模型加载失败,看 Ollama 日志。
OAuth / 登录相关报错:Continue 首次打开会提示登录云端,选择「仅本地使用」或跳过。如果误点了登录又失败,去设置里清掉账号状态,重新选本地模式。Cline 类插件同理,不要走云端授权。
模型加载超时 / 显存溢出:报out of memory或长时间无响应。降低num_gpu层数,或换更小参数模型。4G 显存跑 1.3b 比较稳,6.7b 要 8G 以上。用ollama ps看当前加载状态。
ollama pull 卡住不动:镜像变量没生效。确认OLLAMA_REGISTRY是系统变量不是用户变量,且重启了托盘程序。临时方案是在同一个 CMD 窗口先set再pull。
Modelfile 构建报错:FROM指向的模型不存在,或PARAMETER拼写错误。先ollama list确认基础模型在,再逐行检查 Modelfile 语法,SYSTEM块的三引号要成对。
提示:排查顺序永远是「本地服务 → 模型加载 → 通道映射 → 客户端配置」,从下往上查,不要一上来就改客户端。
6. 语义一致 CTA:把本地 Deepseek 接进你的日常编码流
本地服务跑通之后,真正的价值在于把它接进日常工具链。我的做法是:内网工作站上用 Ollama 跑deepseek-coder:1.3b做代码补全和单文件问答,涉及跨项目、长上下文的复杂任务,通过 TaoToken 统一通道切到更强的模型。两套配置共用同一个 Base URL 结构,切换只改 Model ID,不用重配客户端。
如果你还在选长期方案,编码和 Agent 场景可以看 Coding Planhttps://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite;接入细节和字段说明查文档https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite;Key 管理在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite;想先试模型效果直接去对话页https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。官网入口https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
最后给一个实用技巧:把ollama stop和ollama rm写成一个清理脚本,下班前一键释放显存和硬盘。内网机器资源紧张时,这个习惯能省不少事。模型文件全部落在OLLAMA_MODELS指定的目录,不想用了直接删文件夹,不留系统残留。