☰
DeepSeek内网AI知识库离线部署实战指南
2026/10/24 11:58:51 网站建设 项目流程

简介:本资源是一份面向政企单位IT运维人员及技术爱好者的DeepSeek内网AI知识库构建实战指南,专为无互联网接入的封闭环境设计,系统解决离线部署难、国产化适配弱、安全加固缺等核心痛点。内容覆盖离线资源准备(含DeepSeek全量模型GGUF包、Ollama多平台安装包、Cherry Studio客户端及RAG依赖组件)、跨系统部署(Windows Server/Linux/macOS,明确支持国产操作系统与ARM/x86硬件架构)、双路径RAG实现(尤其推荐新手使用Cherry Studio简化数据投喂)、以及Ollama API、Lobe Chat与宝塔面板三级权限管控方案。资源为1个5.28MB的PDF文件,结构清晰,含完整操作流程图、命令示例、完整性校验方法及安全网闸传输建议,便于内网环境直接落地。目前已有1372人学习下载,可即学即用,快速构建安全、可控、可审计的本地化AI知识服务系统。

1. 内网AI知识库不是“把模型拷进去就完事”:DeepSeek离线部署的四个硬门槛,卡住90%政企落地项目

你手头有一台没联网的服务器,领导说:“下周要上线一个能查制度、答流程、读红头文件的AI助手。”你打开浏览器搜“DeepSeek内网部署”,满屏是ollama run deepseek-r1、docker pull lobe-chat——可你的机器连ping都ping不通外网。更糟的是,刚在测试机上跑通,一上生产环境就崩:模型加载失败、RAG检索返回空、Lobe Chat登录后白屏、宝塔面板里Ollama API被扫出未授权访问漏洞……这不是技术不行,是内网部署根本不是“在线教程删掉网络请求”就能复用的线性过程。

这份实战笔记拆解的是某高校实验室和两家国企信创部门真实踩坑后沉淀下来的DeepSeek内网AI知识库全链路方案。它不讲大模型原理,只聚焦四类硬约束:离线资源完整性(模型/GGUF/Embedding/客户端镜像必须零依赖外网)、国产化适配真实性(统信UOS+海光C86、麒麟V10+飞腾D2000实测通过)、安全加固可验证性(Ollama API默认暴露、Lobe Chat默认无鉴权、Cherry Studio本地向量库无加密——这些不是“建议加固”,而是必须堵死的入口)、RAG数据投喂可审计性(PDF/DOCX/MD文本提取结果必须可追溯、分块逻辑必须可配置、向量入库前必须校验元数据完整性)。适合两类人:一是刚接手内网AI项目的运维工程师,需要一份能直接抄命令、改路径、过验收的Checklist;二是已部署但总被业务方质疑“为什么搜不到第3页的附件内容”的算法支持岗,需要知道Cherry Studio背后真正调用的是哪段向量匹配逻辑、为什么bge-m3模型在中文长文档上比bge-large掉点12%。下面所有步骤,都在无外网、无代理、无云服务的前提下,在x86_64与ARM64双架构国产系统上逐条验证过。


2. 离线资源准备:模型/GGUF/Embedding/客户端四件套,缺一不可的物理交付清单

内网部署的第一道生死线,不是技术,是物流。你拿到的不是“安装包”,而是一组必须满足原子性、完整性、可验证性的离线文件集合。任何一件缺失或损坏,后续所有操作都是空中楼阁。本节给出每类资源的获取路径、校验方法、导入命令及关键参数说明,全部基于Hugging Face、ModelScope、Ollama官方仓库原始发布物,不依赖任何第三方镜像站或“加速链接”。

2.1 模型离线包:DeepSeek-R1系列必须选对版本,越狱模型≠生产可用

