基于DeepSeek与RAGFlow的本地私有知识库搭建实战
2026/9/4 0:16:18 网站建设 项目流程

在实际项目中,将大语言模型(LLM)与个人或企业的私有数据结合,构建一个能精准回答特定领域问题的智能助手,是许多开发者和技术团队的核心需求。单纯依赖通用大模型的“通识”能力,往往无法满足对准确性、时效性和数据安全性的要求。RAG(检索增强生成)技术通过“检索相关文档片段 + 基于片段生成答案”的模式,为解决这一问题提供了成熟路径。然而,从概念到落地,中间隔着环境配置、服务部署、流程串联和问题排查等诸多环节。

本文将聚焦于使用 DeepSeek 和 RAGFlow 这两个开源工具,在本地环境搭建一个功能完整的个人知识库系统。DeepSeek 作为性能优异的开源大模型,提供了本地部署的可能;RAGFlow 则是一个基于 Docker 的开源 RAG 引擎,它简化了文档解析、向量化检索和问答流水线的构建。整个流程涉及 Docker 环境准备、DeepSeek 模型服务部署、RAGFlow 服务部署、知识库创建与文档上传,以及最终的问答测试。即使没有深厚的大模型或 Docker 背景,按照本文的步骤,也能在本地机器上构建起一个可运行、可查询的私有知识库原型,为后续更复杂的生产级应用打下基础。

1. 理解 RAG 工作流与核心组件选型

在开始动手部署之前,需要先厘清整个系统的工作原理以及为什么选择 DeepSeek 和 RAGFlow 这两个组件。这有助于在后续配置和排错时,能够清晰地知道每个环节在做什么。

1.1 RAG 的基本工作流程

RAG 并非一个单一的模型,而是一个系统架构。其核心思想是在生成答案前,先从外部知识库中检索出与问题最相关的文档片段,然后将这些片段和问题一起提交给大模型,指令模型“基于给定的上下文回答问题”。一个典型的 RAG 系统包含以下步骤:

  1. 文档处理与索引:将原始文档(如 PDF、Word、TXT)进行解析、分块,然后通过嵌入模型(Embedding Model)转换为向量,并存入向量数据库(Vector Database)建立索引。
  2. 问题检索:当用户提出问题时,同样使用嵌入模型将问题转换为向量,然后在向量数据库中搜索与之最相似的文档片段(即向量相似度计算)。
  3. 提示词构建与答案生成:将检索到的相关片段作为“上下文”,与用户问题一起构造成一个详细的提示词(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。

  1. 安装 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的信息。

  2. 安装 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-lfshuggingface-cli进行下载。

# 安装 git-lfs sudo apt-get install git-lfs git lfs install # 或者安装 huggingface-cli pip install huggingface-hub

2.3 环境检查清单

在进入下一步之前,请对照下表检查你的环境:

检查项命令预期结果
Docker 服务状态sudo systemctl is-active dockeractive
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 一样调用我们本地的模型。这里以vLLMOllama两种常见方案为例。

3.1 方案一:使用 vLLM 部署(高性能,推荐)

vLLM 是一个高性能的 LLM 推理和服务库,尤其擅长注意力键值缓存的内存管理,吞吐量高。

  1. 拉取 Docker 镜像

    docker pull vllm/vllm-openai:latest
  2. 下载 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后缀)以减少显存占用。

  3. 启动 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:模型支持的最大上下文长度,根据模型实际情况设置。
  4. 验证服务: 服务启动后,使用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 提供了更简单的模型管理和运行方式,适合快速入门。

  1. 安装并启动 Ollama

    # 下载安装脚本并执行 curl -fsSL https://ollama.com/install.sh | sh # 启动 Ollama 服务 ollama serve &
  2. 拉取并运行 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.7b

    Ollama 默认的 OpenAI 兼容 API 端口是 11434。启动后,可以通过http://localhost:11434/v1/chat/completions进行访问。

3.3 模型服务配置要点

无论使用哪种方案,最终都是提供一个兼容 OpenAI API 的 HTTP 端点。你需要记录以下信息,用于后续配置 RAGFlow:

  • API Base URL:如http://<你的服务器IP>:8000/v1http://localhost:11434/v1
  • API Key:如果服务端设置了密钥(如 vLLM 的--api-key),则需要记录。
  • Model Name:服务发布的模型名称,如deepseek-chat

4. 部署与配置 RAGFlow

RAGFlow 提供了官方的 Docker Compose 文件,可以一键启动所有依赖服务(包括 MySQL、Redis、向量数据库等)。

4.1 获取 RAGFlow 部署文件

  1. 克隆仓库或下载 Compose 文件

    git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker

    或者,直接下载docker-compose.yml文件。

  2. 检查并修改环境变量配置: 在docker目录下,通常有一个.envconfig文件用于配置。关键配置项包括:

    • 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 ps

4.3 通过 Web 界面配置 LLM

  1. 打开浏览器,访问http://<你的服务器IP>:9380。首次访问会进入初始化页面,可能需要设置管理员账号密码。

  2. 登录后,进入系统设置或模型管理页面。这里需要添加一个“自定义模型”或“本地模型”。

  3. 填写配置信息:

    • 模型名称:自定义,如My-DeepSeek
    • 模型类型:选择OpenAIOpenAI-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
  4. 保存配置,并测试连接。如果配置正确,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 psollama list)。
