在上一篇中,我们学习了 RAGFlow 的系统架构和启动流程,了解了 RAGFlow 的 API 服务器(API Server) 和 任务执行器(Task Executor) 两大核心组件,一个负责提供外部接口和平台基本功能,另一个则负责文件的解析和切片处理。

从系统架构图中,我们可以看到 RAGFlow 的核心流程包括 文件上传 -> 文件解析 -> 文件分块 -> 多路召回 -> 重排序 -> 大模型回答 这些步骤,今天我们就从源码的角度,先来学习下文件上传的相关逻辑。

文件上传接口实现


文件上传接口为 /v1/document/upload,其实现逻辑位于 api/apps/document_app.py 文件:

@classmethod@DB.connection_context()def upload_document(self, kb, file_objs, user_id):
  # 初始化知识库目录结构:/.knowledgebase/kb_name  root_folder = self.get_root_folder(user_id)  pf_id = root_folder["id"]  self.init_knowledgebase_docs(pf_id, user_id)  kb_root_folder = self.get_kb_folder(user_id)  kb_folder = self.new_a_file_from_kb(kb.tenant_id, kb.name, kb_root_folder["id"])
  err, files = [], []  for file in file_objs:    # 文件重名处理,a.pdf -> a(1).pdf    filename = duplicate_name(DocumentService.query, name=file.filename, kb_id=kb.id)
    # 读取文件内容,如果是 PDF 尝试对格式错误的文件进行修复    blob = file.read()    if filetype == FileType.PDF.value:      blob = read_potential_broken_pdf(blob)
    # 上传文件到对象存储    location = filename    STORAGE_IMPL.put(kb.id, location, blob)
    # 生成文件缩略图    doc_id = get_uuid()    img = thumbnail_img(filename, blob)    thumbnail_location = ""    if img is not None:      thumbnail_location = f"thumbnail_{doc_id}.png"      STORAGE_IMPL.put(kb.id, thumbnail_location, img)
    # 保存到 document 表    doc = {      "id": doc_id,      "kb_id": kb.id,      "parser_id": self.get_parser(filetype, filename, kb.parser_id),      "parser_config": kb.parser_config,      "created_by": user_id,      "type": filetype,      "name": filename,      "location": location,      "size": len(blob),      "thumbnail": thumbnail_location,    }    DocumentService.insert(doc)
    # 保存到 file 表    FileService.add_file_from_kb(doc, kb_folder["id"], kb.tenant_id)    files.append((doc, blob))
  return err, files

这里有几个值得注意的点,我们来逐一分析下。

知识库目录结构


RAGFlow 除了知识库管理之外,还有一个文件管理功能:

图片

用户可以直接在这里创建目录和上传文件,然后点击右边的 “链接知识库” 将其挂到某个知识库下。和直接在知识库中上传文件相比,在这里管理文件的好处是,一份文件可有链接到多个知识库,且知识库删除时文件不会被删除。在知识库中上传的文件也会出现在文件管理里,每个知识库在 /.knowledgebase 目录下都有一个对应的文件夹,只不过该文件夹是只读的,不允许用户在其中创建子文件夹或对文件进行修改。

整个文件的目录结构如下所示:

​​​​​​​

/├── Folder 1│   ├── File 11│   └── File 12├── Folder 2│   ├── File 21│   └── File 22└── .knowledgebase    ├── kb1    │   ├── File 11    │   └── File 12    └── kb2        ├── File 21        └── File 22

此外,从文件管理上传的文件会在 file 表中插入记录,而在知识库中上传的文件会同时在 file 和 document 表中插入记录,并通过 file2document 表维护两者之间的关系,这也是上面最后几句代码的作用。

修复 PDF 格式错误


PDF 文件的处理是一件非常棘手的问题,RAGFlow 在上传 PDF 文件的时候,会检查文件能否正常打开,如果有问题,则尝试用 Ghostscript 对其进行修复:

​​​​​​​

def read_potential_broken_pdf(blob):  def try_open(blob):    try:      with pdfplumber.open(BytesIO(blob)) as pdf:        if pdf.pages:          return True    except Exception:      return False    return False
  if try_open(blob):    return blob
  repaired = repair_pdf_with_ghostscript(blob)  if try_open(repaired):    return repaired
  return blob

