当前位置: 首页 > news >正文

ai之RAG本地知识库--基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析

目录标题

  • RAG本地知识库问答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析
    • RAGflow 主要功能:
  • 一、RAGflow 简介
    • 1.1 允许用户上传并管理自己的文档(文档类型可以是任意类型)
    • 1.2 RAGFlow的4个特色
        • 1.2.1 AI 模型的智能文档处理系统
        • 1.2.2 包含各种不同模板的智能文档处理系统
        • 1.2.3 文档处理的可视化和可解释性——文本切片过程可视化,支持手动调整
        • 1.2.4 让用户随时查看 LLM 是基于哪些原文来生成答案的
    • 1.3 RAGFlow 的核心 DeepDoc:视觉处理和解析器
        • 1.3.1 视觉处理
        • 1.3.2 文本解析器
    • 1.4 // 待更 。。。。。。。。。。。。。。。。。
  • 二、 对ragflow-main/deepdoc的源码剖析
    • 2.1 ragflow-main/deepdoc/vision
        • 2.1.1 deepdoc/vision/ocr.py
  • 三、 对ragflow-main/rag的拆解
    • 3.1 ragflow-main/rag/app
        • 3.1.1 app/paper.py中pdf(侧重OCR方法)、chunk(侧重文本解析器)的实现
  • 王、RAGflow 安装软硬件条件检查

1.【LangGraph】智能体工作流的新基石
https://agent.csdn.net/684111f0606a8318e85b81e4.html
2. 基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答
https://blog.csdn.net/v_JULY_v/article/details/131552592
3. RAG知识库问答LangChain+LLM的二次开发:商用时的典型问题及其改进方案
https://blog.csdn.net/v_JULY_v/article/details/135257848

RAG本地知识库问答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析

RAGflow 主要功能:

    (1) "Quality in, quality out"基于深度文档理解,能够从各类复杂格式的非结构化数据中提取真知灼见。真正在无限下文(token)的场景下快速完成大海捞针测试。(2)基于模板的文本切片不仅仅是智能,更重要的是可控可解释。多种文本模板可供选择(3)有理有据、最大程度降低幻觉(hallucination)文本切片过程可视化,支持手动调整。有理有据:答案提供关键引用的快照并支持追根溯源。(4)兼容各类异构数据源支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据、网页等。(5)全程无忧、自动化的 RAG 工作流全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。大语言模型 LLM 以及向量模型均支持配置。基于多路召回、融合重排序。提供易用的 API,可以轻松集成到各类企业系统。

在这里插入图片描述

一、RAGflow 简介

    有关 Dify 的简介,可以查看我之前分享的 《在 Ubuntu24.04 LTS 上 Docker Compose 部署 Dify 社区版 1.0.1》文章。RAGFlow是一款基于深度文档理解(deepdoc)构建的开源 RAG引擎。其中,深度文档理解,是 RAGFlow 对文档解析的一个解决方案,它包含两个组成部分:视觉处理和解析器。其中视觉处理是通过OCR,布局识别,表结构识别来完成图像,PDF,表格的识别的。针对PDF、DOCX、EXCEL和PPT四种文档格式,都有相应的解析器。能够从各类复杂格式的非结构化数据中提取信息,文本切片过程可视化,还支持手动调整。支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据、网页等。更重要的是,他还集成了各种嵌入模型,rerank模型,提供易用的 API,可以轻松集成到各类企业系统。RAGflow 官网地址:https://ragflow.io/

下边我们来看看 RAGFlow 这款产品,相比目前市面上已有的各类开源方案,都有哪些特点
在这里插入图片描述

1.1 允许用户上传并管理自己的文档(文档类型可以是任意类型)

首先, RAGFlow 是一款完整的 RAG 解决方案,它允许用户上传并管理自己的文档,文档类型可以是任意类型,例如 PDF、Word、PPT、Excel、当然也包含 TXT

在完成智能解析之后,让数据以正确地格式进入到数据库,然后用户可以采用任意大模型对自己上传的文档进行提问

也就是说,包含了如下完整的端到端流程

在这里插入图片描述

1.2 RAGFlow的4个特色

其次,RAGFlow 的最大特色,就是多样化的文档智能处理,保证用户的数据从 Garbage In Garbage Out 变为 Quality In Quality Out