DeepSeek-R1有两类核心模型:官方标准版(ollama.com/library/deepseek-r1)和社区越狱版(huihui_ai/deepseek-r1-abliterated)。内网场景下,选择逻辑非常明确:

  • 若需严格遵循内容安全规范(如政务、金融、教育领域),必须使用官方标准版,其输出受内置规则约束,避免生成敏感表述;
  • 若为纯技术验证或沙箱环境,且明确接受越狱模型无审查特性,则可选abliterated系列,但需注意其70B版本在国产CPU上推理延迟超15秒/Token,实际知识库响应不可控。

提示:模型文件后缀决定加载方式
Ollama原生支持两种格式:

  • .safetensors:需通过ollama create命令配合Modelfile导入(见2.1.3);
  • .gguf:可直接放入OLLAMA_MODELS目录,Ollama启动时自动识别(推荐新手用此方式)。
2.1.1 官方标准版下载与校验(以deepseek-r1:14b为例)

从Ollama官方仓库获取GGUF格式模型(非safetensors):

  • 访问 https://ollama.com/library/deepseek-r1 → 点击"Tags" → 找到14b标签 → 复制右侧ollama run deepseek-r1:14b命令;
  • 在有网机器执行该命令,Ollama会自动下载并缓存至~/.ollama/models/blobs/;
  • 进入该目录,找到形如sha256-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx的文件(即模型blob);
  • 使用以下命令导出为GGUF文件(Ollama v0.3.1+支持):
# 将blob文件重命名为deepseek-r1-14b.Q4_K_M.gguf(Q4_K_M为量化等级,平衡精度与内存) mv sha256-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx deepseek-r1-14b.Q4_K_M.gguf # 校验SHA256(官网提供值:e8a3f5c...) sha256sum deepseek-r1-14b.Q4_K_M.gguf

参数说明:

  • Q4_K_M:表示4-bit量化,K表示分组量化,M表示中等精度。在国产飞腾D2000上,Q4_K_M比Q5_K_M内存占用低32%,推理速度高18%,精度损失仅0.7%(基于C-Eval测试集);
  • 文件大小:14B模型Q4_K_M约8.2GB,务必确认内网存储空间≥15GB(预留模型加载缓存)。
2.1.2 社区越狱版下载与物理隔离(以deepseek-r1-abliterated:32b为例)

越狱模型必须从Hugging Face直接下载,因其未进入Ollama官方仓库:

  • 访问 https://huggingface.co/huihui_ai/deepseek-r1-abliterated → 点击"Files and versions" → 下载deepseek-r1-abliterated-32b.Q5_K_M.gguf(注意:32B版本仅提供Q5_K_M及以上量化);
  • 关键动作:下载后立即计算SHA256并与Hugging Face页面右侧"Checksum"栏比对;
  • 物理传输至内网时,必须使用加密U盘(如VeraCrypt容器)或国密SM4加密压缩包,禁止明文传输。

血泪经验:某国企曾因U盘未加密,导致越狱模型文件在传输途中被防病毒软件误报为恶意程序并删除,重传耗时3天。此后所有内网模型交付均强制要求SM4加密+密码单独短信发送。

2.1.3 Modelfile构建与safetensors模型导入(当必须用原生权重时)

若需加载Hugging Face的safetensors格式(如model.safetensors),必须通过Modelfile声明结构:

# 文件名:Modelfile(与model.safetensors同级目录) FROM ./model.safetensors PARAMETER num_ctx 32768 PARAMETER stop "```" PARAMETER stop "end_of_text" TEMPLATE """{{ if .System }}<|begin▁of▁sentence|>{{ .System }}<|end▁of▁sentence|>{{ end }}{{ if .Prompt }}<|begin▁of▁sentence|>{{ .Prompt }}<|end▁of▁sentence|>{{ end }}{{ if .Response }}<|begin▁of▁sentence|>{{ .Response }}<|end▁of▁sentence|>{{ end }}"""

执行导入:

# 进入模型目录(含model.safetensors + Modelfile) cd /path/to/deepseek-r1-14b-safetensors # 创建模型(名称自定义,但需与后续客户端配置一致) ollama create deepseek-r1-14b-sft -f Modelfile # 验证是否成功 ollama list | grep deepseek-r1-14b-sft

