☰
Ubuntu 上用 Docker 部署 RAGFlow 知识库并接入 Agent 后端
2026/10/7 6:13:21 网站建设 项目流程

1. 为什么选择 RAGFlow 作为知识库底座

1.1 从“能搜到”到“能答对”的认知转变

做过知识库问答的人都有一个共同体会:把文档丢进向量数据库,用相似度检索出几段文本,再塞给大模型生成答案,这套流程跑通不难,难的是答案靠谱。我最早用 LangChain 搭过一版,检索出来的片段经常答非所问,尤其是表格、扫描件、多栏 PDF 这类文档,切分出来的 chunk 语义是碎的,模型再强也救不回来。

RAGFlow 解决的核心问题就在这。它把“文档解析”当成一等公民来做,而不是简单按字符数切块。深度文档理解这套机制会识别版面结构、表格、标题层级,再结合模板化的切分策略,让每个 chunk 尽量保持语义完整。这一点对中文技术文档、合同、研报特别关键,因为这些文档的排版信息本身就是语义的一部分。

我这次部署 RAGFlow 的目标很明确:给内部团队搭一个能上传 PDF、Word、Excel、PPT 的知识库,接上大模型 API,再通过 Agent 后端把问答能力暴露出去。整套东西要跑在一台 Ubuntu 服务器上,用 Docker 编排,方便迁移和备份。

1.2 适合谁来参考这套方案

如果你符合下面任意一条,这篇内容应该能帮你省下不少时间:

  • 手里有一堆内部文档,想让它们变成可问答的知识库,但不想从零写检索链路
  • 已经在用 Docker,想找一个能快速起服务、又能深度定制的 RAG 平台
  • 需要把知识库能力接入自己的 Agent 或业务系统,通过 API 调用而不是只用网页界面
  • 在 Ubuntu 上折腾过各种依赖冲突,想找一套相对干净的部署路径

不适合的场景也说清楚:如果你只是想要一个纯云端、零运维的问答工具,那 RAGFlow 这种自托管方案反而增加负担。它适合对数据可控性有要求、愿意花一两个小时做部署和调优的团队。

1.3 整体架构的直觉理解

在动手之前,先把 RAGFlow 的组成在脑子里过一遍,后面配置的时候就不会迷路。它大致分四层:

  • 接入层:Web 界面和 HTTP API,负责文档上传、知识库管理、对话入口
  • 解析层:文档解析引擎,把 PDF、Office 文件转成结构化文本,这是它的看家本领
  • 检索层:向量检索加关键词检索的混合召回,配合重排序
  • 模型层:对接外部大模型 API 做生成,也对接 Embedding 模型做向量化

Agent 后端接入,本质上就是绕过 Web 界面,直接调接入层的 API,把知识库问答能力嵌进你自己的系统。理解了这四层,后面配置哪一项、改哪个参数,心里都有数。

2. 部署前的环境准备与关键决策

2.1 Ubuntu 版本与硬件门槛

我用的系统是 Ubuntu 22.04 LTS,这个版本在 Docker 生态里兼容性最稳。Ubuntu 24.04 也能跑,但部分内核模块和 Docker 版本的搭配偶尔会出小问题,生产环境我倾向保守一点。如果你手上是 24.04,问题也不大,注意 Docker 版本别太旧就行。

硬件方面给个实测参考:

资源最低可用推荐配置说明
CPU4 核8 核以上文档解析吃 CPU,批量导入时差距明显
内存8 GB16 GB 以上解析大 PDF 时内存峰值较高
磁盘50 GB200 GB SSD向量数据和原始文档都占空间
GPU不需要可选用外部 API 做推理时完全不需要 GPU

这里有个常见误区:很多人以为跑 RAG 必须上显卡。实际上如果你用外部大模型 API 做生成、用外部 Embedding API 做向量化,本地只负责解析和检索,纯 CPU 完全够用。我这次就是纯 CPU 方案,导入几百份文档没遇到瓶颈。

2.2 Docker 与 Docker Compose 的安装路径

Ubuntu 上装 Docker 有两条路:用官方仓库装,或者用系统自带的包。我强烈建议走官方仓库,版本新、组件全。系统自带的 docker.io 包版本往往偏旧,Compose 插件也可能缺失。

安装步骤大致是这样,先更新索引并装基础依赖:

sudo apt update sudo apt install -y ca-certificates curl gnupg

然后添加 Docker 官方 GPG 密钥和仓库。这一步网上教程很多,核心就是下载密钥、写入 keyring、把仓库地址加到 sources.list。装完之后验证:

docker --version docker compose version

两条命令都能正常输出版本号,说明 Docker 和 Compose 插件都到位了。这里踩过一个坑:有些教程只装了 docker-ce 没装 docker-compose-plugin,结果docker compose命令报错,只能用老的docker-compose。现在官方推荐用插件形式,命令是docker compose(中间空格),不是docker-compose(中间横杠),别搞混。

提示:装完 Docker 后,把当前用户加入 docker 组,否则每条命令都要 sudo。执行sudo usermod -aG docker $USER后重新登录生效。

2.3 系统参数的几处必要调整

Ubuntu 默认的一些内核参数对 Elasticsearch 这类组件不友好,RAGFlow 依赖的检索组件对内存映射和文件句柄有要求。需要调整的主要是vm.max_map_count,默认值偏小,导入大量文档时可能触发报错。

sudo sysctl -w vm.max_map_count=262144

想永久生效就写进/etc/sysctl.conf。另外文件句柄数也建议调高,编辑/etc/security/limits.conf加上 nofile 的限制。这些调整看起来琐碎,但不做的话,服务跑着跑着突然挂掉,排查起来很费劲。

还有一个容易被忽略的点:磁盘空间监控。Docker 的镜像层、容器日志、卷数据都会持续占用空间,建议提前规划好数据目录,别让根分区被撑爆。我习惯把 Docker 的数据目录迁到独立的大盘上,通过修改/etc/docker/daemon.json里的>git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker

进入 docker 目录后,你会看到几个关键文件:docker-compose.yml定义服务编排,.env存放环境变量,还有各个组件的配置文件。先别急着启动,花两分钟看看目录结构,后面改配置的时候能快速定位。

docker-compose.yml里通常包含这些服务:ragflow 主服务、mysql 存元数据、elasticsearch 或 infinity 做检索、minio 做对象存储、redis 做缓存。每个服务都有自己的资源限制和依赖关系。理解这个编排关系,出问题时能快速判断是哪个组件拖后腿。

3.2 环境变量配置的核心参数

.env文件是配置的重中之重。我挑几个必须关注的参数说:

  • 镜像版本:RAGFLOW_IMAGE指定用哪个版本的镜像。建议锁定具体版本号,别用 latest,否则某天自动更新后行为变了,排查半天。
  • 端口映射:默认 Web 端口是 80 或 9380,如果服务器上已经有服务占了 80,得改映射,比如8080:80。
  • MySQL 密码:默认密码一定要改,尤其是服务器有公网访问的情况。
  • Elasticsearch 内存:MEM_LIMIT这类参数控制检索组件的内存上限,机器内存小的话要调低,否则容器起不来。

改完.env再启动,比启动后改配置省事得多。我见过有人启动完发现端口冲突,改完配置重启,结果数据卷里残留了旧配置,又折腾一轮。

3.3 启动服务与首次验证

配置就绪后,一条命令拉起所有服务:

docker compose -f docker-compose.yml up -d

-d是后台运行。第一次启动会拉取镜像,视网络情况可能要等几分钟。启动后别急着访问,先看容器状态:

docker compose ps

所有服务显示 running 或 healthy 才算正常。如果某个容器反复重启,用docker compose logs 服务名看日志。常见的启动失败原因有:内存不足被 OOM kill、端口被占用、卷挂载权限不对。

服务都起来后,浏览器访问http://服务器IP:端口,能看到登录界面就成功了一大半。首次登录用默认账号,进去第一件事就是改密码。

注意:如果页面打不开但容器是 running,先检查防火墙规则,Ubuntu 的 ufw 默认可能拦了端口。sudo ufw status看一眼,需要的话放行对应端口。

3.4 模型配置:接入外部大模型 API

RAGFlow 本身不带大模型,需要你配置模型供应商。进入系统设置里的模型管理,添加你的 API 供应商。以常见的兼容 OpenAI 接口的服务为例,需要填三样东西:API Base URL、API Key、模型名称。

