1. 为什么你需要一个企业级AI知识库?

最近几年,我身边越来越多的技术团队和公司开始琢磨一件事:怎么把公司内部那些堆积如山的文档、手册、项目资料给“盘活”?新员工来了,面对几十个G的共享盘文档,根本无从下手;老员工遇到一个历史遗留的技术问题,得翻遍好几个部门的聊天记录和邮件。传统的搜索,只能靠关键词,稍微描述得模糊一点,就什么都搜不到。这种信息孤岛和知识浪费,在稍微有点规模的企业里,简直太常见了。

所以,搭建一个能“理解”你问题、并能从海量内部资料里精准找到答案的智能知识库,就成了一个非常实在的需求。这不仅仅是技术上的炫技,而是直接关系到团队效率和决策质量。今天我要分享的,就是一套我亲自在CentOS生产环境里趟过一遍的实战方案:用Ollama来管理和运行大模型,用DeepSeek-R1来做最核心的语义理解与检索,最后用RAGFlow这个框架把整个流程串起来,形成一个开箱即用、还能不断自我优化的智能问答系统。

这套方案最大的好处就是完全私有化。你的所有文档、所有的问答数据,都跑在你自己的服务器上,不用担心数据泄露,也不用为调用外部API的流量和费用发愁。特别适合对数据安全有要求的企业、研发团队或者教育机构。整个架构清晰,每个组件各司其职,出了问题也容易排查。接下来,我就带你从一台干净的CentOS 7.9服务器开始,一步步把这个系统搭建起来。我会把我在部署过程中踩过的坑、优化的参数都告诉你,保证你能跟着操作一遍就成功。

2. 实战前的准备:服务器环境与核心组件扫盲

工欲善其事,必先利其器。在开始敲命令之前,我们得先把“战场”打扫干净,并且搞清楚我们要用的几样“兵器”到底是干嘛的。我强烈建议你使用CentOS 7.9,因为这个版本在企业环境里非常普遍,稳定性和兼容性都经受了长期考验。

硬件方面,我建议的起步配置是:一颗支持AVX指令集的x86_64 CPU(现在绝大部分服务器CPU都支持),内存至少32GB,如果想运行更大的模型或者处理更多并发,64GB会更从容。存储一定要用SSD,容量1TB以上,因为向量检索和模型加载都是IO密集型操作,机械硬盘会成为巨大的瓶颈。GPU是可选项,如果你有NVIDIA的显卡并安装了合适的驱动和CUDA,那么模型推理的速度会有质的飞跃;如果没有,纯CPU也能跑,只是响应速度会慢一些,对于内部知识库来说,很多时候是可以接受的。

下面我来通俗地解释一下三个核心组件,你可以把它们想象成建造一座智能图书馆的三种专业人才:

Ollama:模型管家。它的工作特别单纯,就是帮你把各种大型语言模型(比如DeepSeek、Llama、Qwen等)下载到本地,并且提供一个统一、简单的命令来启动和管理它们。你可以把它看作是一个专业的“模型仓库管理员”,你告诉它“我要用DeepSeek-R1”,它就去帮你准备好,并且让这个模型随时待命,听候调遣。它解决了模型部署中最繁琐的依赖和环境问题。

DeepSeek-R1:语义理解专家。这是整个系统的“大脑”。传统的搜索就像是一个只会认字的小学生,你输入“如何重启服务”,它只会去找包含“重启”、“服务”这几个字的文档。而DeepSeek-R1是一个真正的“理解者”,它能读懂“服务无法响应了该怎么办”和“让应用重新运行起来的方法”其实是同一个意思。它会把你的问题和你文档库里的所有内容,都转换成一种叫“向量”的数学形式(可以理解成一种“语义指纹”),然后通过计算指纹的相似度来找到最相关的内容。这一步的准确性,直接决定了后续答案的质量。

RAGFlow:流水线架构师。前面两位专家很厉害,但需要一个总指挥来协调工作。RAGFlow就是这个角色。它负责把一篇篇原始的PDF、Word、TXT文档“吃”进去,调用DeepSeek-R1把它们切成有意义的片段并转换成向量存储起来(构建索引)。当你提问时,它指挥DeepSeek-R1从海量向量中快速找出最相关的几个片段,然后把这些片段作为“参考资料”打包,送给Ollama管理的聊天模型,让模型基于这些确切的资料生成最终答案。它把检索(Retrieval)、增强(Augmentation)、生成(Generation)这三个步骤自动化、流水线化了。

3. 第一步:在CentOS 7.9上部署Ollama模型管家

好了,理论说再多不如动手做一遍。我们现在开始实际操作。首先,确保你以root用户或者具有sudo权限的用户登录到你的CentOS 7.9服务器。

