支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


深度拆解RAGFlow分片引擎之切片实现

发布日期:2025-04-16 09:55:22 浏览次数: 1556 作者:5ycode
推荐语

深入探索RAGFlow分片引擎的切片实现,揭示其核心机制和策略注册。

核心内容:
1. 切片方法的选择与parser_id参数的作用
2. 代码实现中chunker.chunk方法的调用细节
3. 策略注册过程及各类处理器的应用场景

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

 

上一篇深度拆解RAGFlow分片引擎!3大阶段+视觉增强,全网最硬核架构解析 讲了切片的整体流程,今天我们来拆下切片的实现。


我们在设置的时候,可以选择切片方法。这个参数是parser_id

在创建知识库的时候,选择对应的切片方法以后,我们可以看到右侧的切片介绍。
async def build_chunks(task, progress_callback):  
    # 根据配置获取到切片实现(策略)
    chunker = FACTORY[task["parser_id"].lower()]
async with chunk_limiter:  
    cks = await trio.to_thread.run_sync(lambda: chunker.chunk(task["name"], binary=binary, from_page=task["from_page"],  
                        to_page=task["to_page"], lang=task["language"], callback=progress_callback,  
                        kb_id=task["kb_id"], parser_config=task["parser_config"], tenant_id=task["tenant_id"]))
  • • 在上面的代码里根据配置parser_idFACTORY中获取到对应的实现文件
  • • 注意chunker.chunk 调用对应实现文件中的chunk方法
from rag.app import laws, paper, presentation, manual, qa, table, book, resume, picture, naive, one, audio, email, tag
# 策略注册(隐式接口)
FACTORY = {  
    "general": naive,   # 基础文本处理器
    ParserType.NAIVE.value: naive,  
    ParserType.PAPER.value: paper,  # 学术论文处理器
    ParserType.BOOK.value: book,  
    ParserType.PRESENTATION.value: presentation,  
    ParserType.MANUAL.value: manual,  
    ParserType.LAWS.value: laws,  
    ParserType.QA.value: qa,  
    ParserType.TABLE.value: table,  # 表格专用处理器
    ParserType.RESUME.value: resume,  
    ParserType.PICTURE.value: picture,  
    ParserType.ONE.value: one,  
    ParserType.AUDIO.value: audio,  
    ParserType.EMAIL.value: email,  
    ParserType.KG.value: naive,  
    ParserType.TAG.value: tag  
}
  • • FACTORY 对应的 实现,就是一个配置映射,根据前端的配置,然后映射到对应的方法
  • • 我们可以看到对应的是从rag.app导入的

    看下代码结构,都是对应的类文件。引入的类文件每个都有一个相同的chunk方法

这块代码就是一个典型的策略模式实现。

这里要吐槽下python的隐式接口,不是自己写的代码,一不小心得来回翻几遍代码。等我过两天给它接口显式实现。

整块代码逻辑如下:

策略工厂FACTORY

general/naive

paper

table

...

分片请求
parser_id参数
naive.py
paper.py
table.py
...其他处理器
统一chunk方法接口
执行具体分片逻辑
返回结构化分片数据

在上一篇中我们简单的画了下naive的处理流程,也就是前端选择的general。我把流程复制过来。

DOCX

PDF

Excel

TXT/Code

Markdown

HTML/JSON

输入文件
格式判断
DOCX解析器
PDF解析器+布局识别
表格解析器
文本分割器
MD表格提取
结构化解析
原始分片生成
是否视觉增强?
视觉模型处理图表
基础分片处理
分片合并
Token化处理
输出结构化分片

通用方法里,针对不同的文件类型,有对应的实现。

接下来,我们拆解几个定向的分片实现。

Manual


前端显示仅支持pdf,后端代码支持pdfdocx。这块代码的整体处理逻辑如下

PDF

DOCX

文件输入
文件类型判断
PDF解析器
DOCX解析器
OCR+布局分析
表格识别
段落结构解析
表格HTML转换
分块处理
Token化输出

manual中,并没有抽取图片,只抽取了表格,而且类似的代码写了两遍。

我又对比了manualnaive下pdf的处理代码。
  • • manual 中注重的是文档结构化,其他的并没有增强
  • • 反而在naive模式下,通过视觉模型对图片进行了增强
  • • 所以manual只适合没有图片的,有表格的pdf

laws

  • • 法律文本的处理,在pdf上 处理上,唯一特殊的地方只有一个垂直合并

