1. 项目背景与核心价值
最近在帮客户部署一套完全离线的智能问答系统时,选择了MaxKB作为知识库前端,搭配Ollama管理的本地大模型。这种组合特别适合对数据隐私要求高的场景,比如企业内部知识管理、涉密资料查询等。整个部署过程踩了不少坑,今天就把这套方案的完整实施过程记录下来。
离线部署大模型最大的优势就是数据不出内网,完全规避了API调用可能带来的隐私泄露风险。MaxKB提供了友好的知识库管理界面,而Ollama则让大模型的本地部署变得异常简单。两者配合使用,相当于拥有了一个完全自主可控的ChatGPT企业版。
2. 环境准备与基础配置
2.1 系统环境要求
建议使用CentOS 7.9最小化安装,配置要求根据模型大小而定:
- 7B参数模型:至少16GB内存 + 20GB磁盘空间
- 13B参数模型:32GB内存 + 40GB磁盘空间
- 显卡不是必须的,但如果有NVIDIA GPU(推荐RTX 3090以上)可以显著提升推理速度
重要提示:部署前务必关闭SELinux并配置防火墙规则,否则后续服务可能无法正常通信
# 永久关闭SELinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0 # 防火墙放行必要端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent # MaxKB默认端口 firewall-cmd --zone=public --add-port=11434/tcp --permanent # Ollama默认端口 firewall-cmd --reload2.2 基础依赖安装
需要先安装一些基础工具和开发环境:
yum install -y git docker docker-compose make gcc gcc-c++ python3-devel systemctl enable docker && systemctl start dockerPython环境建议使用Miniconda管理:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 echo 'export PATH="/opt/miniconda3/bin:$PATH"' >> /etc/profile source /etc/profile3. Ollama部署与模型管理
3.1 Ollama服务安装
Ollama提供了非常简洁的安装方式:
curl -fsSL https://ollama.com/install.sh | sh安装完成后启动服务:
systemctl enable ollama systemctl start ollama验证服务状态:
curl http://localhost:11434 # 正常应返回Ollama的版本信息3.2 大模型下载与加载
Ollama支持的主流模型包括Llama2、Mistral等。这里以中文优化版的Llama2-Chinese-13B为例:
ollama pull llama2-chinese:13b模型下载完成后会自动保存在~/.ollama/models目录。可以通过以下命令测试模型运行:
ollama run llama2-chinese:13b "你好"模型下载可能耗时较长(13B模型约25GB),建议使用screen或tmux保持会话
3.3 性能优化配置
编辑Ollama配置文件/etc/ollama/config.json:
{ "num_ctx": 4096, "num_gpu_layers": 32, "num_thread": 8 }关键参数说明:
num_ctx:上下文长度,越大能记住的对话历史越多num_gpu_layers:使用GPU加速的层数(如有GPU)num_thread:CPU线程数,建议设置为物理核心数
4. MaxKB知识库系统部署
4.1 Docker方式部署MaxKB
MaxKB提供了官方Docker镜像,部署非常方便:
mkdir -p /opt/maxkb && cd /opt/maxkb cat > docker-compose.yml <<EOF version: '3' services: maxkb: image: 1panel/maxkb container_name: maxkb ports: - "8080:8080" volumes: - ./data:/var/lib/postgresql/data environment: - MAXKB_PORT=8080 restart: always EOF docker-compose up -d等待约2分钟后,访问http://服务器IP:8080即可进入安装向导。
4.2 初始配置步骤
- 设置管理员账号(建议使用复杂密码)
- 数据库选择PostgreSQL(默认)
- 在"模型设置"中选择"Ollama"
- 填写Ollama地址:
http://localhost:11434 - 选择已下载的模型(如llama2-chinese:13b)
4.3 知识库创建与管理
创建知识库的实用技巧:
- 使用Markdown格式上传文档,保留更好的格式
- 对于长文档,建议拆分为多个小于500KB的文件
- 启用"自动分段"功能,设置分段长度为512 tokens
批量导入脚本示例:
import os from maxkb_api import MaxKBClient client = MaxKBClient(base_url="http://localhost:8080", username="admin", password="your_password") knowledge_base_id = client.create_knowledge_base("技术文档") for file in os.listdir("/path/to/docs"): if file.endswith(".md"): client.upload_document(knowledge_base_id, f"/path/to/docs/{file}", file_type="markdown")5. 系统集成与API调用
5.1 MaxKB API对接
MaxKB提供了完善的REST API,获取API Key的位置:
- 登录后台 -> 个人中心 -> API密钥
- 点击"生成新密钥"
基础查询示例:
curl -X POST "http://localhost:8080/api/v1/chat/completions" \ -H "Authorization: Bearer your_api_key" \ -H "Content-Type: application/json" \ -d '{ "query": "如何配置防火墙规则", "knowledge_base_id": "your_kb_id" }'5.2 与企业微信/钉钉集成
通过Python中间件实现机器人对接:
from flask import Flask, request, jsonify import requests app = Flask(__name__) MAXKB_URL = "http://localhost:8080/api/v1/chat/completions" API_KEY = "your_maxkb_api_key" @app.route('/wecom', methods=['POST']) def wecom_bot(): data = request.json query = data.get("text", "").strip() response = requests.post( MAXKB_URL, headers={"Authorization": f"Bearer {API_KEY}"}, json={"query": query} ) return jsonify({ "msgtype": "text", "text": {"content": response.json()["answer"]} }) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)6. 运维监控与问题排查
6.1 服务监控方案
推荐使用Prometheus+Grafana监控关键指标:
- Ollama监控指标(添加到prometheus.yml):
scrape_configs: - job_name: 'ollama' static_configs: - targets: ['localhost:11434']- MaxKB监控看板应包含:
- 请求响应时间
- 知识库命中率
- 错误率统计
- Token消耗量
6.2 常见问题解决方案
问题1:模型响应速度慢
- 检查
num_thread参数是否设置正确 - 如有GPU,确认CUDA版本与驱动兼容
- 降低
num_ctx值(建议从2048开始测试)
问题2:MaxKB上传文档失败
- 检查文件大小(建议<5MB)
- 确认文件编码为UTF-8
- 查看Docker日志:
docker logs maxkb
问题3:Ollama内存不足
- 添加swap空间:
dd if=/dev/zero of=/swapfile bs=1G count=16 chmod 600 /swapfile mkswap /swapfile swapon /swapfile- 在/etc/fstab中添加:
/swapfile swap swap defaults 0 0
7. 安全加固建议
- HTTPS配置:
# 使用Let's Encrypt获取证书 yum install -y certbot certbot certonly --standalone -d your.domain.com # 配置Nginx反向代理 server { listen 443 ssl; server_name your.domain.com; ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; } }- 访问控制:
- 配置MaxKB的IP白名单
- 定期轮换API密钥
- 启用MaxKB的审计日志功能
- 数据备份方案:
# 每日备份知识库 0 2 * * * docker exec maxkb pg_dump -U postgres maxkb > /backups/maxkb_$(date +\%Y\%m\%d).sql这套方案在我们多个客户的生产环境中已经稳定运行超过半年。最大的体会是:离线模型虽然响应速度不如云服务,但在数据安全敏感的场景下是不可替代的。建议初次部署时从7B模型开始测试,熟悉后再升级到更大模型。