为了做到这一点, RAGFlow 没有采用现成的 RAG 中间件,而是完全重新研发了一套智能文档理解系统,并以此为依托构建 RAG 任务编排体系

这个系统的特点包含以下4个点

1.2.1 AI 模型的智能文档处理系统

它是一套基于 AI 模型的智能文档处理系统:对于用户上传的文档,它需要自动识别文档的布局,包括标题,段落,换行等等,还包含难度很大的图片和表格。

对于表格来说,不仅仅要识别出文档中存在表格,还会针对表格的布局做进一步识别,包括内部每一个单元格,多行文字是否需要合并成一个单元格,等等,并且表格的内容还会结合表头信息处理,确保以合适的形式送到数据库,从而完成 RAG 针对这些细节数字的“大海捞针”

1.2.2 包含各种不同模板的智能文档处理系统

它是一套包含各种不同模板的智能文档处理系统:不同行业不同岗位所用到的文档不同,行文格式不同,对文档查阅的需求也不同。比如:

  1. 会计一般最常接触到的凭证,发票,Excel报表
    查询的一般都是数字,如:看一下上月十五号发生哪些凭证,总额多少?上季度资产负债表里面净资产总额多少?合同台账中下个月有哪些应付应收?
  2. 作为一个HR平时接触最庞杂的便是候选人简历
    且查询最多的是列表查询,如:人才库中985/211的3到5年的算法工程师有哪些?985 硕士以上学历的人员有哪些?赵玉田的微信号多少?香秀哪个学校的来着?
  3. 作为科研工作者接触到最多的可能是就是论文了,快速阅读和理解论文,梳理论文和引文之间的关系成了他们的痛点

这样看来凭证/报表、简历、论文的文档结构是不一样的,查询需求也是不一样的,那处理方式肯定是不一样

因此RAGFlow 在处理文档时,给了不少的选择:Q&A,Resume,Paper,Manual,Table,Book,Law,通用(当然,这些分类还在不断继续扩展中,处理过程还有待完善)…

1.2.3 文档处理的可视化和可解释性——文本切片过程可视化,支持手动调整

智能文档处理的可视化和可解释性:用户上传的文档到底被处理成啥样了,如:分割了多少片,各种图表处理成啥样了,毕竟任何基于 AI 的系统只能保证大概率正确,作为系统有必要给出这样的空间让用户进行适当的干预,作为用户也有把控的需求

特别是对于 PDF,行文多种多样,变化多端,而且广泛流行于各行各业,对于它的把控尤为重要,RAGFlow不仅给出了处理结果,而且可以让用户查看文档解析结果并一次点击定位到原文,对比和原文的差异,可增、可减、可改、可查

1.2.4 让用户随时查看 LLM 是基于哪些原文来生成答案的

最后, RAGFlow 是一个完整的 RAG 系统,而目前开源的 RAG,大都忽视了 RAG 本身的最大优势之一:可以让 LLM 以可控的方式回答问题,或者换种说法:有理有据、消除幻觉

由于随着模型能力的不同,LLM 多少都会有概率会出现幻觉,在这种情况下, **一款 RAG 产品应该随时随地给用户以参考,让用户随时查看 LLM 是基于哪些原文来生成答案的,这需要同时生成原文的引用链接,并允许用户的鼠标 hover 上去即可调出原文的内容,甚至包含图表。**如果还不能确定,再点一下便能定位到原文

一言以蔽之,答案提供关键引用的快照并支持追根溯源
————————————————

1.3 RAGFlow 的核心 DeepDoc:视觉处理和解析器

RAGFlow 引擎的核心的是 DeepDoc,它由视觉处理和解析器两部分组成

1.3.1 视觉处理

模型在视觉层面具备以下能力

  1. OCR(Optical Character Recognition,光学字符识别)
    由于许多文档都是以图像形式呈现的,或者至少能够转换为图像,因此OCR是文本提取的一个非常重要、基本,甚至通用的解决方案
python deepdoc/vision/t_ocr.py --inputs=path_to_images_or_pdfs --output_dir=path_to_store_result