Embedding 模型也要单独配一个,它负责把文本转成向量。这里有个经验:Embedding 模型一旦选定,知识库建好后就别轻易换,因为换模型意味着所有向量要重新生成,已有知识库得重建。所以建库之前先把 Embedding 模型定下来。

配置完模型,建议在界面上做个连通性测试,确认 API Key 有效、网络能通。我遇到过 API Key 填错一个字符,结果上传文档时一直卡在解析后阶段,日志里才看到鉴权失败,白白浪费半小时。

4. 知识库构建与文档解析技巧

4.1 创建知识库时的关键选择

新建知识库时,界面会让你选切分方法和 Embedding 模型。切分方法决定了文档怎么被拆成 chunk,这是影响问答质量的最大变量。

RAGFlow 提供了几种切分模板,针对不同文档类型:

  • 通用切分:适合结构规整的文本,按段落和标题层级切
  • 表格切分:针对 Excel、含表格的 PDF,保留表格结构
  • 论文/报告切分:识别章节结构,适合长文档
  • 问答切分:如果原始文档本身就是问答对,用这个

选错切分方法,后面检索质量差,你还以为是模型不行。我的建议是:先拿几份代表性文档试切,看看切出来的 chunk 在预览里是否语义完整,再批量导入。

4.2 文档解析的实操心得

上传文档后,RAGFlow 会走解析流程。解析质量直接决定检索上限。几个实测有效的技巧:

第一,扫描件 PDF 一定要先做 OCR。RAGFlow 内置了 OCR 能力,但识别率受扫描质量影响大。如果原始扫描件歪斜、模糊,建议先用外部工具预处理,再上传。

第二,复杂表格的文档,优先用支持表格识别的解析方式。普通文本切分会把表格拆得七零八落,检索时根本匹配不到。

第三,文档命名和目录结构要规范。虽然系统靠内容检索,但良好的命名能帮你在管理界面快速定位,尤其是知识库文档上百份之后。

解析进度可以在界面上看到,大批量导入时耐心等。解析失败的文档会有标记,点进去看原因,常见的是格式不支持或文件损坏。

4.3 检索参数的调优方向

知识库建好后,检索效果不理想,先别急着换模型,调这几个参数往往更有效:

  • 相似度阈值:太低会召回一堆无关内容,太高又可能漏掉关键信息。从中间值开始试,根据实际问答效果微调。
  • 召回数量:一次召回几个 chunk 送给模型。数量太少信息不全,太多会稀释重点还浪费 token。一般 3 到 8 个之间比较合适。
  • 重排序:开启重排序能让最相关的 chunk 排到前面,对提升答案质量帮助明显,代价是多一点计算时间。

这些参数没有万能值,跟你的文档类型、问题类型都相关。我的做法是准备一组典型问题,每次调参后跑一遍,对比答案质量,找到相对最优的组合。

5. Agent 后端接入的完整路径

5.1 理解 API 的鉴权与调用方式

RAGFlow 对外提供 HTTP API,Agent 后端接入就是通过这套 API 完成知识库的检索和对话。第一步是拿到 API Key,在系统设置里生成。这个 Key 相当于通行证,所有请求都要带上。

鉴权方式通常是请求头里带 Bearer Token。调用前先确认 API 的基础地址,一般是http://服务器IP:端口/api/v1这样的形式。不同版本的路径可能略有差异,以你部署版本的接口文档为准。

我建议接入前先用 curl 或 Postman 手动调一次,确认能通,再写进代码。直接上代码调试,出错了分不清是网络问题、鉴权问题还是参数问题。

5.2 对话接口的调用示例

以对话接口为例,一次典型的调用大致是这样:

import requests url = "http://your-server:port/api/v1/chats/completion" headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" } payload = { "question": "你们的退货政策是什么", "chat_id": "你的对话ID", "stream": False } resp = requests.post(url, headers=headers, json=payload) print(resp.json())

关键参数说明:question是用户问题,chat_id关联到某个知识库的对话配置,stream控制是否流式返回。流式返回适合前端逐字显示,后端批量处理用非流式更简单。

返回结果里通常包含答案文本和引用的文档片段。引用片段很有价值,可以展示给用户看答案来源,增强可信度。

5.3 把知识库能力封装成 Agent 工具

如果你在用 Agent 框架,可以把 RAGFlow 的检索能力封装成一个工具函数,让 Agent 在需要时调用。思路是:定义一个函数,输入是查询语句,内部调 RAGFlow 的检索接口,返回相关文档片段,Agent 拿到片段后再决定怎么组织回答。