合并逻辑如下:

排序文本块
遍历相邻块
是否跨页且无意义文本?
删除当前块
是否空文本块?
计算合并特征
满足禁止合并条件?
跳过合并
执行垂直合并

book

我们看了几个,特殊场景的处理,其实最后都是通过pdf的差异化处理实现的。

resume 简历

  • • 首先通过内部服务,会进行简历的处理,通过上下文,可以看到是对简历进行了结构化处理。

    这个需要注意下,如果你源码部署,一定要注意这个,否则就趟坑了。


然后通过结构化的关键词,构建一个分片的数据结构。

qa

  
def rmPrefix(txt):  
    return re.sub(  
        r"^(问题|答案|回答|user|assistant|Q|A|Question|Answer|问|答)[\t:: ]+""", txt.strip(), flags=re.IGNORECASE)  
  
  
def beAdocPdf(d, q, a, eng, image, poss):  
    qprefix = "Question: " if eng else "问题:"  
    aprefix = "Answer: " if eng else "回答:"  
    d["content_with_weight"] = "\t".join(  
        [qprefix + rmPrefix(q), aprefix + rmPrefix(a)])  
    d["content_ltks"] = rag_tokenizer.tokenize(q)  
    d["content_sm_ltks"] = rag_tokenizer.fine_grained_tokenize(d["content_ltks"])  
    d["image"] = image  
    add_positions(d, poss)  
    return d  
  
  
def beAdocDocx(d, q, a, eng, image, row_num=-1):  
    qprefix = "Question: " if eng else "问题:"  
    aprefix = "Answer: " if eng else "回答:"  
    d["content_with_weight"] = "\t".join(  
        [qprefix + rmPrefix(q), aprefix + rmPrefix(a)])  
    d["content_ltks"] = rag_tokenizer.tokenize(q)  
    d["content_sm_ltks"] = rag_tokenizer.fine_grained_tokenize(d["content_ltks"])  
    d["image"] = image  
    if row_num >= 0:  
        d["top_int"] = [row_num]  
    return d  
  
  
def beAdoc(d, q, a, eng, row_num=-1):  
    qprefix = "Question: " if eng else "问题:"  
    aprefix = "Answer: " if eng else "回答:"  
    d["content_with_weight"] = "\t".join(  
        [qprefix + rmPrefix(q), aprefix + rmPrefix(a)])  
    d["content_ltks"] = rag_tokenizer.tokenize(q)  
    d["content_sm_ltks"] = rag_tokenizer.fine_grained_tokenize(d["content_ltks"])  
    if row_num >= 0:  
        d["top_int"] = [row_num]  
    return d

我们可以看到qa就是根据不同的结构解析出来问答对。

audio

def chunk(filename, binary, tenant_id, lang, callback=None, **kwargs):  
    doc = {  
        "docnm_kwd": filename,  
        "title_tks": rag_tokenizer.tokenize(re.sub(r"\.[a-zA-Z]+$""", filename))  
    }  
    doc["title_sm_tks"] = rag_tokenizer.fine_grained_tokenize(doc["title_tks"])  
  
    # is it English  
    eng = lang.lower() == "english"  # is_english(sections)  
    try:  
        callback(0.1"USE Sequence2Txt LLM to transcription the audio")  
        seq2txt_mdl = LLMBundle(tenant_id, LLMType.SPEECH2TEXT, lang=lang)  
        ans = seq2txt_mdl.transcription(binary)  
        callback(0.8"Sequence2Txt LLM respond: %s ..." % ans[:32])  
        tokenize(doc, ans, eng)  
        return [doc]  
    except Exception as e:  
        callback(prog=-1, msg=str(e))  
  
    return []

这块的代码更简单,直接通过语音模型转成了文本,然后再进行处理。

picture

图片的解析是使用OCR处理,所以识别到的是图片上的文本内容。使用的是deepdoc之前测试,识别效果很一般。

图片识别有两种,一种是识别图片中的文本内容,一种是通过图片描述这个图片是什么。我们可以通过扩展,ocr+图片描述构建一个图片检索系统。

两种实现方案:

  • • 直接改这块的源码,添加图片理解反推
  • • 在外面将图片反推后,构建图片描述,后续我基于这个写个案例

后记

通过代码发现,专用处理有时候也蛮鸡肋的,如果我们在外面将文档都结构化了,很多通过一些分片策略,我们可以忽略一些专用类型。

底层的处理最后都是deepdoc中的几个文件。后续会针对这个再做一些源码分析。

