☰
内网AI知识库离线部署指南:从安装包到安全加固
2026/10/20 10:31:40 网站建设 项目流程

简介:面向政企单位内网环境的 DeepSeek 离线部署资料,覆盖离线资源准备、模型导入、环境部署、RAG 数据投喂、安全加固与国产化适配等 AI 知识库落地全流程。资源共 1 个 PDF 文件,约 5.28MB,目录围绕离线安装、多平台部署、数据接入和权限管理展开,适合 IT 运维人员及有技术基础的学习者查阅。目前已有 1372 人学习下载。文中给出模型离线包、Ollama 安装包、客户端等工具的获取与导入方法,分别说明 Windows Server、Linux、macOS 的部署要点,并提供两种 RAG 实现方式,其中通过 Cherry Studio 投喂数据对新手更友好。安全方面,文档详解 Ollama API 访问控制、Lobe Chat 权限设置及宝塔面板加固,兼顾国产操作系统与 CPU 架构兼容性,可帮助用户在内网搭建安全可用的 AI 知识库。

1. 内网部署AI知识库:离线安装包、国产化适配与安全加固一次讲透

在内网环境里部署大模型,最让人头疼的往往不是模型本身,而是那几百个G的权重文件怎么弄进去、依赖包去哪找、安装到一半发现缺这缺那。网上教程动不动就是pip install、git clone,在内网环境下根本走不通。我帮某研发部搭过一套DeepSeek离线知识库,从资源准备到权限管理踩了不少坑,这套流程跑通后,无论是Windows Server还是国产化Linux都能平稳复现。这篇笔记把离线资源准备、多平台部署、RAG数据投喂、访问控制与国产化适配串成一条完整链路,照着走就能搭出一个真正可用的内网AI知识库,适合政企IT运维和有一定技术基础的同学。

2. 离线资源准备:模型文件、安装包与离线导入的完整闭环

内网部署的第一步,不是急着敲命令,而是把手头需要的所有东西备齐。这个环节做扎实了,后面会顺很多。

2.1 模型离线包的选择与获取

模型是整个知识库的核心。官方原版模型在合规性上更稳妥,但如果你需要无审查版本,Hugging Face和Ollama仓库里都有对应的替代品。需要注意的是,Ollama官方仓库的模型名通常是deepseek-r1,而社区版本可能是deepseek-r1-abliterated这类命名,本质是同一个模型去掉部分限制的重新打包。

下载渠道主要有三个:Hugging Face、ModelScope和Ollama官方仓库。在有网环境先下载好GGUF格式的文件,因为GGUF是Ollama能直接导入的文件后缀。如果你用LM Studio下载,下载完成后找到对应的模型文件夹,里面一般是FP16或Q8_0等不同精度的GGUF文件,比如bge-reranker-v2-m3-FP16.gguf这种。

下载完成后,务必做完整性校验,防止文件损坏或被篡改。Linux和macOS用:

sha256sum /path/to/your/model/file

Windows用PowerShell:

Get-FileHash -Algorithm SHA256 /path/to/your/model/file

将算出来的哈希值和官方提供的值对比,一致才说明文件完整。这一步很多人跳过,但在内网环境一旦文件损坏,排错成本极高。

2.2 Ollama离线安装包与客户端准备

Ollama的安装包在不同平台上有不同方式。Windows直接从官网下载安装包即可;Linux在有网机器上执行安装脚本后,二进制文件通常落在/usr/bin或/usr/local/bin,把这个二进制文件拷到内网就行;macOS的处理方式类似Linux。

需要注意,Linux下这种拷二进制的方式,后续用systemd托管服务会更顺手。如果你打算用Docker跑Web客户端,还需要提前导出现有镜像。RAG功能依赖的rag-web-ui也可以用同样的方式:在有网机器上拉取镜像,然后docker save导出。

# 在有网机器上拉取并导出镜像 docker pull lobehub/lobe-chat docker save -o lobe-chat.tar lobehub/lobe-chat

导出后会得到一个lobe-chat.tar文件,拷到内网后执行docker load -i lobe-chat.tar就能加载,不需要在内网重新拉取。

2.3 模型文件分割与合并:大文件传输的后悔药

模型文件动辄几十个G,U盘拷贝经常碰到文件系统格式限制。FAT32不支持超过4G的单文件,NTFS虽然支持但内网有些老机器读取有问题。我一般用两种方式处理:Linux下用split命令分卷,Windows下用7-Zip分卷压缩。