3. 正确使用host.docker.internal或宿主机 IP。
上传文档后处理失败解析器依赖缺失、内存不足1. 查看 RAGFlow 服务日志,看是否有 OCR 或解析错误。
2. 确保 Docker 容器分配了足够内存(可在docker-compose.yml中配置mem_limit)。
3. 尝试上传一个简单的纯文本文件测试。

5. 构建与测试你的第一个知识库

当 DeepSeek 服务和 RAGFlow 都正常运行并成功连接后,就可以开始构建知识库了。

5.1 创建知识库

  1. 在 RAGFlow Web 界面,点击“知识库” -> “新建知识库”。
  2. 填写知识库名称、描述,并选择嵌入模型。RAGFlow 内置了bge-large-zh等模型,对于中文文档效果较好,保持默认即可。也可以选择其他兼容的嵌入模型。
  3. 配置文本分块(Chunking)策略
    • 分块大小:通常设置在 256-1024 个字符(或 token)之间。太小会丢失上下文,太大会降低检索精度。对于普通文档,512 是一个不错的起点。
    • 重叠大小:相邻文本块之间重叠的字符数,通常为分块大小的 10%-20%。这有助于避免一个答案被切分到两个块边界。
  4. 配置检索策略
    • 检索器类型:通常选择“向量检索”。
    • Top K:每次检索返回的最相关片段数量,通常设为 3-5。
    • 重排序(Rerank):这是一个可选但能提升精度的步骤。如果启用,检索到的 Top K 个片段会经过一个更精细的排序模型再次排序,将最相关的放在前面。如果硬件资源允许,建议开启。

5.2 上传与处理文档

  1. 在创建好的知识库中,点击“上传文档”。
  2. 支持多种格式:PDF、Word、PPT、TXT、Markdown,甚至图片(需 OCR)。
  3. 上传后,RAGFlow 会自动进行以下流水线处理:
    • 解析:提取文档中的文本、表格、图片文字。
    • 分块:按照之前设定的策略,将文本切割成片段。
    • 向量化:使用嵌入模型将每个文本片段转换为向量。
    • 入库:将向量和元数据存入向量数据库(如 Milvus)。
  4. 你可以在“文档”列表中查看处理状态。状态变为“已索引”后,文档就可供检索了。

5.3 进行问答测试

  1. 进入知识库的“对话”或“测试”页面。
  2. 在输入框中提问。问题应基于你上传的文档内容。
  3. 观察回答。一个运行良好的 RAG 系统,其回答应该:
    • 准确:答案内容来源于上传的文档。
    • 可追溯:回答下方通常会附上“参考来源”,点击可以定位到原文片段。这是 RAG 区别于普通聊天模型的关键特征。
    • 自然:语言流畅,像是基于文档内容组织的答案,而不是生硬地拼接片段。

示例测试

  • 上传文档:一份关于“项目管理办法”的 PDF。
  • 提问:“项目评审会议需要哪些人参加?”
  • 期望:回答应列出文档中规定的参会人员角色,并附上对应的原文出处。

5.4 优化检索效果

如果发现回答不准确或未找到相关信息,可以从以下几个方面优化:

  1. 调整分块策略:对于结构严谨的文档(如 API 文档),可以适当增大分块大小;对于内容松散的文档,可以减小分块大小。
  2. 优化提问方式:尝试使用更接近文档原文表述的关键词进行提问。
  3. 检查文档解析质量:在文档详情页,查看解析出的原始文本是否正确,特别是表格和图片中的文字。
  4. 启用重排序:如果之前未启用,可以开启重排序功能,它能有效提升答案相关性。
  5. 调整 Top K 值:适当增加 Top K 值,让模型看到更多候选片段,但可能会引入噪声。

6. 生产环境考量与最佳实践

将本地知识库用于个人学习或 demo 验证是一回事,若要用于团队协作或轻度生产环境,则需要考虑更多因素。

6.1 安全性加固

  • 访问控制:RAGFlow 自带用户角色管理。务必为不同使用者创建账号并分配适当的权限(如只读、可上传、可管理)。
  • API 密钥管理:DeepSeek 服务如果设置了 API Key,应妥善保管。不要在代码或配置文件中硬编码,可以考虑使用环境变量或密钥管理服务。
  • 网络隔离:将 DeepSeek 和 RAGFlow 服务部署在内网,仅通过反向代理(如 Nginx)暴露必要的 Web 界面端口,并配置 HTTPS。
  • 文档审核:建立文档上传前的审核机制,避免错误或敏感信息进入知识库。

6.2 性能与稳定性

  • 资源监控:使用docker statsnvidia-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)。当问答不准确时,要有清晰的排查思路:是文档没解析好?分块不合理?检索策略不对?还是大模型本身的理解或生成有问题?通过日志、中间结果(如检索到的片段)一步步定位,才能让这个系统真正为你所用。

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

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

立即咨询