第一步是安装Ollama。官方的一键安装脚本对于国外服务器很方便,但在国内直接使用可能会因为网络问题非常慢甚至失败。这里我分享一个经过验证的加速方法,也是我实际在用的。

我们先下载安装脚本,然后手动替换掉其中下载核心二进制文件的URL,改用国内的镜像源或者GitHub加速地址。打开终端,依次执行以下命令:

# 下载官方的安装脚本
curl -fsSL https://ollama.com/install.sh -o ollama_install.sh

# 使用sed命令,将脚本中下载ollama-linux的地址替换为GitHub的加速地址
# 注意:版本号v0.5.7可能需要根据Ollama的最新发布版本进行更新,你可以去GitHub仓库查看最新版本号。
sed -i 's|https://ollama.com/download/ollama-linux|https://ghproxy.com/https://github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux|g' ollama_install.sh

# 给脚本添加执行权限
chmod +x ollama_install.sh

# 执行安装脚本
sudo ./ollama_install.sh

安装过程会自动创建ollama用户和系统服务。安装完成后,Ollama服务应该已经运行起来了。你可以用 systemctl status ollama 命令来确认。接下来,我们学习几个最常用的Ollama命令,它们是你和这位“模型管家”打交道的主要方式:

# 拉取(下载)一个模型,例如我们需要的DeepSeek-R1
ollama pull deepseek-r1:latest
# 这个过程可能会比较久,取决于你的网络和模型大小,deepseek-r1大约有几十GB。

# 运行一个模型并进行一次对话(测试用)
ollama run deepseek-r1

# 列出本地已经下载的所有模型
ollama list

# 删除一个本地模型
ollama rm deepseek-r1

# 停止所有正在运行的Ollama服务(常用于更新或维护)
ollama stop

# 启动Ollama后台服务(通常安装后已自动启动)
ollama serve

这里有一个至关重要的坑点,我当初就被卡了半天:默认情况下,Ollama服务只监听 127.0.0.1 这个本地回环地址。这意味着,在同一个服务器上,只有从本机发起的请求才能访问到它。但我们的RAGFlow是运行在Docker容器里的,对于容器来说,宿主机的 127.0.0.1 指向的是容器自己,而不是宿主机上的Ollama服务。所以我们必须让Ollama监听在所有网络接口上。

修改Ollama的系统服务配置文件:

sudo vi /etc/systemd/system/ollama.service

找到 [Service] 部分下的 Environment= 这一行(如果有多行,通常在文件靠后的位置)。在这一行的末尾,添加一个环境变量,修改后类似这样:

Environment=... OLLAMA_HOST=0.0.0.0:11434

保存退出后,重新加载系统守护进程并重启Ollama服务:

sudo systemctl daemon-reload
sudo systemctl restart ollama

现在,使用 sudo netstat -tlnp | grep 11434 命令检查,你应该能看到Ollama正在监听 0.0.0.0:11434,这意味着它已经可以从网络上的其他位置(包括Docker容器)访问了。

4. 第二步:用Docker Compose拉起RAGFlow流水线

Ollama准备就绪后,我们来部署总指挥RAGFlow。RAGFlow官方推荐使用Docker Compose进行部署,这能帮我们一次性把RAGFlow本身、向量数据库(如Milvus)、关系型数据库(MySQL)等所有依赖的服务都拉起来,非常方便。前提是你的系统里已经安装了Docker。

首先,确保安装了gitdocker-compose。CentOS 7自带的软件源里的docker-compose版本通常很旧,我们直接去GitHub下载最新版本。我实测v2.29.0版本很稳定。

# 安装Git(如果尚未安装)
sudo yum install -y git

# 下载docker-compose二进制文件
sudo wget https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-linux-x86_64 -O /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version
# 应该输出类似:Docker Compose version v2.29.0

接下来,拉取RAGFlow的代码仓库并进入Docker部署目录:

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

在启动之前,我们需要先给启动脚本执行权限,然后直接使用docker-compose在后台启动所有服务:

chmod +x ./entrypoint.sh
sudo docker-compose -f docker-compose.yml up -d

这个-d参数代表“detached”,让服务在后台运行。第一次执行会花费一些时间,因为它需要从Docker Hub拉取多个镜像(RAGFlow Server、Milvus、MySQL等),请耐心等待。

这里你可能遇到第一个常见的坑:如果启动时报错 Error response from daemon: invalid IP address in add-host: "host-gateway"。这是因为host-gateway这个特性需要Docker引擎版本在20.10.0以上。而CentOS 7默认通过yum安装的Docker版本可能比较老。

