概述
ragflow 有个文件管理菜单,但是每个用户只能看到自己上传的文件,看不到其它用户上传,这显然会对管理造成阻碍。
此外,ragflow 存在三个文件上传方式:
- 1.从文件管理菜单中上传
- 2.从知识库中上传
- 3.直接从聊天对话中上传
并且,在minio存储桶中,对于单次上传的所有文件会存在同一个桶中,比如,上传一个文件夹,会新建一个桶存放所有文件夹中的文件;再上传一个单独文件,又会新建一个桶存放新的文件。
这样设计是非常糟糕的,客观上造成了维护和二次开发的难度。
因此,ragflow-plus 打算另起炉灶,重新开发文件管理系统,主要特点是:
-
1.所有文件原子化,不再分文件夹,上传所有文件都会单独建一个桶进行存储,每个桶除了存放上传的原始文件之外,后续的桶里会存放其解析的chunk,一个文件一个桶,比较清晰,利于维护。
-
2.在管理系统中,管理员可以查看数据库中所有文件,支持下载、查询和删除。
-
3.统一文件上传入口,在管理系统中,新增文件上传入口,该文件上传入口并不会对文件大小进行限制,后续将在使用系统中,限制用户直接上传文件,文件管理权限将完全赋予管理员。
效果如下:
目前,当前新增功能已更新至仓库,docker部署用户可再等待后续知识库管理单元开发完善后,再下载新版镜像进行更新。
ragflow-plus地址:
https://github.com/zstar1003/ragflow-plus
数据库文件管理相关表
在mysql数据库中,和文件管理相关的表总共有三张:file
、document
、file2document
。
file 表字段含义
file 表用于存储和管理系统中的文件信息,包括文件的基本属性、存储位置和所有权等。系统会根据这些信息对文件进行组织、展示和权限控制。
字段名 | 数据类型 | 含义 | 默认值 |
---|---|---|---|
id | CharField(32) | 文件的唯一标识符,主键 | UUID生成 |
create_time | IntegerField | 文件创建的时间戳 | 当前时间戳 |
create_date | CharField | 文件创建的日期,格式为YYYY-MM-DD | 当前日期 |
update_time | IntegerField | 文件最后更新的时间戳 | 当前时间戳 |
update_date | CharField | 文件最后更新的日期,格式为YYYY-MM-DD | 当前日期 |
parent_id | CharField(32) | 父文件夹ID,用于构建文件层次结构 | - |
tenant_id | CharField(32) | 租户ID,表示文件所属的用户或组织 | - |
created_by | CharField(32) | 创建者ID,表示谁创建了该文件 | - |
name | CharField(255) | 文件名称 | - |
location | CharField(255) | 文件存储位置,如MinIO中的路径 | - |
size | IntegerField | 文件大小,单位为字节 | 0 |
type | CharField(32) | 文件类型,如folder、pdf、word等,对应FileType枚举 | - |
source_type | CharField(32) | 文件来源类型,如本地、知识库、S3等,对应FileSource枚举 | “” (LOCAL) |
file 表与其他表的关系:
- 通过
parent_id
构建文件夹层次结构 - 通过
file2document
表与文档表建立多对多关系
document 表字段含义
document 表用于存储和知识库中的文档信息。
字段名 | 数据类型 | 含义 | 默认值 |
---|---|---|---|
id | CharField(32) | 文档的唯一标识符,主键 | UUID生成 |
create_time | IntegerField | 文档创建的时间戳 | 当前时间戳 |
create_date | CharField | 文档创建的日期,格式为YYYY-MM-DD | 当前日期 |
update_time | IntegerField | 文档最后更新的时间戳 | 当前时间戳 |
update_date | CharField | 文档最后更新的日期,格式为YYYY-MM-DD | 当前日期 |
thumbnail | TextField | 文档缩略图的base64字符串 | null |
kb_id | CharField(256) | 知识库ID,表示文档所属的知识库 | - |
parser_id | CharField(32) | 解析器ID,用于指定使用哪种解析器处理文档 | “” |
parser_config | JSONField | 解析器配置,包含页面范围等参数 | {“pages”: [[1, 1000000]]} |
source_type | CharField(128) | 文档来源类型,如本地、S3等 | “local” |
type | CharField(32) | 文件类型/扩展名,如pdf、word等 | - |
created_by | CharField(32) | 创建者ID,表示谁创建了该文档 | - |
name | CharField(255) | 文件名称 | null |
location | CharField(255) | 文件存储位置 | null |
size | IntegerField | 文件大小,单位为字节 | 0 |
token_num | IntegerField | 文档中的token数量 | 0 |
chunk_num | IntegerField | 文档被分割成的chunk数量 | 0 |
progress | FloatField | 文档处理进度 |
file2document 表字段含义
file2document 表用于存储文件与文档之间的关联关系。
字段名 | 数据类型 | 含义 | 默认值 |
---|---|---|---|
id | CharField(32) | 关联记录的唯一标识符,主键 | UUID生成 |
create_time | IntegerField | 关联记录创建的时间戳 | 当前时间戳 |
create_date | CharField | 关联记录创建的日期,格式为YYYY-MM-DD | 当前日期 |
update_time | IntegerField | 关联记录最后更新的时间戳 | 当前时间戳 |
update_date | CharField | 关联记录最后更新的日期,格式为YYYY-MM-DD | 当前日期 |
file_id | CharField(32) | 文件ID,关联到File表的id字段 | - |
document_id | CharField(32) | 文档ID,关联到Document表的id字段 | - |
file2document 表是一个关联表,用于建立 file 表和 document 表之间的多对多关系:
- 通过
file_id
关联到 file 表 - 通过
document_id
关联到 document 表
桶处理脚本
由于 ragflow 的权限限制,用户并不能看到其它用户上传的文件。
因此,使用管理系统删除用户之后,原先用户上传的文件会残留在 minio 之中,浪费存储空间。
因此,编写如下脚本(对应仓库文件cleanup_minio_buckets.py
),对无用桶进行清理:
import os
from dotenv import load_dotenv
import mysql.connector
from minio import Minio
# 加载环境变量
load_dotenv("../../docker/.env")
# 数据库连接配置
DB_CONFIG = {
"host": "localhost",
"port": int(os.getenv("MYSQL_PORT", "5455")),
"user": "root",
"password": os.getenv("MYSQL_PASSWORD", "infini_rag_flow"),
"database": "rag_flow"
}
# MinIO连接配置
MINIO_CONFIG = {
"endpoint": "localhost:" + os.getenv("MINIO_PORT", "9000"