这样做的好处是职责清晰:RAGFlow 负责“找资料”,Agent 负责“用资料”。Agent 可以根据对话上下文判断什么时候需要查知识库,什么时候直接回答,避免每次都无脑检索。

封装时注意错误处理。API 调用可能超时、可能返回空结果,这些情况都要有兜底逻辑,不能让整个 Agent 流程因为一次检索失败就崩掉。

5.4 接入后的联调与验证

接入完成后,做一轮端到端验证。准备几类问题:知识库里明确有的、知识库里没有的、需要综合多份文档的。看 Agent 的回答是否符合预期。

知识库里没有的问题,理想情况下 Agent 应该承认不知道,而不是编造。如果它开始胡诌,说明检索阈值或提示词需要调整。这一步的验证很重要,直接关系到上线后的用户体验。

6. 常见问题排查与避坑实录

6.1 部署阶段的典型故障

部署阶段最容易卡在容器起不来。整理一张速查表:

现象可能原因排查方向
容器反复重启内存不足看docker compose logs,调低组件内存限制
端口无法访问防火墙或端口占用检查 ufw 规则,netstat看端口占用
镜像拉取失败网络问题配置镜像加速,或换网络环境重试
卷挂载报错权限问题检查目录属主,必要时 chown

我遇到过一次 Elasticsearch 容器起不来,日志显示内存映射区域不足,就是前面说的vm.max_map_count没调。改完参数重启就好了。这类问题看着吓人,其实都是配置层面的小事。

6.2 解析与检索阶段的疑难

文档解析卡住或失败,先看文件本身有没有问题。加密的 PDF、损坏的 Office 文件,解析器处理不了。另外超大文件解析时间长,别以为是卡死了,看日志确认还在处理就行。

检索结果不相关,按这个顺序排查:切分方法是否合适、Embedding 模型是否匹配文档语言、相似度阈值是否合理、重排序是否开启。多数情况下问题出在切分,而不是模型。

6.3 几个独家避坑技巧

第一,部署前先规划数据目录。Docker 卷默认在系统盘,文档一多容易撑爆根分区。提前把数据目录迁到大盘,省得后期迁移。

第二,API Key 和数据库密码用环境变量管理,别硬编码在代码里。既安全又方便换环境。

第三,知识库分批导入,别一次性丢几百份文档。分批导入便于观察解析质量,出问题也好定位是哪批文档的锅。

第四,保留一份配置备份。.env和docker-compose.yml改动前先备份,改崩了能快速回滚。

第五,关注版本更新日志。RAGFlow 迭代较快,新版本可能改了配置项或接口,升级前先看变更说明,别盲目拉最新镜像。

7. 性能优化与长期维护建议

7.1 资源占用的监控与调优

服务跑起来后,定期看容器资源占用。docker stats能实时看到各容器的 CPU 和内存。如果某个组件长期高占用,考虑调整它的资源限制或优化配置。

检索组件的内存占用通常最大,可以给它单独设上限,避免它把整机内存吃光影响其他服务。数据库和缓存相对轻量,但数据量大了也要关注磁盘 IO。

7.2 数据备份与迁移

知识库的价值在于数据,备份策略必须到位。需要备份的主要是:MySQL 里的元数据、对象存储里的原始文档、向量数据。最省事的做法是定期打包 Docker 卷,或者用数据库自带的导出工具。

迁移到新服务器时,把配置文件和卷数据一起搬过去,改一下 IP 和端口,基本就能无缝切换。前提是两边的 Docker 版本和镜像版本一致。

7.3 持续迭代的方向

知识库上线只是开始。后续可以做的事:根据用户反馈持续优化切分策略、补充高频问题的标准答案、定期清理过时文档、监控检索命中率并针对性调参。

我个人在实际操作中的体会是,RAG 系统的效果提升,八成来自文档质量和切分策略的打磨,两成来自模型和参数。很多人一上来就纠结换哪个大模型,其实先把文档解析这关做好,效果提升立竿见影。最后再分享一个小技巧:建一个“测试问题集”,每次调整配置后跑一遍,用固定标准衡量效果变化,比凭感觉调参靠谱得多。

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

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

立即咨询