# Linux 分割大模型文件,每个卷4G split -b 4G deepseek-r1-abliterated-32b.gguf model_part_ # 合并 cat model_part_* > deepseek-r1-abliterated-32b.gguf

合并完成后记得再跑一遍sha256sum,确认分割传输没有损坏文件。

2.4 Modelfile离线导入:从GGUF到ollama create

拿到GGUF文件后,不能直接扔进Ollama,需要先创建一个Modelfile。在模型文件同级目录下,新建一个名为Modelfile的文件,把模型文件名和后缀名写进去。

FROM deepseek-r1-abliterated-32b.gguf

然后执行导入命令:

ollama create my-deepseek -f Modelfile ollama list

ollama create后面的名字可以自定义,-f指定Modelfile路径。导入完成后用ollama list确认模型已出现在列表中。这里有个小坑:Modelfile里的模型文件名必须和实际文件完全一致,包括大小写和后缀,否则会报找不到文件。

3. 多平台部署:从Windows Server到国产化Linux的Ollama服务搭建

资源备齐后,部署阶段的核心是环境变量和系统服务托管。这两个点做好了,跨平台迁移基本就是复制粘贴的事。

3.1 环境变量是第一个坑:OLLAMA_HOST与OLLAMA_MODELS

Ollama默认只监听本机回环地址,如果不改绑定地址,内网其他机器访问不到。需要设置OLLAMA_HOST=0.0.0.0:11434,让服务监听所有网卡。如果只是本机使用,保持localhost:11434即可。

OLLAMA_MODELS指定模型存放路径,这个变量如果你手动导入了模型,最好固定到一个单独目录,方便备份和迁移。默认情况下Ollama会把模型放在用户目录下的.ollama/models里,内网环境我习惯单独建一个/data/ollama-models目录,规整且好维护。

3.2 Windows Server部署步骤

Windows Server 2019和2022我都实测过,安装过程相对简单。双击Ollama安装包,按提示完成安装,然后配置环境变量。右键“此电脑” -> 属性 -> 高级系统设置 -> 环境变量,在系统变量中新建:

OLLAMA_HOST=0.0.0.0:11434 OLLAMA_MODELS=D:\ollama-models

修改完后重启Ollama服务。可以在服务管理器中找到Ollama服务手动重启,也可以直接重启服务器。接着配置Windows Defender防火墙的入站规则,放行TCP 11434端口,否则内网其他机器访问不了。

netsh advfirewall firewall add rule name="Ollama" dir=in action=allow protocol=TCP localport=11434

常见问题排查用PowerShell命令:Get-Process -Name ollama检查进程是否运行,Get-Service Ollama查看服务状态,再配合事件查看器里的应用日志定位启动失败原因。

3.3 Linux Server部署步骤

Linux下拷贝二进制文件到/usr/local/bin后,最规范的做法是编写systemd服务文件,实现开机自启和异常重启。新建/etc/systemd/system/ollama.service:

[Unit] Description=Ollama Service After=network.target [Service] User=youruser WorkingDirectory=/data/ollama ExecStart=/usr/local/bin/ollama serve Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_MODELS=/data/ollama-models" Restart=always [Install] WantedBy=multi-user.target

启用并启动服务:

sudo systemctl enable ollama sudo systemctl start ollama systemctl status ollama

注意User字段替换成实际用户名,WorkingDirectory要指向有读写权限的目录,否则模型写入会失败。防火墙配置上,CentOS/RHEL用firewall-cmd,Ubuntu/Debian用ufw,规则都是放行TCP 11434和3010端口。

高并发场景下别忘了调整ulimit,默认文件描述符上限可能不够用。临时调大可以执行ulimit -n 65535,持久化修改需要编辑/etc/security/limits.conf。

3.4 macOS部署与Lobe Chat Web端

macOS部署用Homebrew最省事,brew install ollama后同样配置环境变量到~/.zshrc,然后启动服务。如果遇到Gatekeeper权限拦截,在“系统设置” -> “隐私与安全性”中允许对应应用即可,不建议关闭SIP。

Lobe Chat用Docker部署比较优雅:

docker run -d -p 3210:3210 \ -e OPENAI_API_KEY=sk-xxxx \ -e ACCESS_CODE=your-access-code \ --name lobe-chat \ lobehub/lobe-chat

ACCESS_CODE是访问认证码,自己设一个强密码。部署完后浏览器打开http://<服务器IP>:3010就能进入Web界面。如果你用宝塔面板,Lobe Chat容器起来后别忘了在面板的安全模块放行对应端口。