解决方法是,编辑 docker-compose.yml 文件,找到 extra_hosts 配置项。将其中的 host-gateway 替换为宿主机Docker网桥的IP地址,通常是 172.17.0.1

# 修改前
extra_hosts:
  - "host.docker.internal:host-gateway"

# 修改后
extra_hosts:
  - "host.docker.internal:172.17.0.1"

你可以通过命令 ip addr show docker0 来确认这个IP。修改保存后,再次运行 docker-compose up -d

启动成功后,使用 docker-compose ps 命令查看所有容器状态,确保都是“Up”状态。现在,你可以在浏览器中输入 http://你的服务器IP:80 来访问RAGFlow的Web界面了。首次访问需要注册一个管理员账号。

5. 第三步:关键连接!在RAGFlow中配置Ollama与DeepSeek-R1

登录RAGFlow后台后,我们来到了最关键的配置环节:让RAGFlow这个“总指挥”认识并能够调动我们部署在宿主机上的“模型管家”Ollama和“语义专家”DeepSeek-R1。

点击页面右上角的头像,进入“系统设置”或“模型管理”相关页面。这里我们需要添加两种类型的模型:Chat Model(聊天模型,用于最终生成答案)和Embedding Model(嵌入模型,用于将文本转换为向量,即DeepSeek-R1的工作)。

5.1 添加聊天模型

  1. 找到“模型管理”或“添加模型”的按钮,选择类型为 Chat
  2. 模型名称:这里要填写一个你自定义的名字,方便自己识别,比如“My-DeepSeek-R1-Chat”。
  3. 模型标识:这个字段非常关键,必须和你在Ollama中拉取的模型名称完全一致。对于DeepSeek-R1,就是 deepseek-r1:latest。RAGFlow会通过这个标识去Ollama调用对应的模型。
  4. 基础URL:这是连接的核心。由于RAGFlow运行在Docker容器内,它需要访问宿主机的Ollama服务。这里不能填 127.0.0.1,因为那指向容器内部。我们之前修改了Ollama监听在 0.0.0.0,并且Docker Compose配置中我们将宿主机的网关映射为了 host.docker.internal。因此,这里应该填写 http://host.docker.internal:11434。这个地址对于Docker容器来说,就代表宿主机。
  5. 最大Token:根据模型的能力和你的需求填写,比如 40968192。这限制了模型单次生成文本的最大长度。

填写完成后保存。你可以点击“测试连接”或“验证”按钮,如果配置正确,RAGFlow会成功连接到Ollama并获取到模型信息。

5.2 添加嵌入模型

嵌入模型的添加步骤类似,但类型选择 Embedding

  1. 模型名称:自定义,如“My-DeepSeek-R1-Embedding”。
  2. 模型标识:同样,需要和Ollama中的模型名一致。注意,有些模型是专门的嵌入模型,而DeepSeek-R1通常也提供嵌入能力,具体标识可能需要查阅模型文档。一个通用的做法是,如果Ollama的 deepseek-r1 模型支持嵌入,这里同样填 deepseek-r1:latest。如果不支持,你可能需要拉取一个专门的嵌入模型,如 nomic-embed-text
  3. 基础URL:和聊天模型一样,填写 http://host.docker.internal:11434

添加完两个模型后,记得在系统设置里,将默认的聊天模型和嵌入模型都切换为你刚刚添加的这两个。这样,RAGFlow在处理知识库和回答问题时,就会使用我们本地部署的模型了。

6. 第四步:构建你的第一个智能知识库

核心组件全部打通,现在可以开始享受成果了。我们来创建一个知识库,并上传一些公司内部的文档进行测试。

在RAGFlow主界面,点击“知识库”或“创建知识库”。给你的知识库起个名字,比如“产品技术文档”。创建完成后,进入知识库详情页。

6.1 上传与解析文档

点击“上传文档”,你可以将本地的PDF、Word、Excel、PPT、TXT甚至Markdown文件拖拽上传。RAGFlow支持批量上传。上传后,文档会进入“待解析”队列。

解析方法是这里的一个重点,它决定了RAGFlow如何“阅读”你的文档。RAGFlow提供了几种解析器,针对不同的文档类型和用途:

  • 通用解析:这是最常用的选项,适用于大部分技术文档、报告、文章。它会将文档按段落、标题进行智能分块,在保证语义完整性的前提下,切成适合检索的大小。
  • 问答解析:如果你的文档本身就是Q&A格式(如产品FAQ、面试题集),选择这个模式可以更好地识别问题和答案的配对关系。
  • 表格解析:专门用于处理含有复杂表格的文档(如财务报表、数据报表),它会尽力识别和保留表格的结构化信息。
  • 单文档解析:将整个文档当作一个巨大的文本块来处理,不分块。适用于内容非常连贯、不希望被拆散的短文档。
  • 知识解析:这是最“高级”的模式,它会尝试从文本中抽取实体、关系,构建初步的知识图谱。对于希望进行深度知识关联的场景很有用,但解析速度最慢,消耗资源也最多。