rag玩的是对文档的了解,怎么能拆解出合适的分片,这个是关键。

市面上应该有一些处理文档的专有模型,到时候找下看看。

相关资料

DeepSeek相关资料
https://pan.quark.cn/s/faa9d30fc2bd
https://pan.baidu.com/s/10vnv9jJJCG-KKY8f_e-wLw?pwd=jxxv

群友分享的一些dify工作流

https://pan.baidu.com/s/1aNne8dLz6YxoKhCwJclV5g?pwd=p4xc
https://pan.quark.cn/s/243a0de062e5

系列文档:

DeepSeek本地部署相关

Ollama+deepseek本地部署" href="https://mp.weixin.qq.com/s?__biz=MjM5NzQxMTAyNw==&mid=2247485191&idx=1&sn=6590bae7fb960a2577c2b77c11479080&scene=21#wechat_redirect" style='box-sizing: border-box;border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(87, 107, 149);text-decoration: none;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;'>ollama+deepseek本地部署
局域网或断网环境下安装DeepSeek
vlllm部署deepseek基准测试

DeepSeek个人应用

不要浪费deepseek的算力了,DeepSeek提示词库指南
服务器繁忙,电脑配置太低,别急deepseek满血版来了
DeepSeek+本地知识库:真的太香了(修订版)
DeepSeek+本地知识库:真是太香了(企业方案)
deepseek一键生成小红书爆款内容,排版下载全自动!睡后收入不是梦
最轻量级的deepseek应用,支持联网和知识库
当我把公众号作为知识库塞进了智能体后
个人神级知识库DeepSeek+ima 个人学习神器

dify相关

DeepSeek+dify 本地知识库:真的太香了
Deepseek+Dify本地知识库相关问题汇总
dify的sandbox机制,安全隔离限制
Agent+工作流" href="https://mp.weixin.qq.com/s?__biz=MjM5NzQxMTAyNw==&mid=2247485677&idx=1&sn=8977dea15592f5cd67565298b403b5ea&scene=21#wechat_redirect" style='box-sizing: border-box;border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(87, 107, 149);text-decoration: none;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;'>DeepSeek+dify 本地知识库:高级应用Agent+工作流
DeepSeek+dify知识库,查询数据库的两种方式(api+直连)
DeepSeek+dify 工作流应用,自然语言查询数据库信息并展示
聊聊dify权限验证的三种方案及实现
dify1.0.0版本升级及新功能预览
Dify 1.1.0史诗级更新!新增"灵魂功能"元数据,实测竟藏致命Bug?手把手教你避坑
【避坑血泪史】80次调试!我用Dify爬虫搭建个人知识库全记录
手撕Dify1.x插件报错!从配置到网络到Pip镜像,一条龙排雷实录
dify1.2.0升级,全新循环节点优化,长文写作案例
dify1.x无网环境安装插件

ragflow相关

DeepSeek+ragflow构建企业知识库:突然觉的dify不香了(1)
DeepSeek+ragflow构建企业知识库之工作流,突然觉的dify又香了
DeepSeek+ragflow构建企业知识库:高级应用篇,越折腾越觉得ragflow好玩
RAGFlow爬虫组件使用及ragflow vs dify 组件设计对比
从8550秒到608秒!RAGFlow最新版本让知识图谱生成效率狂飙,终于不用通宵等结果了
以为发现的ragflow的宝藏接口,其实是一个天坑、Chrome/Selenium版本地狱
NLTK三重降噪内幕!RAGFlow检索强悍竟是靠这三板斧
从代码逆向RAGFlow架构:藏在18张表里的AI知识库设计哲学
解剖RAGFlow!全网最硬核源码架构解析
深度拆解RAGFlow分片引擎!3大阶段+视觉增强,全网最硬核架构解析

扣子(coze)

AI开发新选择:扣子平台功能详解与智能体拆解
AI开发新选择:扣子平台工作流基础节点介绍

模型微调相关

模型微调之基础篇:模型微调概念以及微调框架

?【三连好运 福利拉满】?

? 若本日推送有收获:
? 点赞 → 小手一抖,bug没有
? 在看 → 一点扩散,知识璀璨
? 收藏 → 代码永驻,防止迷路
? 分享 → 传递战友,功德+999
? 关注 → 关注5ycode,追更不迷路,干货永同步

? 若有槽点想输出:
? 评论区已铺好红毯,等你来战!

 


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询