4. 离线数据投喂:两条路径实现RAG知识库

模型部署好只是第一步,内网AI知识库的核心价值在于能回答你的业务文档问题。数据投喂有两条路:一条适合新手,在Cherry Studio客户端里点鼠标完成;另一条适合批量处理,用Python脚本走传统RAG流程。

4.1 新手推荐:Cherry Studio客户端喂数据

Cherry Studio是我比较推荐的客户端,它内置了知识库功能。打开客户端后,点击设置进入模型配置,在“添加模型”处填入向量化模型,也就是之前在Ollama里导入的嵌入模型,比如nomic-embed-text或者bge-m3系列。

然后新建知识库,把txt、pdf、docx、md等格式文档拖进知识库即可。客户端会自动完成分块、向量化和索引构建。这种方式适合文档量不大、几百份以内的场景,不需要写任何代码。

需要注意,向量化模型和对话模型是两个不同的东西。对话模型负责生成回答,向量化模型负责把文本转成向量。两者缺一不可,漏配向量化模型会导致知识库无法写入。

4.2 传统RAG流程:从文本提取到向量数据库

如果需要批量处理大量文档,或者想完全掌控RAG流程,用Python脚本更合适。完整流程分为四步:文本提取与清洗、分块、向量化、写入向量库。

先处理文档格式。docx用python-docx提取文本,PDF用pdfminer.six:

# pip install python-docx pdfminer.six jieba from docx import Document from pdfminer.high_level import extract_text def extract_from_docx(path): doc = Document(path) return '\n'.join([p.text for p in doc.paragraphs]) def extract_from_pdf(path): return extract_text(path)

分块参数直接影响检索质量。块太小语义不完整,块太大检索噪声多。我一般用500字符一块,重叠50字符:

def chunk_text(text, size=500, overlap=50): chunks = [] for i in range(0, len(text) - overlap, size - overlap): chunks.append(text[i:i+size]) return chunks

向量化使用sentence-transformers加载离线嵌入模型,注意模型路径指向本地:

from sentence_transformers import SentenceTransformer model = SentenceTransformer('/data/models/bge-large-zh-v1.5') chunks = chunk_text("你的文档文本", size=500) embeddings = model.encode(chunks)

写入向量数据库,我常用ChromaDB,轻量且支持本地存储:

import chromadb client = chromadb.Client() collection = client.create_collection("my_knowledge_base") collection.add( embeddings=embeddings, documents=chunks, metadatas=[{"source": "doc1"} for _ in chunks], ids=[f"id{i}" for i in range(len(chunks))] )

4.3 文本清洗的常见坑

中文文本里最容易出问题的是全角半角混用和特殊符号。分块前先做一轮清洗,把不必要的换行符、HTML标签和特殊字符处理掉,否则向量化效果会明显变差。另外,如果文档是扫描件PDF,需要先做OCR,否则提取出来的是一片乱码,这个问题经常让人误以为是模型问题。

5. 常见问题与避坑:部署流程中那些翻车现场

这套流程我反复搭过多次,整理几个高频问题,每条都是血泪经验换来的。

5.1 现象:内网其他机器访问不上Ollama服务

原因:OLLAMA_HOST环境变量没设对,或者防火墙没放行端口。Windows Server最常见的是防火墙默认阻止入站连接,Linux常见的是SELinux拦截。

解决:先在本机执行curl http://localhost:11434确认服务正常,再换一台内网机器用curl http://<服务器IP>:11434测试。如果本机正常远程不通,检查防火墙放行规则;Linux下如果是SELinux拦截,执行sudo setsebool -P httpd_can_network_connect 1。

5.2 现象:离线导入模型报错 "file not found"

原因:Modelfile里写的文件名和实际GGUF文件名不匹配,或者文件路径含中文导致解析异常。

解决:确认Modelfile里写的文件名与ls看到的完全一致,包括后缀。路径改用纯英文目录,不要把模型放在带中文名或空格的目录下。

5.3 现象:知识库检索结果乱答,答非所问

原因:向量化模型没有正确加载,或者分块参数设置不合理。常见的是用了对话模型去向量化,导致向量维度不匹配或者检索效果很差。

解决:确认Ollama里已经导入向量模型并能在客户端配置中选到。分块大小调整到300到800字符之间测试效果,重叠率保持在10%到20%。另外一个容易被忽略的坑:不同文档的语言要一致,中英文混杂的文档最好先做语言分类再分别处理。

5.4 现象:Docker镜像导入后无法启动Lobe Chat