我的经验是:对于普通的技术手册、产品说明书、项目文档,首选“通用解析”。它在分块效果、检索精度和速度之间取得了很好的平衡。选择好解析方法后,点击“开始解析”。RAGFlow会调用你配置的嵌入模型(DeepSeek-R1),将每一块文本转换成向量,并存储到底层的Milvus向量数据库中。这个过程视文档数量和大小而定,需要一些时间。

6.2 进行智能问答测试

解析状态显示“成功”后,你的知识库就正式激活了!点击“聊天”或“问答”标签页,就可以开始测试了。

在聊天界面,确保右上角选择的聊天模型是你之前配置的“My-DeepSeek-R1-Chat”。然后,你就可以像和同事聊天一样提问了。例如,上传了一份服务器运维手册后,你可以问:“当服务器磁盘空间使用率超过90%时,应该按照什么步骤处理?” RAGFlow的工作流程会在后台悄然进行:

  1. 将你的问题通过DeepSeek-R1转换成向量。
  2. 在Milvus向量数据库中,快速搜索与问题向量最相似的几个文档片段(即之前分块并向量化的内容)。
  3. 将这些最相关的片段作为“上下文”或“参考资料”,连同你的原始问题,一起发送给Ollama管理的DeepSeek-R1聊天模型。
  4. 聊天模型基于这些确切的参考资料,生成一个准确、有据可依的答案。

你会看到,生成的答案通常会引用来源文档的片段,并且比直接问大模型“胡编乱造”要精准可靠得多。这就是RAG(检索增强生成)的核心价值:将大模型的生成能力与外部知识库的准确性结合起来。

7. 生产环境调优与避坑指南

把系统跑起来只是第一步,要让它在企业环境里稳定、高效地服务,还需要一些调优和注意事项。这里我分享几个实战中总结的点。

网络与权限问题:这是私有化部署中最常遇到的。除了前面提到的Ollama监听地址和Docker的host-gateway问题,还要注意服务器的防火墙。CentOS 7默认的firewalld可能会阻断端口。你需要确保80端口(RAGFlow Web)、11434端口(Ollama API)是开放的。可以使用sudo firewall-cmd --permanent --add-port=80/tcpsudo firewall-cmd --permanent --add-port=11434/tcp命令添加规则,然后重载防火墙。

性能优化

  1. Ollama参数调整:运行模型时,可以通过环境变量或Ollama的Modelfile来限制模型使用的线程数。在CPU环境下,设置OLLAMA_NUM_PARALLEL为一个合理的值(如物理核心数),可以避免模型吃光所有资源导致系统卡顿。
  2. RAGFlow解析并发:在RAGFlow的设置中,可以调整文档解析的并发数。如果服务器资源充足,可以适当调高以加快批量文档入库的速度;如果资源紧张,则调低以避免拖垮服务。
  3. 向量数据库索引:Milvus支持多种向量索引类型(如IVF_FLAT, HNSW)。对于千万级以下的数据量,HNSW是一个在精度和速度上比较平衡的选择。你可以在RAGFlow的部署配置中调整Milvus的索引参数,不过对于入门,默认配置已经足够。

模型管理:随着使用深入,你可能会尝试更多模型。Ollama可以同时管理多个模型,但注意它们会占用大量的磁盘空间。定期使用ollama list查看,并用ollama rm清理不再使用的模型。对于生产环境,建议固定使用一个经过测试的稳定模型版本,而不是始终使用:latest标签,以避免自动更新带来的意外行为。

数据备份:你的知识核心——向量数据,存储在Milvus和MySQL中。RAGFlow的Docker Compose文件通常将数据卷挂载在本地。一定要定期备份这些数据卷所在的目录(一般在ragflow/docker下的milvusmysql子目录)。在升级RAGFlow或迁移服务器时,备份是救命的稻草。

最后,也是最重要的,从小范围开始,逐步迭代。不要一开始就试图把公司十年的文档全部灌进去。先选择一个核心团队(如技术支持部),上传他们最常用的几十份文档,让这个系统先在一个小闭环里跑起来,收集反馈,调整解析策略和问答方式。当这个核心场景打磨顺畅后,再逐步推广到其他部门,并纳入更多类型的文档。这种渐进式的落地方式,阻力最小,成功概率最高。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