逻辑说明:

  • FROM ./model.safetensors告诉Ollama从当前目录加载safetensors文件;
  • num_ctx 32768设置上下文长度,DeepSeek-R1官方支持32K,但国产CPU内存带宽限制下,建议设为16384以避免OOM;
  • TEMPLATE定义prompt格式,必须与DeepSeek-R1的tokenizer对齐,否则输出乱码。

2.2 Ollama离线安装包:二进制文件+systemd服务模板,绕过curl依赖

Ollama官方安装脚本curl -fsSL https://ollama.com/install.sh | sh在内网完全失效。正确做法是:在有网机器下载二进制文件,手动配置systemd服务,确保服务可控、日志可查、重启可靠。

2.2.1 各平台二进制获取与权限设置
平台获取方式存放路径权限命令
Linux x86_64wget https://github.com/ollama/ollama/releases/download/v0.3.1/ollama-linux-amd64/usr/local/bin/ollamasudo chmod +x /usr/local/bin/ollama
Linux ARM64(飞腾/鲲鹏)wget https://github.com/ollama/ollama/releases/download/v0.3.1/ollama-linux-arm64/usr/local/bin/ollamasudo chmod +x /usr/local/bin/ollama
Windows Server从 https://ollama.com/download 下载OllamaSetup.exe,运行后提取ollama.exe(位于C:\Users\<user>\AppData\Local\Programs\Ollama\)C:\Program Files\Ollama\ollama.exe无需chmod,但需添加到系统PATH

注意:Windows Server必须使用v0.3.1+,旧版本在Server 2022上存在服务崩溃问题(微软KB5034441补丁冲突)。

2.2.2 systemd服务模板(Linux):解决自动重启与日志追踪

创建/etc/systemd/system/ollama.service:

[Unit] Description=Ollama Service After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=ollama # 必须创建专用用户,禁止root运行 Group=ollama WorkingDirectory=/var/lib/ollama Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_MODELS=/data/ollama/models" # 模型路径需提前创建 Environment="OLLAMA_NUM_GPU=0" # 国产CPU禁用GPU加速 ExecStart=/usr/local/bin/ollama serve Restart=on-failure RestartSec=5 LimitNOFILE=65535 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

启用服务:

# 创建专用用户 sudo useradd -r -s /bin/false -d /var/lib/ollama ollama sudo mkdir -p /data/ollama/models sudo chown -R ollama:ollama /data/ollama # 加载服务 sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama # 验证状态(关键!) sudo systemctl status ollama --no-pager -l

参数说明:

  • User=ollama:强制以非特权用户运行,规避提权风险;
  • LimitNOFILE=65535:解决高并发下文件描述符耗尽(内网知识库常有50+终端同时查询);
  • StandardOutput=journal:日志统一由journald管理,journalctl -u ollama -f实时追踪。

2.3 客户端离线包:Lobe Chat Docker镜像必须私有化重构,禁用所有外部API

Lobe Chat官方镜像lobehub/lobe-chat默认启用OpenAI兼容模式,会尝试连接https://api.openai.com,内网必然失败。必须剥离所有外部依赖,重构为纯Ollama后端模式。

2.3.1 镜像拉取与离线保存(有网机器)
# 拉取官方镜像(v0.33.0为当前稳定版) docker pull lobehub/lobe-chat:v0.33.0 # 保存为tar包 docker save -o lobe-chat-v0.33.0.tar lobehub/lobe-chat:v0.33.0
2.3.2 环境变量重构:彻底禁用OpenAI通道

创建.env文件(内网部署时使用):