原因:内网机器Docker版本较低,与镜像要求的版本不兼容。旧版本Docker在镜像层格式解析上可能有问题。

解决:升级Docker到较新版本,至少20.10以上。启动后用docker logs lobe-chat查看详细日志,定位到具体报错信息再处理。

5.5 现象:国产化系统上Ollama频繁崩溃

原因:部分国产CPU对特定指令集的支持不完整,而Ollama的预编译二进制依赖较新的CPU指令。这类问题在基于ARM架构的国产芯片上尤其明显。

解决:确认采用的是ollama serve直跑还是基于ARM的容器镜像方案。优先选用内置CPU指令集兼容性更好的发行版镜像,必要时降级到较老但更稳定的Ollama版本。

6. 安全加固与国产化适配:让Ollama服务在内网更安全、更可控

模型部署好、知识库投喂完,工作其实只完成了一大半。Ollama默认的API是全开状态,只要服务暴露在网络上,任何能访问到端口的人都能调用模型,这在政企环境中是不能接受的。

6.1 Ollama API访问控制:从裸奔到加锁

Ollama本身没有内置鉴权机制,默认情况下/api端点是直接暴露的,如果服务监听的是0.0.0.0:11434又不加防护,内部任何一个能触达这台服务器的用户都可以调用你的模型。这不是危言耸听,内网用户并不代表都是可信的。

我常用的低成本方案是在服务前面加一层反向代理,用Nginx做基本认证:

server { listen 11435; server_name localhost; location / { auth_basic "Ollama API"; auth_basic_user_file /etc/nginx/conf.d/ollama.htpasswd; proxy_pass http://127.0.0.1:11434; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

生成认证文件用htpasswd -c /etc/nginx/conf.d/ollama.htpasswd youraccount,然后所有调用方把API地址改成http://服务器IP:11435,并在请求头里带上基本认证信息。这样Ollama本身不对外开放,对外暴露的只有加了锁的代理端口。

6.2 宝塔面板对Ollama API的防护设置

如果你用宝塔面板管理服务器,在安全模块中放行的端口要精准,不要把11434全量暴露。更稳妥的做法是:Ollama只监听127.0.0.1:11434,宝塔中仅放行代理端口,或者直接在面板的安全里设置IP白名单。

设置IP白名单时要注意,宝塔的IP白名单对Docker容器不生效,因为容器走的是NAT网络。需要对容器做端口映射调整,或者用Docker的-p 127.0.0.1:3220:3210方式只绑定本机端口。

6.3 Lobe Chat的访问码与用户管理

Lobe Chat里设置ACCESS_CODE环境变量后,所有访问者在第一次进入Web界面时都会被要求输入访问码。如果希望进一步做多用户隔离,可以在Lobe Chat里启用内置的用户管理功能,分配独立账号。

我习惯把ACCESS_CODE设成一个复杂的随机字符串,而不是简单好记的密码。部署完成后,还要检查容器的端口映射是否绑定了0.0.0.0,如果只在本地内网使用,绑定到内网IP地址更安全。

6.4 国产化适配的边界与判断依据

国产化适配不是一句口号,需要逐项验证。操作系统层面,目前主流国产Linux发行版大多基于开源生态的二次开发,Ollama官方二进制能否直接运行,取决于内核版本和glibc版本。可以先执行ldd /usr/local/bin/ollama检查动态库依赖是否满足。

对于ARM架构的国产CPU,优先找Ollama的ARM版本;对于特定厂商的CPU指令集,如果官方二进制无法运行,考虑在目标机器上从源码构建Ollama,或者直接用容器方式部署。硬件兼容性方面要注意显存和内存的匹配:推理时模型需要常驻显存,显存不足会退到CPU推理,生成速度会慢到让人想砸机器。我一般按照参数量估算:7B模型量化后大概需要6G到8G显存,14B模型需要12G到16G,32B模型至少需要24G显存,低于这个配置还是老实用小模型。

6.5 我现在的固定流程

从那以后,我每次搭建内网AI知识库,都会强制走一遍固定流程:备齐离线包并校验哈希值,配置OLLAMA_HOST到0.0.0.0但外层加反向代理和认证,导入模型前先确认GGUF文件完整,投喂数据前先分块再清洗,部署完成后用一两条真实业务问题做检索验证,最后再检查防火墙和端口暴露情况。这套流程走下来,很少再出幺蛾子。希望这篇笔记能帮你在内网环境里少踩几个坑,把DeepSeek真正用起来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询