在实际项目中,将大语言模型(LLM)与个人或企业的私有数据结合,构建一个能精准回答特定领域问题的智能助手,是许多开发者和技术团队的核心需求。单纯依赖通用大模型的“通识”能力,往往无法满足对准确性、时效性和数据安全性的要求。RAG(检索增强生成)技术通过“检索相关文档片段 + 基于片段生成答案”的模式,为解决这一问题提供了成熟路径。然而,从概念到落地,中间隔着环境配置、服务部署、流程串联和问题排查等诸多环节。
本文将聚焦于使用 DeepSeek 和 RAGFlow 这两个开源工具,在本地环境搭建一个功能完整的个人知识库系统。DeepSeek 作为性能优异的开源大模型,提供了本地部署的可能;RAGFlow 则是一个基于 Docker 的开源 RAG 引擎,它简化了文档解析、向量化检索和问答流水线的构建。整个流程涉及 Docker 环境准备、DeepSeek 模型服务部署、RAGFlow 服务部署、知识库创建与文档上传,以及最终的问答测试。即使没有深厚的大模型或 Docker 背景,按照本文的步骤,也能在本地机器上构建起一个可运行、可查询的私有知识库原型,为后续更复杂的生产级应用打下基础。
1. 理解 RAG 工作流与核心组件选型
在开始动手部署之前,需要先厘清整个系统的工作原理以及为什么选择 DeepSeek 和 RAGFlow 这两个组件。这有助于在后续配置和排错时,能够清晰地知道每个环节在做什么。
1.1 RAG 的基本工作流程
RAG 并非一个单一的模型,而是一个系统架构。其核心思想是在生成答案前,先从外部知识库中检索出与问题最相关的文档片段,然后将这些片段和问题一起提交给大模型,指令模型“基于给定的上下文回答问题”。一个典型的 RAG 系统包含以下步骤:
- 文档处理与索引:将原始文档(如 PDF、Word、TXT)进行解析、分块,然后通过嵌入模型(Embedding Model)转换为向量,并存入向量数据库(Vector Database)建立索引。
- 问题检索:当用户提出问题时,同样使用嵌入模型将问题转换为向量,然后在向量数据库中搜索与之最相似的文档片段(即向量相似度计算)。
- 提示词构建与答案生成:将检索到的相关片段作为“上下文”,与用户问题一起构造成一个详细的提示词(Prompt),发送给大语言模型(LLM),由 LLM 生成最终答案。
这样做的好处是:答案来源于提供的文档,准确性更高;无需重新训练模型,成本低;可以随时通过更新文档库来更新知识。
1.2 为什么选择 DeepSeek 和 RAGFlow
在本地部署场景下,组件选型需要综合考虑性能、资源消耗、易用性和开源许可。
DeepSeek是一个系列的开源大语言模型,由深度求索公司发布。选择它的原因包括:
- 开源免费:模型权重可下载,允许商业使用,没有调用次数和费用限制。
- 性能强劲:在多项公开基准测试中,其最新版本(如 DeepSeek-V2)表现接近或超越部分闭源模型。
- 适合本地部署:提供了不同规模的模型(如 7B、16B、67B 等),用户可以根据自身硬件条件(主要是 GPU 显存)选择。对于个人知识库,7B 或 16B 的量化版本通常能在消费级显卡上流畅运行。
- API 兼容性:其提供的推理服务通常兼容 OpenAI API 格式,这极大方便了与上游应用(如 RAGFlow)的集成。
RAGFlow是一个开源的 RAG 引擎,其核心优势在于“开箱即用”和“深度可定制”:
- 文档解析能力强:内置 OCR 和文档解析能力,能较好地处理扫描件、表格、图表等复杂格式的文档。
- 可视化配置:提供了 Web 界面,可以直观地创建知识库、上传文档、配置检索策略和测试问答,降低了使用门槛。
- 流水线清晰:将文档解析、文本分块、向量化、检索、重排序、提示词构建等环节模块化,流程清晰。
- 支持多种后端:支持连接多种向量数据库(如 Milvus, DashVector)和 LLM(兼容 OpenAI API 的模型服务),架构灵活。
将两者结合,即用 RAGFlow 作为 RAG 流程的“大脑”和“调度中心”,用 DeepSeek 作为本地部署的“答案生成器”,可以构建一个完全自主可控的私有知识库系统。
2. 部署环境准备与依赖检查
本地部署的成功与否,很大程度上取决于前期环境是否准备妥当。本节将详细说明所需的软硬件环境,并提供详细的检查清单。
2.1 硬件与操作系统要求
- CPU:建议四核以上。文档解析和向量计算对 CPU 有一定要求。
- 内存:至少 16GB。运行 Docker 容器、向量数据库和大模型服务需要较多内存。
- 存储:至少 50GB 可用空间。用于存放 Docker 镜像、模型文件、向量索引和文档。
- GPU(非必需但强烈推荐):如果希望获得流畅的问答体验,建议配备 NVIDIA GPU。显存要求取决于部署的 DeepSeek 模型大小:
- DeepSeek-Coder-V2-Lite 7B 量化版:约 6GB 显存。
- DeepSeek-V2-Lite 16B 量化版:约 12GB 显存。
- 若无 GPU,也可使用 CPU 推理,但速度会慢很多。
- 操作系统:Linux (Ubuntu 20.04/22.04, CentOS 7/8) 或 macOS。Windows 用户建议使用 WSL2 (Windows Subsystem for Linux)。本文后续命令以 Linux/WSL2 环境为例。
2.2 核心软件依赖安装
2.2.1 Docker 与 Docker Compose
RAGFlow 官方推荐使用 Docker Compose 进行一键部署,因此必须先安装 Docker 和 Docker Compose。
安装 Docker:
# 以 Ubuntu 为例,使用官方脚本安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 将当前用户加入 docker 组,避免每次使用 sudo sudo usermod -aG docker $USER # 退出当前终端并重新登录,使组权限生效安装完成后,运行以下命令验证:
docker --version应输出类似
Docker version 24.0.7, build afdd53b的信息。安装 Docker Compose: Docker Compose 现在通常作为 Docker Desktop 的一部分,或可通过插件形式安装。对于 Linux,可以单独安装:
# 下载 Docker Compose 二进制文件 (请检查 GitHub 发布页获取最新版本) sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version应输出类似
Docker Compose version v2.24.0的信息。
2.2.2 NVIDIA 容器工具包(仅限 GPU 用户)
如果系统有 NVIDIA GPU 并打算用于模型推理,需要安装 NVIDIA Container Toolkit,使 Docker 容器能够调用 GPU。
# 添加 NVIDIA 容器仓库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker安装后,运行docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi测试。如果能看到 GPU 信息,则配置成功。
2.2.3 模型下载工具(可选但推荐)
DeepSeek 模型文件较大(数 GB 到数十 GB),建议使用git-lfs或huggingface-cli进行下载。
# 安装 git-lfs sudo apt-get install git-lfs git lfs install # 或者安装 huggingface-cli pip install huggingface-hub2.3 环境检查清单
在进入下一步之前,请对照下表检查你的环境:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| Docker 服务状态 | sudo systemctl is-active docker | active |
| Docker 命令权限 | docker ps(不加 sudo) | 列出容器或为空,不报权限错误 |
| Docker Compose 版本 | docker-compose --version | 显示版本号 (v2.x) |
| GPU 可用性 (如有) | docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi | 显示 GPU 详细信息 |
| 磁盘空间 | df -h / | 可用空间 > 50GB |
| 内存 | free -h | 可用内存 > 8GB |
3. 部署 DeepSeek 模型推理服务
我们将使用一个兼容 OpenAI API 的推理框架来部署 DeepSeek 模型,这样 RAGFlow 就可以像调用 OpenAI 一样调用我们本地的模型。这里以vLLM和Ollama两种常见方案为例。
3.1 方案一:使用 vLLM 部署(高性能,推荐)
vLLM 是一个高性能的 LLM 推理和服务库,尤其擅长注意力键值缓存的内存管理,吞吐量高。
拉取 Docker 镜像:
docker pull vllm/vllm-openai:latest下载 DeepSeek 模型权重: 前往 Hugging Face 模型库(例如
deepseek-ai/DeepSeek-V2-Lite-Chat),选择你需要的模型。使用git-lfs克隆或直接下载。# 示例:下载 DeepSeek-V2-Lite 16B 模型 (确保磁盘空间足够) git lfs install git clone https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite-Chat ./models/DeepSeek-V2-Lite-Chat注意:模型文件很大,下载可能需要很长时间。也可以先下载量化版本(如
-awq后缀)以减少显存占用。启动 vLLM OpenAI API 服务: 假设模型权重路径为
/path/to/your/models/DeepSeek-V2-Lite-Chat。docker run --runtime nvidia --gpus all \ -v /path/to/your/models:/models \ -p 8000:8000 \ --name deepseek-vllm \ vllm/vllm-openai:latest \ --model /models/DeepSeek-V2-Lite-Chat \ --served-model-name deepseek-chat \ --api-key token-abc123 \ --max-model-len 8192参数解释:
--runtime nvidia --gpus all:指定使用 NVIDIA GPU。-v ...:将主机上的模型目录挂载到容器内的/models。-p 8000:8000:将容器的 8000 端口映射到主机的 8000 端口。--model:指定容器内的模型路径。--served-model-name:服务发布的模型名称,调用时会用到。--api-key:设置一个 API 密钥,RAGFlow 连接时需要。--max-model-len:模型支持的最大上下文长度,根据模型实际情况设置。
验证服务: 服务启动后,使用
curl测试:curl http://localhost:8000/v1/models应该返回包含
deepseek-chat模型信息的 JSON。也可以测试聊天接口:curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer token-abc123" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "Hello, who are you?"}], "temperature": 0.7 }'如果收到包含模型自我介绍的回答,说明服务运行正常。
3.2 方案二:使用 Ollama 部署(更简易)
Ollama 提供了更简单的模型管理和运行方式,适合快速入门。
安装并启动 Ollama:
# 下载安装脚本并执行 curl -fsSL https://ollama.com/install.sh | sh # 启动 Ollama 服务 ollama serve &拉取并运行 DeepSeek 模型: Ollama 官方可能提供了 DeepSeek 模型,也可以从社区获取。例如:
# 拉取模型 (例如 deepseek-coder:6.7b) ollama pull deepseek-coder:6.7b # 以 OpenAI API 兼容模式运行 OLLAMA_HOST=0.0.0.0 ollama run deepseek-coder:6.7bOllama 默认的 OpenAI 兼容 API 端口是 11434。启动后,可以通过
http://localhost:11434/v1/chat/completions进行访问。
3.3 模型服务配置要点
无论使用哪种方案,最终都是提供一个兼容 OpenAI API 的 HTTP 端点。你需要记录以下信息,用于后续配置 RAGFlow:
- API Base URL:如
http://<你的服务器IP>:8000/v1或http://localhost:11434/v1。 - API Key:如果服务端设置了密钥(如 vLLM 的
--api-key),则需要记录。 - Model Name:服务发布的模型名称,如
deepseek-chat。
4. 部署与配置 RAGFlow
RAGFlow 提供了官方的 Docker Compose 文件,可以一键启动所有依赖服务(包括 MySQL、Redis、向量数据库等)。
4.1 获取 RAGFlow 部署文件
克隆仓库或下载 Compose 文件:
git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker或者,直接下载
docker-compose.yml文件。检查并修改环境变量配置: 在
docker目录下,通常有一个.env或config文件用于配置。关键配置项包括:HTTP_PORT:RAGFlow Web 界面的访问端口,默认为 9380。- 数据库、Redis、向量数据库的连接信息(通常使用默认值即可,因为它们在 Docker 网络内互通)。
- 最重要的:LLM 的配置。需要找到配置 LLM 的地方,将其指向我们刚刚部署的 DeepSeek 服务。
以常见的配置为例,你可能需要编辑
docker-compose.yml或同级目录下的一个配置文件。查找LLM_API_KEY,LLM_API_BASE,LLM_MODEL等环境变量。如果没有,则需要在 RAGFlow 启动后,通过其 Web 界面进行配置。
4.2 启动 RAGFlow 服务
在包含docker-compose.yml的目录下执行:
docker-compose up -d-d参数表示在后台运行。首次运行会拉取多个镜像(RAGFlow server, MySQL, Redis, Milvus 等),需要一定时间。可以使用docker-compose logs -f查看启动日志。
当看到所有容器状态均为Up时,表示启动成功:
docker-compose ps4.3 通过 Web 界面配置 LLM
打开浏览器,访问
http://<你的服务器IP>:9380。首次访问会进入初始化页面,可能需要设置管理员账号密码。登录后,进入系统设置或模型管理页面。这里需要添加一个“自定义模型”或“本地模型”。
填写配置信息:
- 模型名称:自定义,如
My-DeepSeek。 - 模型类型:选择
OpenAI或OpenAI-Compatible。 - API Base URL:填写你的 DeepSeek 服务地址,如
http://host.docker.internal:8000/v1。注意:如果 RAGFlow 运行在 Docker 容器内,而 DeepSeek 服务运行在宿主机,不能直接用localhost。在 Linux/macOS 的 Docker 桌面版或使用特定网络模式下,可以使用host.docker.internal指向宿主机。在纯 Linux 环境下,可能需要使用宿主机的实际 IP 地址,并确保防火墙开放了相应端口。 - API Key:填写在启动 vLLM 时设置的
--api-key(如token-abc123)。如果没设置或使用 Ollama 默认无密钥,可以留空或填dummy。 - 模型名称:填写 DeepSeek 服务发布的模型名,如
deepseek-chat。 - 上下文长度:根据模型能力填写,如
8192。
- 模型名称:自定义,如
保存配置,并测试连接。如果配置正确,RAGFlow 会提示连接成功。
4.4 常见部署问题排查
| 问题现象 | 可能原因 | 检查与解决 |
|---|---|---|
| RAGFlow 容器启动失败 | 端口冲突、镜像拉取失败、权限不足 | 1.docker-compose logs <服务名>查看具体错误。2. 检查 9380、3306(MySQL)、6379(Redis)、19530(Milvus)端口是否被占用。 3. 确认 Docker 有足够权限和资源。 |
| Web 界面无法访问 | 防火墙未开放端口、容器未成功启动 | 1.docker-compose ps确认所有服务状态为Up。2. 在服务器本机用 curl http://localhost:9380测试。3. 检查服务器安全组/防火墙规则,放行 9380 端口。 |
| LLM 连接测试失败 | API Base URL 或网络不通 | 1. 在 RAGFlow 容器内执行curl <你的 DeepSeek API URL>/models,看是否能通。2. 确保 DeepSeek 服务正在运行 ( docker ps或ollama list)。3. 正确使用 host.docker.internal或宿主机 IP。 |
| 上传文档后处理失败 | 解析器依赖缺失、内存不足 | 1. 查看 RAGFlow 服务日志,看是否有 OCR 或解析错误。 2. 确保 Docker 容器分配了足够内存(可在 docker-compose.yml中配置mem_limit)。3. 尝试上传一个简单的纯文本文件测试。 |
5. 构建与测试你的第一个知识库
当 DeepSeek 服务和 RAGFlow 都正常运行并成功连接后,就可以开始构建知识库了。
5.1 创建知识库
- 在 RAGFlow Web 界面,点击“知识库” -> “新建知识库”。
- 填写知识库名称、描述,并选择嵌入模型。RAGFlow 内置了
bge-large-zh等模型,对于中文文档效果较好,保持默认即可。也可以选择其他兼容的嵌入模型。 - 配置文本分块(Chunking)策略:
- 分块大小:通常设置在 256-1024 个字符(或 token)之间。太小会丢失上下文,太大会降低检索精度。对于普通文档,512 是一个不错的起点。
- 重叠大小:相邻文本块之间重叠的字符数,通常为分块大小的 10%-20%。这有助于避免一个答案被切分到两个块边界。
- 配置检索策略:
- 检索器类型:通常选择“向量检索”。
- Top K:每次检索返回的最相关片段数量,通常设为 3-5。
- 重排序(Rerank):这是一个可选但能提升精度的步骤。如果启用,检索到的 Top K 个片段会经过一个更精细的排序模型再次排序,将最相关的放在前面。如果硬件资源允许,建议开启。
5.2 上传与处理文档
- 在创建好的知识库中,点击“上传文档”。
- 支持多种格式:PDF、Word、PPT、TXT、Markdown,甚至图片(需 OCR)。
- 上传后,RAGFlow 会自动进行以下流水线处理:
- 解析:提取文档中的文本、表格、图片文字。
- 分块:按照之前设定的策略,将文本切割成片段。
- 向量化:使用嵌入模型将每个文本片段转换为向量。
- 入库:将向量和元数据存入向量数据库(如 Milvus)。
- 你可以在“文档”列表中查看处理状态。状态变为“已索引”后,文档就可供检索了。
5.3 进行问答测试
- 进入知识库的“对话”或“测试”页面。
- 在输入框中提问。问题应基于你上传的文档内容。
- 观察回答。一个运行良好的 RAG 系统,其回答应该:
- 准确:答案内容来源于上传的文档。
- 可追溯:回答下方通常会附上“参考来源”,点击可以定位到原文片段。这是 RAG 区别于普通聊天模型的关键特征。
- 自然:语言流畅,像是基于文档内容组织的答案,而不是生硬地拼接片段。
示例测试:
- 上传文档:一份关于“项目管理办法”的 PDF。
- 提问:“项目评审会议需要哪些人参加?”
- 期望:回答应列出文档中规定的参会人员角色,并附上对应的原文出处。
5.4 优化检索效果
如果发现回答不准确或未找到相关信息,可以从以下几个方面优化:
- 调整分块策略:对于结构严谨的文档(如 API 文档),可以适当增大分块大小;对于内容松散的文档,可以减小分块大小。
- 优化提问方式:尝试使用更接近文档原文表述的关键词进行提问。
- 检查文档解析质量:在文档详情页,查看解析出的原始文本是否正确,特别是表格和图片中的文字。
- 启用重排序:如果之前未启用,可以开启重排序功能,它能有效提升答案相关性。
- 调整 Top K 值:适当增加 Top K 值,让模型看到更多候选片段,但可能会引入噪声。
6. 生产环境考量与最佳实践
将本地知识库用于个人学习或 demo 验证是一回事,若要用于团队协作或轻度生产环境,则需要考虑更多因素。
6.1 安全性加固
- 访问控制:RAGFlow 自带用户角色管理。务必为不同使用者创建账号并分配适当的权限(如只读、可上传、可管理)。
- API 密钥管理:DeepSeek 服务如果设置了 API Key,应妥善保管。不要在代码或配置文件中硬编码,可以考虑使用环境变量或密钥管理服务。
- 网络隔离:将 DeepSeek 和 RAGFlow 服务部署在内网,仅通过反向代理(如 Nginx)暴露必要的 Web 界面端口,并配置 HTTPS。
- 文档审核:建立文档上传前的审核机制,避免错误或敏感信息进入知识库。
6.2 性能与稳定性
- 资源监控:使用
docker stats或nvidia-smi监控容器和 GPU 的资源使用情况(CPU、内存、显存)。为关键容器(如 DeepSeek 服务)设置资源限制,防止其耗尽主机资源。# 在 docker run 命令中限制资源 --memory 16g --memory-swap 20g --cpus 4 - 模型量化:如果 GPU 显存紧张,务必使用量化版本的 DeepSeek 模型(如 AWQ, GPTQ 量化),这可以大幅降低显存占用,仅轻微损失精度。
- 服务高可用:对于重要服务,可以考虑使用 Docker Swarm 或 Kubernetes 进行容器编排,实现故障自动恢复和水平扩展。至少应为数据库(MySQL, Milvus)配置持久化存储卷,防止数据丢失。
# 在 docker-compose.yml 中为 Milvus 配置卷 volumes: - milvus_data:/var/lib/milvus - 日志与告警:配置 Docker 容器的日志驱动,将日志集中收集到 ELK 或 Loki 等系统。对服务健康状态(如 HTTP 端口探活)设置告警。
6.3 知识库维护
- 版本管理:知识库文档会更新。RAGFlow 支持文档更新后重新索引。建议建立文档版本管理制度,并在上传新版本后,触发对旧文档的删除和重新索引操作。
- 定期评估:定期用一组标准问题测试知识库,评估回答的准确率和相关性。根据结果调整分块、检索策略或考虑更新嵌入模型。
- 冷门知识处理:对于极少被查询的冷门知识,可以考虑将其存入传统数据库进行关键词检索,与 RAG 形成互补。
6.4 扩展方向
- 多模态:RAGFlow 支持图片 OCR。可以探索上传带有图表、示意图的文档,构建能回答“根据某张图说明...”问题的知识库。
- 联网搜索:结合 Tavily、Serper 等工具,在本地知识库无法回答时,自动进行网络搜索并将结果补充到上下文中。
- Agent 集成:将本地知识库作为工具,接入到 LangChain、AutoGen 等智能体框架中,让 Agent 在规划任务时能够主动查询知识库。
- 更复杂的流水线:RAGFlow 支持自定义推理流程。可以尝试在检索后加入更复杂的处理,如调用多个模型进行验证、总结等。
搭建本地知识库的过程,本质上是将数据、算法和工程进行有机结合。从环境准备、服务部署、配置对接到效果调优,每一步都可能遇到问题。关键是要理解每个组件的职责和它们之间的交互协议(如 OpenAI API)。当问答不准确时,要有清晰的排查思路:是文档没解析好?分块不合理?检索策略不对?还是大模型本身的理解或生成有问题?通过日志、中间结果(如检索到的片段)一步步定位,才能让这个系统真正为你所用。