背景
目前市面上 RAG 系统有:FastRAG、Dify、RAGFlow 等系统,他们各自有各自的特点,但是就个人使用下来而言, RAGFlow 在文档处理和检索上做的是最棒,最深入的,这也比较贴合我们的说明书问答场景,得益于 RAGFlow 优秀的文档识别、表格处理能力,使得系统能够根据精确的找到说明书上的具体产生以及功能说明。
痛点
在使用 RAGFlow 的过程中,由于需要依赖 OCR 来识别文档的布局、表格图框位置,因此需要大量的算力去计算,一篇大概 20 页左右的文档,在12核 CPU 的全力计算下大概需要 120s 左右才能解析完成,这还是没有开启知识图谱提取、RAPTOR 构建的情况下,如果都开启性能就更慢了。想想我有几万份文档要解析,一篇 120s 秒的话,那不得解析到猴年马月,所以得解决这个问题。
如何解决问题
既然是缺少算力,那就加算力,首先翻阅 RAGFlow 的源码可以知道,文档解析部分是异步进行的,并且有两种办法增加算力,通过增加机器来增加算力,通过调整进程数量来增加算力。
增加进程数量
具体文件位于项目目录下 docker/entrypoint.sh 中可以注意到有一个 WS 的数量,默认为 1,因此我们只要在 Docker 容器的环境变量中设置 WS = 10,就可以开启 10 任务进程来解析文档。但是个人使用下来发现,单个解析进程就能够把 12 核 CPU 跑满,因此建议增加机器节点来同时进行计算。
增加机器数量
具体代码文件位于 rag/svr/task_executor.py 文件中。通过阅读源码可以知道 RAGFlow 主要是通过 Reids 来分发接受任务,并通过 Minio 下载解析任务所需要的文件,因此 RAGFlow 是支持多机进行同步计算的,只需要将对应的 ES、Redis、Minio、Mysql 路径指向同一台机器即可。具体操作如下:
部署 RAGFlow 服务
- 下载源码到机器 A 上
- cd /ragflow-masetr/docker
- 修改.env 文件,将其中的 ES 端口调整为 9200、Mysql 端口调整为 3306
- 运行 docker compose up -d
- 将 RAGFlow 跑起来后,上传你的文档到 RAGFlow 中。
拓展计算节点
- 将 ragflow-server 制作为镜像,由于我使用的是 1panel 管理服务器,因此可以直接点击制作
2.将制作好的进行拷贝下来,并上传到新的机器上
- 在新的机器上创建一个新的容器,仅需填写容器名称、环境变量即可。
在环境变量中填入以下内容,由于ragflow 默认按照默认端口连接ES和Mysql,所以之前我们在 .env 修改了 es 和 mysql 为默认端口,因此 ragflow 的容器能够正常连接到机器 A 的 ES、Redis、Minio、Mysql。具体可以参考 ragflow 项目目录下的 docker/service_conf.yaml.template 可知。
ES_HOST=10.10.20.233 //机器A的IP地址
ES_REDIS=10.10.20.233//机器A的IP地址
ES_MYSQL=10.10.20.233//机器A的IP地址
ES_MINIO=10.10.20.233//机器A的IP地址
- 将容器运行起来后,可以查看容器日志, 在新的机器上开始并行解析文档了,随着机器增加的越多计算速度越快。