修复的逻辑很简单,就是执行 Ghostscript 命令:

​​​​​​​

$ gs -o <outfile> \    -sDEVICE=pdfwrite \    -dPDFSETTINGS=/prepress \    <infile>

我们之前在学习 PDFMathTranslate 时,了解到它有一个兼容模式,通过 pikepdf 将 PDF 转换为 PDF/A 格式,可以提高 PDF 文件的兼容性。感觉这也算一种修复 PDF 文件的方式,只是不知道二者之间有何区别。

缩略图的生成


RAGFlow 支持为不同格式的文件生成缩略图,可以学习下它这里不同文件的实现。

比如使用 pdfplumber 的 Page.to_image() 生成 PDF 文件的缩略图:

​​​​​​​

import pdfplumberpdf = pdfplumber.open(BytesIO(blob))
buffered = BytesIO()resolution = 32pdf.pages[0].to_image(resolution=resolution).annotated.save(buffered, format="png")img = buffered.getvalue()
pdf.close()return img

使用 PIL 的 Image.thumbnail() 生成图片的缩略图:​​​​​​​

from PIL import Imageimage = Image.open(BytesIO(blob))
image.thumbnail((30, 30))buffered = BytesIO()image.save(buffered, format="png")
return buffered.getvalue()

使用 aspose-slides 的 Slide.get_thumbnail() 生成 PPT 文件的缩略图:

import aspose.pydrawing as drawingimport aspose.slides as slides
with slides.Presentation(BytesIO(blob)) as presentation:  buffered = BytesIO()  scale = 0.03  img = None  presentation.slides[0].get_thumbnail(scale, scale).save(buffered, drawing.imaging.ImageFormat.png)  img = buffered.getvalue()  return img

文件存储的实现


从代码可以看到,这里通过 STORAGE_IMPL.put(...) 将文件上传到对象存储,RAGFlow 默认使用 Minio 存储,可以在浏览器里输入 http://localhost:9001 来访问它:

图片

默认用户为 rag_flow,密码为 infini_rag_flow,登录进去后可以浏览 RAGFlow 的所有的文件:

图片

其中桶名就是知识库的 ID,Key 就是文件的名称。

RAGFlow 支持多种不同的文件存储实现,除了 Minio 还支持下面这些:

  • AZURE_SPN - 使用 Azure 的 DataLake 服务

  • AZURE_SAS - 使用 Azure 的 Storage Blobs 服务

  • AWS_S3 - 使用 AWS 的 S3 服务

  • OSS - 使用阿里云的 OSS 对象存储服务

  • OPENDAL - 使用 Apache 的 OpenDAL 连接不同的存储服务

可以在 .env 文件中通过 STORAGE_IMPL 变量来切换其他的存储实现。比如使用阿里云的 OSS 存储,需要在 .env 文件中添加下面的配置:

STORAGE_IMPL=OSS

同时修改 service_conf.yaml.template 中对应的 oss 配置:

​​​​​​​

oss:  access_key: 'access_key'  secret_key: 'secret_key'  endpoint_url: 'http://oss-cn-hangzhou.aliyuncs.com'  region: 'cn-hangzhou'  bucket: 'bucket_name'

小结


我们今天学习了 RAGFlow 的文件上传逻辑,了解了 RAGFlow 是如何组织知识库的目录结构、如何修复 PDF 格式错误、如何生成不同文件的缩略图、以及如何切换不同的文件存储等相关内容。文件上传之后,自然就要对其进行解析处理了,我们明天继续吧。

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。保证100%免费】🆓

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈

(👆👆👆安全链接,放心点击)

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。
在这里插入图片描述

在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型实战项目&项目源码👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战项目来学习。(全套教程文末领取哈)
在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
在这里插入图片描述

为什么分享这些资料?

只要你是真心想学AI大模型,我这份资料就可以无偿分享给你学习,我国在这方面的相关人才比较紧缺,大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!

这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

CSDN粉丝独家福利

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】

(👆👆👆安全链接,放心点击)

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