AI写代码
输入可以是图像或 PDF 的目录,或者单个图像、PDF文件,可以查看文件夹 path_to_store_result ,其中有演示结果位置的图像,以及包含 OCR 文本的 txt 文件
在这里插入图片描述

  1. 布局识别(Layout recognition)
    来自不同领域的文件可能有不同的布局,如报纸、杂志、书籍和简历在布局方面是不同的。只有当机器有准确的布局分析时,它才能决定这些文本部分是连续的还是不连续的,或者这个部分需要表结构识别(Table Structure Recognition,TSR)来处理,或者这个部件是一个图形并用这个标题来描述

它包含 10 个基本布局组件,涵盖了大多数情况:

  • 文本、标题
  • 配图、配图标题
  • 表格、表格标题
  • 页头、页尾
  • 参考引用、公式

且可以通过以下命令查看布局检测结果:

python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=layout --output_dir=path_to_store_result

输入可以是图像或PDF的目录,或者单个图像、PDF 文件,可以查看文件夹 path_to_store_result,其中有显示检测结果的图像,如下所示:
在这里插入图片描述
3. TSR(Table Structure Recognition,表结构识别)
数据表是一种常用的结构,用于表示包括数字或文本在内的数据。表的结构可能非常复杂,比如层次结构标题、跨单元格和投影行标题
当然,除了 TSR,他们还将内容重新组合成 LLM 可以很好理解的句子

TSR 任务有 5 个标签:

  • 列标题
  • 行标题
  • 合并单元格

你可以通过以下命令查看表结构识别结果:

python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=tsr --output_dir=path_to_store_result

输入可以是图像或PDF的目录,或者单个图像、PDF 文件。您可以查看文件夹 path_to_store_result,其中包含图像和 html 页面,这些页面展示了以下检测结果:

在这里插入图片描述

————————————————

1.3.2 文本解析器

PDF、DOCX、EXCEL 和 PPT 4种文档格式都有相应的解析器。最复杂的是 PDF 解析器,因为 PDF 具有灵活性。PDF 解析器的输出包括:

  • 在 PDF 中有自己位置的文本块(页码和矩形位置)。
  • 带有 PDF 裁剪图像的表格,以及已经翻译成自然语言句子的内容。
  • 图中带标题和文字的图
    ————————————————

1.4 // 待更 。。。。。。。。。。。。。。。。。

二、 对ragflow-main/deepdoc的源码剖析

2.1 ragflow-main/deepdoc/vision

2.1.1 deepdoc/vision/ocr.py

总的来讲,OCR 类整合了文本检测和识别功能。在初始化时,它会尝试从本地或远程下载模型,并实例化TextRecognizer 和 TextDetector

  1. 首先,transform 西数用于对数据进行一系列操作
def transform(data, ops=None):""" transform """if ops is None:ops = []for op in ops:data = op(data)if data is None:return Nonereturn data
  • create_operators 函数根据配置创建操作符列表
  • Load model 函数加载ONNX模型,并根据设备类型选择合适的推理提供者(CPU或GPU)
  1. TextRecognizer 类用于识别文本框中的文宇
    它在初始化时加载模型,并定义了多种图像预处理方法,如resize_norm_img,用于调整和标准化输入图像,最终填充到一个固定大小的张量中

resizenorm_img-VL,类似于上面的resize_norm_img,但它直接将图像调整为制定的形状,并进行归一化处理
resize_norm_img_srn
srn_other_inputs
process_image_srn
resize_norm_img_sar
resize_norm_img_spin
resize_norm_img_svtr
resize_norm_img_abinet
norm_img_can
这些方法根据不同的图像形状和需求对图像进行调整和归一化处理

最后的__call__方法则是识别的入口,处理输入图像并返回识别结果
TextDetector 类用于检测图像中的文本框
它在初始化时加载模型,并定义了图像预处理和后处理的方法,如 order_points_clockwise、clip_det-res 等,__call__方法是检测的入口,处理输入图像并返回检测结果
2.1.2 deepdoc/vision/recognizer.py
————————————————

三、 对ragflow-main/rag的拆解

https://blog.csdn.net/v_JULY_v/article/details/137711599?ops_request_misc=&request_id=&biz_id=102&utm_term=RAGFLOW_IMAGE=infiniflow/ragfl&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-137711599.142^v102^pc_search_result_base1&spm=1018.2226.3001.4187

