Skip to content

私有化部署与推理选型:数据不出域怎么做 ​

1. 本节产出 ​

一份私有化部署方案:什么必须私有化、什么可以走公有云、推理引擎怎么选、GPU 资源怎么估算,以及一个用 Ollama 跑通的最小 PoC。

2. 前置依赖 ​

3. 为什么「全私有化」通常是过度要求 ​

客户说「数据不出域」,第一反应往往是「全部本地部署」。但拆开看:

组件是否含敏感数据必须私有化吗
知识库文档✅ 含是
向量库✅ 含是
Embedding 模型⚠️ 处理时短暂接触建议是
生成模型(LLM)⚠️ 处理时短暂接触取决于合规要求
Agent 编排代码❌ 不含否
前端❌ 不含否

关键认知:数据「出域」的风险发生在「发送给外部模型」的那一刻。所以核心是「不要让敏感原文离开内网」,而不是「所有软件都装在本地」。

3.1 三种部署形态 ​

形态做法适用成本
纯公有云全部走厂商 API无合规约束最低
混合(推荐)检索/灌库/Embedding 本地,生成走云端数据在内网、可接受 prompts 外发中
全私有模型也本地部署严格合规高

混合形态是最常见的选择:知识库和向量化在内网,只有「检索出的片段 + 问题」发给云端模型。风险可控,成本远低于全私有。

但要注意:混合形态下,检索出的片段仍然会外发。如果片段本身包含敏感原文,等于还是出域了。这一点必须在合规评审时说清楚,不能含糊。

4. 核心原理 ​

4.1 推理引擎选型 ​

引擎特点适用
Ollama极简部署、模型库丰富PoC / 小规模(推荐起步)
vLLM高吞吐、PagedAttention、生产级生产首选
Xinference多模型管理、支持 Embedding/Rerank需要统一管理时
TensorRT-LLM极致性能、NVIDIA 专属性能极致优化
llama.cppCPU/边缘设备无 GPU 场景

推荐路径:先用 Ollama 验证效果,再用 vLLM 上生产。

4.2 模型选型(开源) ​

用途推荐方向显存需求(参考)
生成(7B 级)Qwen / Llama 系列16GB+
生成(14B~32B)效果明显更好40GB+
EmbeddingBGE-M3 / bge-large-zh4GB+
Rerankbge-reranker4GB+

中文场景优先选国产开源模型(Qwen 系列等),中文能力明显优于同规模的多语言模型。

4.3 GPU 资源估算 ​

估算公式(粗略):
  显存 ≈ 参数量(B) × 2(FP16)× 1.2(开销)
  
  7B  模型 → 约 17GB → 单卡 A10(24GB) 或 4090(24GB)
  14B 模型 → 约 34GB → 单卡 A100(40GB) 或双卡
  32B 模型 → 约 77GB → 双卡 A100(80GB)

并发能力:
  7B + vLLM + A10:约 20-50 并发(取决于输入输出长度)

关键指标是「并发下每用户 Token 生成速度」,不是峰值吞吐。用户体验的底线大约是 20 tokens/s/用户。

4.4 私有化的真实成本 ​

成本项说明量级
GPU 硬件一次性单卡数万至数十万
机房/电力/运维持续显著
人力需要懂推理服务的人常被低估
模型升级换模型要重新评估、重新部署持续投入

对比公有云:按量付费的话,日均 100 万 Token 的场景,私有化的回本周期通常在 1-2 年。低于这个量级,公有云更划算。

决策时要算这笔账,而不是「私有化感觉更安全」。

5. 代码走查 ​

5.1 Ollama 快速起 PoC ​

yaml
# docker-compose.private.yml
services:
  ollama:
    image: ollama/ollama:latest
    ports: ["11434:11434"]
    volumes:
      - ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

  ollama-webui:
    image: ghcr.io/open-webui/open-webui:main
    ports: ["3000:8080"]
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434

volumes:
  ollama-data:
bash
# 拉取并运行模型
docker exec -it ollama ollama pull qwen2.5:7b
docker exec -it ollama ollama run qwen2.5:7b "你好"

5.2 Spring AI 接本地 Ollama ​

xml
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
yaml
spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen2.5:7b
          temperature: 0.7

关键收益:业务代码零改动。ChatModel 接口屏蔽了底层是云端还是本地——这就是 01-03 做适配层的价值。

5.3 混合部署的路由配置 ​

yaml
ai:
  routing:
    # 检索与向量化走本地
    embedding:
      provider: local
      base-url: http://localhost:11434
      model: bge-m3
    rerank:
      provider: local
    # 生成按租户策略:合规租户走本地,其余走云端
    chat:
      providers:
        - name: local-qwen
          base-url: http://localhost:11434
          model: qwen2.5:14b
          tenants: [finance, healthcare]      # 严格合规租户
        - name: cloud-deepseek
          base-url: https://api.deepseek.com
          model: deepseek-chat
          tenants: ["*"]                      # 其余

按租户路由到不同部署是混合方案的核心能力。它让「合规要求高的租户用本地、其余用云端」成为可配置的策略。

5.4 私有化下的向量库 ​

yaml
services:
  pgvector:
    image: pgvector/pgvector:pg16     # 同样可本地部署
  # 或 Milvus(规模大时)

向量库和 Embedding 模型必须一起私有化,否则文档内容(或至少是向量)仍然外发。

6. 跑起来 ​

bash
git checkout ch04-05-private
docker compose -f docker-compose.private.yml up -d
docker exec -it ollama ollama pull qwen2.5:7b

# 验证本地推理
curl http://localhost:11434/api/generate -d '{
  "model":"qwen2.5:7b","prompt":"用一句话介绍 Spring Boot","stream":false}'

# 通过应用调用(业务代码无感知)
curl -X POST http://localhost:8080/api/chat -d '{"q":"介绍 Spring Boot"}'
检查项通过标准
本地推理可用Ollama 返回正常回答
业务零改动切换 provider 不改业务代码
混合路由合规租户走本地,其余走云端
性能基线记录 tokens/s,确认满足体验底线
断网可用断开外网后本地链路仍能工作

「断网可用」是私有化的关键验收:断开外网后跑一遍完整问答,验证没有隐藏的外部依赖。

7. 生产避坑 ​

  1. 混合部署不等于合规。检索出的片段仍会发给云端模型,如果片段含敏感原文,数据实质上是出域了。这一点必须在方案里写清楚,让合规方知情决定,不能默认「混合就是合规」。
  2. 私有化的隐性成本在人力,不在硬件。GPU 是一次性支出,但推理服务的调优、模型升级、故障排查需要专人。没有懂推理服务的人,私有化会变成运维灾难。
  3. 先算回本周期再决定。按量付费 vs 买卡的平衡点通常在日均百万 Token 以上、且用量稳定的场景。用量小或波动大时,私有化大概率不划算。决策要有数字支撑,不能凭「感觉更安全」。

8. 延伸与锚点 ​