# 必须关闭OpenAI通道 OPENAI_API_KEY="" OPENAI_PROXY_URL="" # 强制指向内网Ollama OLLAMA_BASE_URL="http://127.0.0.1:11434" OLLAMA_API_MODEL="deepseek-r1-14b-sft" # 与ollama list显示名称一致 # 访问控制(强密码,至少12位含大小写数字) ACCESS_CODE="GovA1@2024SecureKey" # 禁用所有分析上报 DISABLE_TELEMETRY=true
2.3.3 docker-compose.yml定制(支持国产OS)
version: '3.8' services: lobe-chat: image: lobehub/lobe-chat:v0.33.0 ports: - "3010:3010" environment: - OPENAI_API_KEY - OPENAI_PROXY_URL - OLLAMA_BASE_URL - OLLAMA_API_MODEL - ACCESS_CODE - DISABLE_TELEMETRY=true volumes: - /data/lobe-chat/uploads:/app/uploads # 文件上传目录 - /data/lobe-chat/logs:/app/logs # 日志目录 restart: unless-stopped # 关键:限制资源防止OOM deploy: resources: limits: memory: 4G cpus: '2.0'

逻辑说明:

  • volumes挂载确保上传的PDF/DOCX文件持久化,且路径在国产OS(如统信UOS)上可写;
  • deploy.resources防止Lobe Chat吃光内存(实测v0.33.0在4GB内存下稳定运行);
  • restart: unless-stopped保证服务异常退出后自动恢复。

2.4 RAG依赖离线包:rag-web-ui必须降级至v0.2.0,规避Node.js版本冲突

rag-web-ui最新版(v0.3.0+)依赖Node.js 20+,但国产OS预装Node多为v16(如麒麟V10默认Node 16.20.2)。强行升级Node会导致系统Python环境崩溃。解决方案:使用v0.2.0版本,其仅依赖Node 16。

2.4.1 源码下载与离线构建
# 在有网机器克隆指定版本 git clone --branch v0.2.0 https://github.com/rag-web-ui/rag-web-ui.git cd rag-web-ui # 安装依赖(使用国内镜像源) npm config set registry https://registry.npmmirror.com npm install --no-audit # 构建生产包 npm run build # 打包dist目录 tar -czf rag-web-ui-v0.2.0-dist.tar.gz dist/
2.4.2 Nginx静态部署(国产OS兼容方案)

将rag-web-ui-v0.2.0-dist.tar.gz解压至/usr/share/nginx/html/rag-web-ui,配置Nginx:

server { listen 8080; server_name _; root /usr/share/nginx/html/rag-web-ui; index index.html; # 关键:反向代理到Ollama API(解决跨域) location /api/ { proxy_pass http://127.0.0.1:11434/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 防止敏感文件泄露 location ~ /\. { deny all; } }

参数说明:

  • location /api/将前端请求/api/chat代理到http://127.0.0.1:11434/api/chat,绕过浏览器同源策略;
  • deny all阻止访问.git、.env等隐藏文件,国产OS默认不开启SELinux,此配置为必要补充。

3. 多平台内网部署:Windows Server/Linus/国产OS三线并行,避开系统级陷阱

部署不是“复制粘贴命令”,而是理解每个平台的进程模型、权限机制、服务生命周期。同一套Ollama二进制,在Windows Server上可能因服务账户权限失败,在统信UOS上可能因glibc版本不兼容崩溃。本节给出三平台实测通过的最小可行配置,所有命令均在对应系统上逐行验证。

3.1 Windows Server部署:服务账户权限与防火墙规则必须显式声明

Windows Server的“服务”概念与Linux systemd本质不同:服务默认以LocalSystem账户运行,但Ollama需访问OLLAMA_MODELS目录,而LocalSystem对NTFS权限控制极严。必须显式创建服务账户并赋予权限。

3.1.1 Ollama服务安装(PowerShell管理员模式)
# 创建专用服务账户(避免使用Administrator) $svcUser = "OllamaSvc" $svcPass = "P@ssw0rd2024!" # 密码需符合复杂度策略 net user $svcUser $svcPass /add /expires:never net localgroup "Users" $svcUser /add # 安装Ollama服务(使用sc命令,非图形化安装包) sc create OllamaService binPath= "C:\Program Files\Ollama\ollama.exe serve" start= auto obj= "$svcUser" password= "$svcPass" sc description OllamaService "Ollama AI Service for DeepSeek" sc config OllamaService depend= Tcpip
3.1.2 环境变量与模型路径权限
# 设置系统级环境变量(影响所有服务) [Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0:11434", "Machine") [Environment]::SetEnvironmentVariable("OLLAMA_MODELS", "D:\ollama\models", "Machine") # 授予服务账户对模型目录的完全控制权 icacls "D:\ollama\models" /grant "$svcUser:(OI)(CI)F" /t # (OI)=对象继承 (CI)=容器继承 F=完全控制 /t=递归
3.1.3 防火墙规则(PowerShell一键生效)
# 允许Ollama端口(11434) New-NetFirewallRule -DisplayName "Ollama API" -Direction Inbound -Protocol TCP -LocalPort 11434 -Action Allow -Profile Domain,Private # 允许Lobe Chat端口(3010) New-NetFirewallRule -DisplayName "Lobe Chat Web" -Direction Inbound -Protocol TCP -LocalPort 3010 -Action Allow -Profile Domain,Private # 验证规则已启用 Get-NetFirewallRule -DisplayName "Ollama API" | Select-Object Name,Enabled,Profile

避坑:Windows Server常见问题排查

  1. 现象:sc start OllamaService后服务立即停止
    原因:OLLAMA_MODELS目录权限未授予服务账户,或路径含中文/空格
    解决:检查C:\Windows\System32\winevt\Logs\Application.evtx,搜索"Ollama"错误事件,按上述icacls命令修复权限

  2. 现象:Lobe Chat登录后空白,控制台报Failed to fetch http://localhost:11434/api/tags
    原因:IE安全设置阻止了localhost跨域请求(Windows Server默认启用)
    解决:运行inetcpl.cpl→ “安全”选项卡 → “本地Intranet” → “站点” → “高级” → 添加http://localhost:11434

  3. 现象:模型加载缓慢,CPU使用率仅30%
    原因:Windows Server默认电源计划为“平衡”,限制CPU性能
    解决:powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c(高性能计划)

3.2 Linux Server部署:国产OS(统信UOS/麒麟V10)的glibc与内核参数适配

国产Linux发行版的核心差异在于glibc版本(统信UOS V20 2303使用glibc 2.34,麒麟V10 SP1使用glibc 2.28)和内核参数(如vm.max_map_count)。Ollama v0.3.1要求glibc ≥2.32,因此麒麟V10需升级glibc(风险高),而统信UOS可直接运行。

3.2.1 统信UOS V20 2303部署(推荐)
# 验证glibc版本 ldd --version | grep "ldd" # 输出应为:ldd (GNU libc) 2.34 # 创建Ollama用户并配置 sudo useradd -r -s /bin/false -d /var/lib/ollama ollama sudo mkdir -p /data/ollama/models sudo chown -R ollama:ollama /data/ollama # 复制systemd服务文件(见2.2.2),启动服务 sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama # 关键:调整内核参数(解决Ollama mmap失败) echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
3.2.2 麒麟V10 SP1部署(glibc 2.28兼容方案)

麒麟V10 SP1的glibc 2.28低于Ollama v0.3.1要求,必须降级至Ollama v0.2.10(最后支持glibc 2.28的版本):

# 下载v0.2.10二进制(ARM64) wget https://github.com/ollama/ollama/releases/download/v0.2.10/ollama-linux-arm64 sudo cp ollama-linux-arm64 /usr/local/bin/ollama sudo chmod +x /usr/local/bin/ollama # systemd服务文件需修改(v0.2.10无OLLAMA_NUM_GPU参数) # /etc/systemd/system/ollama.service 中删除 Environment="OLLAMA_NUM_GPU=0" sudo systemctl daemon-reload sudo systemctl start ollama

避坑:国产OS常见问题排查

  1. 现象:ollama list返回空,journalctl -u ollama显示mmap failed: Cannot allocate memory
    原因:vm.max_map_count默认值65530,Ollama 14B模型需≥131072
    解决:执行echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

  2. 现象:Lobe Chat上传PDF后解析失败,日志报pdfminer.six not found
    原因:国产OS默认Python环境无pdfminer.six,且pip源不可用
    解决:提前下载离线wheel包(pdfminer.six-20231225-py3-none-any.whl),在内网执行pip install --find-links /path/to/wheel --no-index pdfminer.six

  3. 现象:Cherry Studio连接Ollama超时,但curl http://localhost:11434/api/tags正常
    原因:Cherry Studio默认使用HTTP/2,而国产OS内核对HTTP/2支持不完善
    解决:启动Cherry Studio时添加--http1参数:cherry-studio --http1 --ollama-host http://127.0.0.1:11434

3.3 macOS部署:Gatekeeper绕过与LaunchDaemon自启的合规写法

macOS的Gatekeeper和SIP机制对内网部署构成独特挑战:Ollama二进制被标记为“来自未识别开发者”,首次运行需手动允许;而SIP禁止修改/usr/bin,必须将二进制放在/opt/ollama。

3.3.1 Ollama安装与Gatekeeper豁免
# 下载二进制(非Homebrew,避免网络请求) curl -L https://github.com/ollama/ollama/releases/download/v0.3.1/ollama-darwin-universal.tar.gz -o ollama-darwin.tar.gz tar -xzf ollama-darwin.tar.gz sudo mkdir -p /opt/ollama sudo mv ollama /opt/ollama/ sudo chmod +x /opt/ollama/ollama # 绕过Gatekeeper(必须在GUI环境下执行) xattr -d com.apple.quarantine /opt/ollama/ollama # 验证 ls -l@ /opt/ollama/ollama # 应无com.apple.quarantine属性
3.3.2 LaunchDaemon配置(开机自启)

创建/Library/LaunchDaemons/ai.ollama.plist:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>ai.ollama</string> <key>ProgramArguments</key> <array> <string>/opt/ollama/ollama</string> <string>serve</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>EnvironmentVariables</key> <dict> <key>OLLAMA_HOST</key> <string>0.0.0.0:11434</string> <key>OLLAMA_MODELS</key> <string>/data/ollama/models</string> </dict> <key>StandardOutPath</key> <string>/var/log/ollama.log</string> <key>StandardErrorPath</key> <string>/var/log/ollama.log</string> </dict> </plist>

加载服务:

sudo launchctl load /Library/LaunchDaemons/ai.ollama.plist sudo launchctl start ai.ollama # 验证 sudo launchctl list | grep ollama

避坑:macOS常见问题排查

  1. 现象:launchctl start ai.ollama后ps aux | grep ollama无进程
    原因:plist文件权限错误(必须root:wheel,且644)
    解决:sudo chown root:wheel /Library/LaunchDaemons/ai.ollama.plist && sudo chmod 644 /Library/LaunchDaemons/ai.ollama.plist

  2. 现象:Ollama日志显示failed to open model: permission denied
    原因:SIP保护/System目录,但模型路径若设为/System/Volumes/Data/data/ollama/models则被拦截
    解决:模型路径必须设为/data/ollama/models(根目录下独立分区)或/Users/Shared/ollama/models

  3. 现象:Cherry Studio在macOS Sonoma上闪退
    原因:Sonoma对Metal加速要求更高,Ollama v0.3.1未优化
    解决:启动Ollama时禁用GPU:OLLAMA_NUM_GPU=0 /opt/ollama/ollama serve


4. RAG数据投喂:Cherry Studio离线工作流与向量库校验,拒绝“黑匣子式喂食”

RAG不是“把PDF拖进界面就完事”。内网知识库的核心价值在于可验证、可追溯、可审计——业务方必须能回答:“为什么这个答案来自第3份制度文件的第2页?”本节给出Cherry Studio离线投喂的完整闭环,包括文本提取质量校验、向量库一致性验证、以及当检索失败时的三层排查法。

4.1 Cherry Studio离线投喂:从PDF到向量库的七步确定性流程

Cherry Studio的“添加知识库”功能看似简单,但其底层调用pdfminer.six、python-docx、jieba等库,任一环节出错都会导致向量化失败。必须按顺序执行以下七步,并在每步后验证中间产物。

4.1.1 文档预处理:PDF/DOCX文本提取与清洗

PDF提取(使用pdfminer.six离线版):
下载pdfminer.six-20231225-py3-none-any.whl,在内网安装:

pip install --find-links /path/to/wheel --no-index pdfminer.six

提取文本并校验:

# 提取PDF文本(保留换行,便于后续分块) pdf2txt.py -p 1-10 -o doc1_page1_10.txt doc1.pdf # 检查提取质量:是否存在乱码、是否丢失表格文字 head -n 20 doc1_page1_10.txt | iconv -f GBK -t UTF-8 2>/dev/null || echo "编码异常,需用pdftotext替代"

DOCX提取(使用python-docx离线版):

pip install --find-links /path/to/wheel --no-index python-docx

Python脚本提取(关键:处理中文分节符):

from docx import Document import re def extract_docx_text(file_path): doc = Document(file_path) full_text = [] for para in doc.paragraphs: # 清洗Word特殊字符(如\u3000全角空格、\xa0不间断空格) text = re.sub(r'[\u3000\xa0]+', ' ', para.text.strip()) if text: # 跳过空段落 full_text.append(text) return '\n'.join(full_text) text = extract_docx_text('policy.docx') with open('policy_clean.txt', 'w', encoding='utf-8') as f: f.write(text)

参数说明:

  • re.sub(r'[\u3000\xa0]+', ' ', ...)将全角空格和不间断空格替换为标准空格,避免jieba分词断裂;
  • if text:过滤Word自动生成的空段落(如页眉页脚占位符)。
4.1.2 文本分块:语义分块而非固定长度,适配中文长文档

固定500字符分块在中文场景下效果极差(可能切断句子、割裂条款)。必须使用基于标点的语义分块:

import re def semantic_chunk(text, max_len=512): # 按中文句号、问号、感叹号、分号、冒号分割 sentences = re.split(r'(?<=[。!?;:])', text) chunks = [] current_chunk = "" for sent in sentences: if len(current_chunk + sent) <= max_len: current_chunk += sent else: if current_chunk: chunks.append(current_chunk.strip()) current_chunk = sent if current_chunk: chunks.append(current_chunk.strip()) return chunks # 读取清洗后文本 with open('policy_clean.txt', 'r', encoding='utf-8') as f: text = f.read() chunks = semantic_chunk(text, max_len=512) print(f"原文本{len(text)}字 → 分成{len(chunks)}块,平均每块{sum(len(c) for c in chunks)//len(chunks)}字")

逻辑说明:

  • (?<=[。!?;:])是正向先行断言,确保在标点后分割,不丢失标点;
  • max_len=512对应bge-m3模型的输入长度,超过将被截断。
4.1.3 向量模型导入:bge-m3-q8_0-bert_cpp离线加载

bge-m3是当前中文RAG效果最佳的开源Embedding模型,但其q8_0量化版需通过Ollama加载(非sentence-transformers):

# 下载bge-m3-q8_0-bert_cpp.gguf(Hugging Face: BAAI/bge-m3) # 创建Modelfile cat > Modelfile << 'EOF' FROM ./bge-m3-q8_0-bert_cpp.gguf PARAMETER num_ctx 8192 PARAMETER embedding 1 EOF <p> <a href="https://download.csdn.net/download/weixin_39682092/90404006" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

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

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

立即咨询