3.1 ragflow-main/rag/app

3.1.1 app/paper.py中pdf(侧重OCR方法)、chunk(侧重文本解析器)的实现

在 paper.py 文件中,主要就两个主要实现

  • 一个pdf的类——即class Pdf(PdfParser),侧重用OCR的方法
  • 一个chunk函数——详见上文2.2.2 pdf_parser.py中对PlainParser类的实现
    在这里插入图片描述
    对于前者class Pdf(PdfParser),call_方法是一个主要的入口点,用于处理OCR(光学字符识别) 和布局分析
  1. 该方法首先调用 callback 函数通知OCR 开始,然后调用self.–images__方法处理图像

    def __call__(self, filename, binary=None, from_page=0,to_page=100000, zoomin=3, callback=None):callback(msg="OCR is running...")self.__images__(filename if not binary else binary,zoomin,from_page,to_page,callback)callback(msg="OCR finished.")
    
  2. 接下来,使用timer 记录布局分析的时问,并调用_layouts_rec方法进行布局分析

            from timeit import default_timer as timerstart = timer()self._layouts_rec(zoomin)callback(0.63, "Layout analysis finished")print("layouts:", timer() - start)
    

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/v_JULY_v/article/details/137711599
————————————————

王、RAGflow 安装软硬件条件检查

    (1)官方支持x86 CPU和Nvidia GPU 硬件,其他 ARM 等硬件官方截至目前尚未暂不作为正式支持硬件。(2)Linux 操作系统内核不建议低于6.0 的 LTS 版本;Windows 操作系统不建议低于 Win10 专业版 22H2 或 Window Server 2025 最新稳定版。(3)CPU 大于等于 8核(x86);一会有杠精要抬杠说官方是不少于4核,亲咱们是Dify和RAGflow安装同一台机子。(4)RAM 大于等于 32 GB 。(5)磁盘 大于等于 512 GB 。(6)Docker 大于等于 28.1.1 ,并且 Docker Compose 大于等于 2.35.1 。(7)Git 大于等于 2.43.0 。

————————————————

http://www.lryc.cn/news/579039.html

相关文章:

  • LeetCode--39.组合总和
  • Lua 安装使用教程
  • CRMEB Pro版v3.3源码全开源+PC端+Uniapp前端+搭建教程
  • 【C++】第十三节—stack、queue、priority_queue、容器适配器(介绍和使用+模拟实现+OJ题)
  • 客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)
  • 去中心化身份:2025年Web3身份验证系统开发实践
  • 专题:2025AI营销市场发展研究报告|附400+份报告PDF汇总下载
  • 告别 ifconfig:openEuler 网络配置的现代化之路
  • 通俗理解JVM细节-面试篇
  • UI前端大数据处理策略优化:基于云计算的数据存储与计算
  • kotlin 通道trysend方法
  • ZYNQ学习记录FPGA(六)程序固化Vivado+Vitis
  • GO Web 框架 Gin 完全解析与实践
  • 【Unity】MiniGame编辑器小游戏(九)打砖块【Breakout】
  • 云上配送革命:亚矩云手机如何重塑Uber Eats的全球外卖生态
  • 服务器异常宕机或重启导致 RabbitMQ 启动失败问题分析与解决方案
  • 2025年Java常见面试题(持续更新)
  • Maven工具学习使用(十三)——Maven Wrapper命令解析与使用
  • 在设计提示词(Prompt)时,关于信息位置的安排z怎么 结合模型特性和任务目标
  • 量子算法:微算法科技用于定位未知哈希图的量子算法,网络安全中的哈希映射突破
  • Linux 后台启动java jar 程序 nohup java -jar
  • pytest之fixture中yield详解
  • 文心快码答用户问|Comate AI IDE专场
  • UniApp完美对接RuoYi框架开发企业级应用
  • Droplets:趣味AI课程,开启语言学习新旅程
  • 【趣谈】Android多用户导致的UserID、UID、shareUserId、UserHandle术语混乱讨论
  • AJAX 安装使用教程
  • 从零用java实现 小红书 springboot vue uniapp (12)实现分类筛选与视频笔记功能
  • 网站面临爬虫攻击waf能防护住吗
  • mars3d (基于 Cesium 的轻量化三维地图库)