资讯动态

DeepSeek离线部署全攻略:从Ollama到RAG构建内网AI知识库

发布时间:2026/10/20 12:40:07 来源:尧图企业网站定制
简介面向内网环境的DeepSeek离线部署实战指南专为政企单位IT运维人员及技术爱好者编写解决无互联网条件下引入大模型、构建RAG知识库的难题兼顾国产化适配与安全加固需求。资源为单个PDF文档体积5.28MB便于内部网络分发查阅。内容系统覆盖离线资源准备模型、Ollama安装包、客户端及可选RAG依赖的获取与导入方式、Windows/Linux/macOS多平台部署步骤、两种RAG数据投喂方案其中Cherry Studio方式尤其适合新手以及Ollama API、Lobe Chat和宝塔面板的访问控制与权限管理实践。针对内网常见痛点还补充了文件完整性校验、大文件分割合并、国产操作系统与CPU架构兼容性等细节可帮助读者规避部署中的典型坑点。目前已有1372人学习/浏览无论作为教学手册还是运维排错参考都具备较强的实用价值。1. DeepSeek 离线部署内网 AI 知识库的水远比想象深我第一次在内网部署 DeepSeek 时以为 U 盘一插、安装包双击就能跑结果模型文件几百个 G光导入就折腾了一下午。真正想搭一个可用的内网 AI 知识库核心是离线资源这条链路GGUF 文件怎么导入 Ollama、OLLAMA_HOST 怎么暴露给内网机器、RAG 数据怎么喂、API 怎么防未授权访问。这套环境在政企内网出镜率极高可网上的教程大多默认你有外网权限pip install、git clone 一条龙内网用户根本走不通。这篇按“装什么、怎么装、坏了怎么救”的顺序写覆盖 Windows Server、Linux含国产系统和 macOS适合正在做内网 AI 知识库落地的运维人员。照着一路走完你得到的不是一个能聊天的模型而是一套可用的内网知识库。2. 离线资源准备模型包、Ollama 与客户端的选择2.1 模型离线包GGUF 格式、SHA256 校验与内网导入离线部署的第一步是拿到模型文件。DeepSeek 这类模型在推理框架里最常用的格式是 GGUF由 llama.cpp 项目定义Ollama 可以直接读取。不要去找 .bin 或 .safetensors 的原始权重那个格式 Ollama 玩不转还得自己转纯属给自己加戏。下载 GGUF 文件时优先看官方发布的版本再根据硬件条件选量化档位。同一个模型会有 q4_k_m、q5_k_m、q8_0 等不同量化精度q4 体积最小、精度损失可接受q8 体积最大、效果更接近原版。我的经验是7b/8b 参数级别选 q4_k_m内网办公机器普遍带得动32b 以上选 q5 或 q8 就得先算清楚内存模型文件加 KV Cache内存建议不小于模型文件大小的 1.5 到 2 倍。选模型时按这个对照表先圈定范围再决定下载哪一档参数规模建议量化内存参考适用场景7b / 8bq4_k_m8GB 起步办公 PC、低配服务器14bq5_k_m16GB 起步小型团队共用32bq5_k_m / q8_032GB 起步知识库质量要求较高70bq4_k_m64GB 以上多并发、长文档场景文件到手之后第一件事不是导入是校验。模型文件在下载、拷贝、传输过程中损坏的情况我见过太多次GGUF 文件损坏后 Ollama 不一定报“文件损坏”它可能直接加载失败日志里只有一句 failed to load model非常难查。# Linux / macOS 校验模型文件 sha256sum deepseek-r1-7b-q4_k_m.gguf# Windows PowerShell 校验 Get-FileHash .\deepseek-r1-7b-q4_k_m.gguf -Algorithm SHA256计算出来的哈希值要和下载页面给出的官方哈希比对一致才说明文件完整。这一步虽然是玄学重灾区但一旦跳过后面导入失败、推理崩溃会花掉你成倍的时间去排查。校验通过后就是物理搬运U 盘、移动硬盘、内网共享文件夹都可以如果模型文件大到几百 G内网文件共享是比 U 盘靠谱得多的方式。更极端的场景可以用安全网闸做数据交换不过大多数内网项目没这个条件我一般直接用共享文件夹加 sha256sum 双重保险。文件超过单盘容量时Linux 用 split 分割、cat 合并Windows 用 7-Zip 做分卷压缩分卷合并后要重新校验一次哈希。2.2 Ollama 与客户端离线包跨平台安装与镜像搬运Ollama 本身是个轻量级程序离线准备相对简单。Windows 直接在外网机器下载安装包拷进内网Linux 更常见的做法是在有网的机器上执行官方安装脚本装好后从 /usr/bin 或 /usr/local/bin 把 ollama 二进制文件拷走这个二进制是自包含的不需要额外带依赖库。macOS 同样是拿安装脚本产物或 Homebrew 缓存里的包拷到内网后装在同一路径即可。客户端的离线准备要看选哪种连接方式。内网部署 DeepSeek 最常见的两条客户端路线Cherry Studio 这类桌面客户端直接从官网下安装包不需要容器Lobe Chat 这类 Web 界面走 Docker 部署因为支持用户管理和访问码控制多人共用一台服务器时更合适。两条路线的取舍我列在下面对比项Cherry StudioLobe Chat形态桌面客户端Web 界面容器依赖无Docker用户管理弱支持访问码离线准备安装包拷贝docker save / load适合场景个人或小团队多人共用的服务器# 在外网机器拉取 Lobe Chat 镜像并保存为 tar 文件 docker pull lobehub/lobe-chat docker save -o lobe-chat.tar lobehub/lobe-chat这里 docker save 会把镜像打包成单个 tar 文件之后把 lobe-chat.tar 拷到内网服务器再执行 docker load -i lobe-chat.tar 导入。离线环境没有镜像仓库可用tar 包是最直接的搬运方式。需要注意 save 和 load 是配套的不要混用 docker export 和 docker import那是对容器的操作导出的东西启动时会缺镜像元数据容易翻车。2.3 Modelfile 导入从裸权重到 ollama list 可见模型文件和 Ollama 都备齐了接下来就是把 GGUF 导入到 Ollama 里。导入操作依赖一个叫 Modelfile 的文本文件它的作用类似 Dockerfile告诉 Ollama“用哪个基础文件、起什么名字”。先把模型目录整理成下面这样GGUF 文件和 Modelfile 放在同一个目录Modelfile 里写一行 FROM指向 GGUF 文件名。文件名是什么FROM 就写什么不要写绝对路径到别的目录否则 ollama create 会一直找不到文件。# Modelfile 内容和模型文件同目录 FROM ./deepseek-r1-7b-q4_k_m.gguf然后在模型目录里执行cd /path/to/model/dir ollama create deepseek-r1:7b -f Modelfile ollama listollama create 的 -f 参数指定 Modelfile 路径deepseek-r1:7b 是给模型起的名字冒号后面是 tag可以按量化档位或参数规模区分。导入完成后 ollama list 里能看到这个条目说明模型已经进了 Ollama 的模型仓库。RAG 需要的文本向量模型比如 nomic-embed-text、bge 系列也用同样的方式导入只是 Modelfile 的 FROM 指向对应的 GGUF 文件。提示Modelfile 里还可以追加 TEMPLATE、PARAMETER 等配置项比如上下文长度 num_ctx、温度 temperature。但离线部署第一步不要加任何额外参数先让模型能跑起来再逐个加出问题才好定位是哪一行配置引起的。3. 多平台部署Windows Server 与 Linux 的细节差异和国产化适配3.1 Windows ServerOLLAMA_HOST 环境变量与防火墙入站Windows Server 上装 Ollama 是最直观的双击安装包下一步完成。但装完之后有个最大的坑——默认情况下 Ollama 只监听 127.0.0.1也就是只有本机能访问。你在服务器上把模型聊得飞起内网其他同事一访问就连接拒绝原因十有八九就是 OLLAMA_HOST 没改。打开“此电脑 → 属性 → 高级系统设置 → 环境变量”在系统变量里新建 OLLAMA_HOST值填 0.0.0.0:11434。这一步必须建在“系统变量”而不是“用户变量”因为 Ollama 服务是以系统服务方式运行的读的是系统级配置。同时再新建一个 OLLAMA_MODELS把模型目录指到你放 GGUF 文件的位置避免默认把几个百 G 的文件塞到 C 盘。配置完环境变量后重启 Ollama 服务让配置生效。在 PowerShell 里执行Restart-Service Ollama Get-Service Ollama Get-Process -Name ollamaGet-Service 确认服务状态是 RunningGet-Process 确认进程存在。如果服务起不来去 Windows 事件查看器里翻应用程序日志Ollama 启动阶段的错误通常都会记录在里面比在命令行干瞪眼有用得多。环境变量只是让 Ollama 开始监听所有网卡Windows 防火墙默认还会拦外部访问。在“Windows Defender 防火墙 → 高级设置 → 入站规则”里新建一条规则放行 TCP 11434 端口或者用命令一行搞定netsh advfirewall firewall add rule nameOllama API dirin actionallow protocolTCP localport11434我一般在 Windows Server 2019/2022 上这么操作都验证过。装完这台服务器的同事用 Cherry Studio 连 http://服务器IP:11434 就能直接访问不用再折腾客户端。3.2 Linuxsystemd 服务、bashrc 与防火墙放行含国产系统差异Linux 部署比 Windows 多一个选择题用 nohup 后台跑还是用 systemd 托管。我的建议是直接上 systemd原因很简单——内网服务器一重启nohup 进程不会自动拉起来到时候人不在现场服务挂了你都不知道。先把 ollama 二进制放到 /usr/local/bin 并赋执行权限sudo cp ollama /usr/local/bin/ sudo chmod x /usr/local/bin/ollama然后写 systemd 服务文件。这里有个很容易被忽略的点OLLAMA_HOST 环境变量如果只写在 ~/.bashrc 里systemd 启动的服务是读不到的因为 systemd 有自己的环境上下文。所以要么写在服务文件里要么写在 /etc/profile 里。# /etc/systemd/system/ollama.service [Unit] DescriptionOllama Service Afternetwork-online.target [Service] Userollama Groupollama WorkingDirectory/data/ollama ExecStart/usr/local/bin/ollama serve EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_MODELS/data/ollama/models Restartalways RestartSec10 [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl enable --now ollama systemctl status ollamaExecStart 指向 ollama serveOLLAMA_MODELS 路径要确保目录存在且属主是 ollama 用户否则服务启动时在模型目录上直接栽跟头。Restartalways 是给服务买的“后悔药”进程意外退出后 10 秒自动拉起内网环境没有人在旁边盯着这个参数务必保留。如果你只是临时测一下不想写 systemd也可以在 ~/.bashrc 里加 export OLLAMA_HOST0.0.0.0:11434然后 source ~/.bashrc再手动 ollama serve 前台跑。但这不是长期方案测试归测试生产环境一律 systemd。防火墙部分按发行版区分。CentOS/RHEL 系用 firewall-cmdUbuntu/Debian 系用 ufw# CentOS / RHEL sudo firewall-cmd --permanent --add-port11434/tcp sudo firewall-cmd --reload # Ubuntu / Debian sudo ufw allow 11434/tcp适配国产 Linux 发行版时先别急着照搬命令看它继承的是 apt 系还是 yum 系的包管理。大部分国产发行版都能直接跑上面的 systemd 配置个别的会启用 SELinux导致 Ollama 无法读取模型目录。处置方式不是关 SELinux而是给它放行先执行 getenforce 看当前状态再按下面的方式设置sudo semanage fcontext -a -t textrel_shib_t /data/ollama/models(/.*)? sudo restorecon -Rv /data/ollama/models这一步报错就去查 SELinux 的 avc 拒绝日志别一上来就 setenforce 0内网环境的安全策略不能被一个模型服务带偏。3.3 macOSLaunchAgents 与客户端连接macOS 上装 Ollama 最简单官方脚本或 Homebrew 二选一brew install ollama # 或者 curl -fsSL https://ollama.com/install.sh | sh装完同样要改 OLLAMA_HOST编辑 ~/.zshrc 写入 export OLLAMA_HOST0.0.0.0:11434然后 source ~/.zshrc。macOS 上如果只想本机用保持默认 localhost 就好不用暴露。需要开机自启的用 launchctl 注册一个 LaunchAgentplist 文件放到 ~/Library/LaunchAgents/ 下内容如下?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringcom.ollama.serve/string keyProgramArguments/key array string/usr/local/bin/ollama/string stringserve/string /array keyRunAtLoad/key true/ keyKeepAlive/key true/ /dict /plist这一步不是必须的但如果你把 Mac mini 当内网服务器用没有它每次重启后都要手动起服务。系统设置里的防火墙需要允许 ollama 接受传入连接否则内网机器一样连不上。客户端连接方式跟 Windows/Linux 一致把服务器地址填成 http://mac主机IP:11434 即可。4. 离线数据投喂从文本解析到 Cherry Studio 的 RAG 落地4.1 文档预处理DOCX/PDF 解析与中文分块模型跑起来只是第一步做内网 AI 知识库核心是把单位里的文档变成模型能检索的知识。离线环境里没有在线 API 可用所以数据投喂这步得自己把文档解析、分块、向量化做完。这里的两条路线我建议按团队情况选想完全可控、后期要自定义检索逻辑的走 Python 链路文档量不大、想快速见效的用 Cherry Studio两条路的对比后面会说。先处理文档。最常见的格式是 DOCX 和 PDF分别用 python-docx 和 pdfminer.six 解析中文分词用 jieba。这几个库在内网装起来比较费劲提前在外网机器把 wheel 包装好拷进去pip install 本地文件。代码逻辑很直白from docx import Document # 读取 DOCX 全部段落 doc Document(公司制度.docx) text \n.join(p.text for p in doc.paragraphs)# PDF 提取为纯文本 pdf2txt.py 产品手册.pdf -o output.txtDOCX 解析用 paragraph 拿段落文本注意不要用 doc.text 这种属性python-docx 没有这个接口PDF 用 pdf2txt.py 命令-o 指定输出文件。解析出来的文本先清洗把多余换行、特殊符号和表格里的碎片去掉再按固定大小分块。分块是 RAG 效果的关键块太小检索时语义不完整块太大向量化后内容被稀释既费资源又容易召回无关内容。def chunk_text(text, size500, overlap50): 按字符切分相邻块保留重叠 chunks [] for i in range(0, len(text), size - overlap): chunks.append(text[i:i size]) return chunks常见做法是按 500 个字符左右切一块相邻块之间重叠 50 字符保证跨块语义不断裂。中文本就按字符切不需要数 token这是离线 RAG 方案里最容易理解也最稳的参数。如果你的文档本身以章节为主可以先把段落按标题拆开再套用 chunk_text效果会比直接全文硬切好很多。4.2 向量化与向量库sentence-transformers 与 ChromaDB分好的文本块要转成向量才能在提问时做相似度检索。离线环境没有在线 embedding 服务用 sentence-transformers 加载本地模型中文场景推荐 bge 系列的中文向量模型比如 bge-large-zh-v1.5。模型文件提前下好放进内网加载时直接指本地路径。from sentence_transformers import SentenceTransformer model SentenceTransformer(/data/models/bge-large-zh-v1.5) sentences [这是第一段知识内容, 这是第二段知识内容] embeddings model.encode(sentences)encode 返回的是每个句子的向量数组bge 模型输出维度通常是 1024这个维度后面存 ChromaDB 时会用到。向量模型 GGUF 归 GGUF这里是 sentence-transformers 格式的目录别把两者搞混。向量数据库我用 ChromaDB默认本地文件存储适合内网单机环境。创建集合后把 embedding、原文、元数据、ID 一起塞进去import chromadb client chromadb.Client() # 默认本地存储 collection client.create_collection(knowledge_base) collection.add( embeddingsembeddings, documents[这是第一段知识内容, 这是第二段知识内容], metadatas[{source: doc1}, {source: doc2}], ids[id1, id2] )documents 里存的是可读原文检索命中后可以展示给用户metadatas 存来源信息便于追溯ids 是唯一标识重复导入会覆盖。ChromaDB 的本地存储目录默认为 ./chroma生产环境建议把路径指到大磁盘别默认放系统盘。查询时把用户问题也过一遍向量模型然后到 collection 里找最接近的块question_emb model.encode([备份策略是什么]) results collection.query( query_embeddingsquestion_emb, n_results5 ) print(results[documents])4.3 新手推荐Cherry Studio 投喂知识库与 RAG 配置上面这套 Python 链路老手可控性最高但对新手不太友好要处理离线依赖、要写脚本、要管向量库。如果单位里没有人专门维护这套流程我更推荐用 Cherry Studio 客户端直接投喂。它把文档解析、分块、向量化、检索全部封装了你只需要做两件事把文档拖进去把模型地址配上。打开 Cherry Studio 设置添加 Ollama 服务地址填 http://内网服务器IP:11434模型选 deepseek-r1:7b。然后在设置里导入文本向量模型Cherry Studio 支持连接 Ollama 上的 nomic-embed-text导入后才能做知识库的向量化。最后新建知识库把本地文档直接拖进去客户端自动完成分块和索引。这一步适合大多数业务场景文档不是特别多、不需要自定义分块策略、没有严格的权限要求。Cherry Studio 的方案能让你跳过 4.1 和 4.2 的所有代码把精力留在业务数据梳理上。等知识库文档量上来、检索效果不满意时再退回 Python 链路做精细调优。5. 安全加固与常见问题排查Ollama 访问控制与内网部署翻车记录5.1 Ollama API 访问控制从 0.0.0.0 到可信网段OLLAMA_HOST 设为 0.0.0.0:11434 之后Ollama 的 API 就完全裸露在内网里了。任何能访问这个端口的人都可以拉走模型列表、发起推理请求更严重的还可以下载模型文件。内网不是绝对安全这个口子必须收住。第一个做法是防火墙白名单11434 端口只放行指定的可信终端 IP而不是对所有网段开放。sudo firewall-cmd --permanent --remove-port11434/tcp sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.10.0/24 port port11434 protocoltcp accept sudo firewall-cmd --reload先用 remove-port 把之前放行的全量端口规则删掉再通过 rich-rule 精确到来源网段。这样只有 192.168.10.0/24 网段的机器能访问 11434其他网段一律拒绝。第二个做法是前置认证。如果多人共用服务器、且需要通过 Web 界面访问优先用 Lobe Chat 这类带访问码的客户端启动时把访问码和 Ollama 地址一起传进去docker run -d -p 3210:3210 \ -e ACCESS_CODE你的访问码 \ -e OLLAMA_BASE_URLhttp://内网服务器IP:11434 \ -e OLLAMA_API_MODELdeepseek-r1:7b \ --name lobe-chat \ lobehub/lobe-chatACCESS_CODE 是 Lobe Chat 的访问认证码配好后没输入正确代码的人连页面都打不开OLLAMA_BASE_URL 让 Web 服务作为唯一入口外部不直接接触 11434。如果用服务器管理面板比如宝塔来管这台机器面板的安全功能里也能做同样的事放行端口时限定来源 IP或者在面板里建反向代理把 Ollama API 挂在带 Basic Auth 的路径后面然后把 11434 端口对公网关闭所有请求强制走代理认证。面板能做的是把防火墙规则、反向代理、访问认证集中到一个界面省得每条规则都敲命令。提示不管用哪种方式部署完一定要从内网另一台机器用 curl 测一下未授权访问是否已被拦截。我见过太多以为配了认证、实际防火墙没生效的情况这个验证动作放在第 6 章别跳过。5.2 现象Ollama 服务起不来systemctl 显示 failed原因最常见是 OLLAMA_MODELS 指向的目录不存在或属主不对其次是 11434 端口被占用偶发在国产系统上是内核版本与二进制不兼容。解决先看日志systemctl status ollama 和 journalctl -u ollama -n 50 会给出最直接的报错确认模型目录已创建chown 给 ollama 用户用 ss -lntp | grep 11434 查端口占用有进程占着就换端口或停掉冲突服务。如果是内核版本太老需要换用官方针对旧系统的兼容版本或改用源码自编译。5.3 现象内网其他机器访问不了 11434curl 超时原因OLLAMA_HOST 仍然默认 127.0.0.1或者防火墙没放行。这两个原因经常同时存在只改一个必然还是不通。解决先确认 OLLAMA_HOST 已改成 0.0.0.0:11434 并重启服务再在服务器本机执行 curl http://127.0.0.1:11434/api/tags 确认服务正常最后从其他机器 curl http://服务器IP:11434/api/tags。本机通、其他机器不通就是防火墙回 5.1 改规则。还有一个隐蔽场景服务器上有多个网卡Ollama 监听到了 0.0.0.0但客户端访问的是内网里不通的地址这种情况要查路由而不是查端口。5.4 现象Modelfile 导入时报错或 ollama list 为空原因Modelfile 和 GGUF 不在同一目录或 FROM 写的是绝对路径但文件已被移动也可能 ollama create 执行时当前目录并不是模型目录。解决检查 Modelfile 内容FROM 后面只写同目录下的文件名执行 ollama create 前先 cd 到模型目录如果之前用绝对路径创建过重新用正确路径再 create 一次。ollama list 为空还有一个常见原因OLLAMA_MODELS 环境变量被改过新模型写到了另一个模型仓库而 ollama list 读的是当前生效的路径。把环境变量对齐重新导入一次即可。5.5 现象国产系统部署异常与知识库问答答非所问国产系统部署异常的原因多出在架构选错。Ollama 有 x86_64 和 arm64 两套二进制先确认 CPU 架构用 uname -m 查看再选择对应版本。把 x86 的二进制拷到 arm64 机器上启动时会直接报 Exec format error。另外部分国产系统自带 SELinux模型目录没有放行会导致读取拒绝按 3.2 的 semanage 命令处理。知识库问答答非所问先不要怀疑模型内网模型一旦跑起来生成能力基本是稳定的问题大多在 RAG 链路。500 字符的分块对长文档可能太碎尝试调到 800 到 1000 字符并增加重叠量检索时如果返回的候选太少调大 n_results 或 top_kembedding 模型如果是中文文档却用了英文向量模型语义匹配会非常差换 bge 中文模型重新向量化。按这个顺序调一轮绝大多数“答非所问”都能缓解。6. 装完怎么验证跑通从模型问答到 RAG 检索的全链路检查部署完成不等于能用我每次在内网把 DeepSeek 这套环境装完都会强制按下面四步走一遍全部通过才敢交付。第一步验证服务Linux 执行 systemctl status ollamaWindows 执行 Get-Service Ollama服务状态必须是 running。第二步验证模型执行 ollama list确认 deepseek-r1 和向量模型都在列表里。第三步用 curl 直接打 API这一条能同时验证模型加载和推理链路curl http://127.0.0.1:11434/api/generate \ -d {model: deepseek-r1:7b, prompt: 你好请回复收到, stream: false}返回 JSON 里有 response 字段说明模型推理正常。前两步都通过、这一步失败问题基本锁定在模型文件或显存、内存不足。接下来从内网另一台机器用 http://服务器IP:11434/api/tags 访问一次能返回模型列表说明网络链路和防火墙都通了。第四步验证 RAG。打开 Cherry Studio 或 Lobe Chat在知识库界面提问一个只有你上传文档里才有答案的问题比如“根据刚上传的《运维手册》备份策略是什么”。如果回答内容引用了文档里的原话说明 RAG 链路完整。这里有个小技巧提问时限定“根据资料回答”能逼着客户端走检索而不是让模型自由发挥。四步验证做完再把安全项过一遍从非白名单机器访问 11434 应被拒绝访问 Lobe Chat 页面应弹出访问码输入框。从那以后我每次在内网部署完这套环境都会强制走一遍“服务状态 → ollama list → curl generate → 知识库提问”四步验证宁可多花三分钟也不交付一个带着暗伤的黑匣子。这四步做完你手里的内网 AI 知识库才算真正跑通希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