插件:高级 Markdown 分块器 – 用于 RAG 的智能 Markdown 分块

大家好,

我在 Dify 中尝试使用基于 Markdown 的知识库时,一直遇到一些烦人的问题:代码块在中间被截断、嵌套列表在奇怪的地方被拆分,以及分块方式与文档结构不匹配。

因此,我开发了一个名为 高级 Markdown 分块器 的插件,并决定在这里分享一下。

其思路很简单:不是使用一种固定的分割方式,而是让插件分析文档内容,判断它主要由什么构成——代码、列表、深层结构部分,还是普通文本——然后选择四种内部策略中的一种。具体来说:

  • 以代码为主的文档(如 API 文档、教程)会进入“代码感知”模式,确保 fenced 代码块保持完整(不会在函数中间被拆分);
  • 以列表为主的文档(如变更日志、发布说明、功能列表)会进入“列表感知”模式,确保嵌套列表与其介绍文本保持在一起;
  • 包含多级标题的“经典”文档会按结构处理,尊重层级关系;
  • 其余情况则回退到适用于混合/简单 Markdown 的安全默认策略。

此外,它还努力避免在愚蠢的地方破坏 Markdown:代码块、表格和列表都保持完整,每个分块“记住”它所属的标题路径,相邻分块之间还保留一定的重叠(最多约 35%),以防止上下文在边界处突然消失。

每个分块还可以携带一些元数据(内容类型、标题路径、源文件行号、小段重叠预览),这在后续进行检索或调试时非常有帮助。所有这些操作都在 Dify 内部本地运行——不需要外部 API 调用,也不需要 LLM 来分割 Markdown。

这个插件主要面向基于 Markdown 的 RAG 设置:文档、包含大量代码的 API/SDK 指南、变更日志/发布说明、技术规范、架构文档等。

链接:

如果你正在 Dify 中使用 Markdown,并觉得默认的分块方式过于简单,我非常欢迎任何反馈、奇怪的边缘情况,或者“这完全破坏了我的文档”的报告 :slightly_smiling_face:

1 个赞

你好,我遇到了一些问题,我使用的是界面而不是编码。

  • 没有提供可工作的 Markdown 文件示例,我不清楚如果没有输入时预期的结果是什么。
  • 在 Dify 中,document_loader 已不存在,现在已被“数据源文件”和“文档提取器”取代。
  • 已手动转换为 Markdown 的官方法律文件,无法按结构(基于标题)和层级解析,仅被简单分割。以下是一个示例:
# 印度尼西亚食品药品监督管理局第7/2023号条例 关于准药品注册标准与程序

## 考虑到

a. 为保护公众免受不符合安全性、功效和质量要求的准药品危害,有必要制定关于准药品安全、功效和质量标准和/或要求的规范;

b. 根据2017年第80号总统条例第3条第1款d项规定,食品药品监督管理局具有流通前和流通中监管的职能;

c. 根据2021年第5号政府条例第126条第4款规定,食品药品监督管理局有权制定准药品注册标准与程序,作为准药品标准和/或要求的一部分;

d. 基于上述a、b、c项考虑,有必要制定关于准药品注册标准与程序的食品药品监督管理局条例;

## 鉴于

1. 2021年第5号政府条例《基于风险的商业许可管理》(印度尼西亚共和国政府公报2021年第15号,增刊第6617号);

2. 2017年第80号总统条例《食品药品监督管理局》(印度尼西亚共和国政府公报2017年第180号);

3. 2020年第21号食品药品监督管理局条例《食品药品监督管理局组织与工作程序》(印度尼西亚共和国政府公报2020年第1002号),后经2022年第13号食品药品监督管理局条例修订(印度尼西亚共和国政府公报2022年第629号);

4. 2020年第22号食品药品监督管理局条例《食品药品监督管理局下属技术实施单位组织与工作程序》(印度尼西亚共和国政府公报2020年第1003号),后经2022年第24号食品药品监督管理局条例第二次修订(印度尼西亚共和国政府公报2022年第1111号);

## 决定

制定:

关于准药品注册标准与程序的食品药品监督管理局条例。

## 第一章
### 一般规定

#### 第1条

本条例中所指:

1. 准药品是指含有具有非系统性或局部药理作用的活性成分,用于缓解轻微症状的制剂。

2. 流通许可是指准药品在印度尼西亚境内流通的注册批准形式。

3. 准药品注册(以下简称“注册”)是指通过电子方式注册和评估准药品,以获得流通许可批准的程序。

4. 制药企业是指获得政府卫生部门许可,从事药品或药用原料生产的商业实体。

5. 传统药品企业(以下简称“IOT”)是指生产所有形式传统药品制剂的企业。

6. 小型传统药品企业(以下简称“UKOT”)是指生产所有形式传统药品制剂的企业,但不包括片剂、泡腾剂、栓剂和软胶囊。

7. 微型传统药品企业(以下简称“UMOT”)是指仅生产天然药物制剂的企业,形式包括膏药、贴剂、药膏、外用药液和切片。

8. 化妆品企业是指已根据法律法规获得工业经营许可,生产化妆品的企业。

9. 进口商是指以法人或非法人形式将准药品进口到印度尼西亚境内的商业实体。

10. 许可证是指许可方根据书面协议向被许可方授予的,用于使用涉及安全性、功效、质量及技术转让的研究与开发成果,以生产和/或使用商品名称及销售准药品的许可。

11. 良好生产规范是指旨在确保所生产产品始终符合既定质量要求的所有生产活动方面。

12. 良好药品生产规范(以下简称“CPOB”)是指旨在确保所生产药品和/或药用原料符合既定要求和用途的药品和/或药用原料生产规范。

13. 良好传统药品生产规范(以下简称“CPOTB”)是指旨在确保所生产传统药品符合既定质量要求的所有传统药品生产活动方面。

14. 良好化妆品生产规范(以下简称“CPKB”)是指旨在确保所生产化妆品始终符合既定质量要求的所有化妆品生产活动方面。

15. CPOB证书是指证明制药企业已符合CPOB要求,生产某一类药品制剂的合法文件。

16. CPOTB证书是指证明传统药品企业和企业已符合所有CPOTB技术要求,生产某一类传统药品制剂的合法文件。

17. 分阶段符合CPOTB要求证书是指证明传统药品企业已分阶段符合CPOTB技术要求,生产某一类传统药品制剂的合法文件。

18. CPKB证书是指证明化妆品企业已在化妆品生产中实施CPKB的合法文件。

19. 成品是指已完成所有生产阶段的产品。

20. 半成品是指已完成加工,仅需包装即可成为成品的原料。

21. 合同准药品是指根据合同,将全部或部分生产阶段委托给制药企业、IOT、UKOT或化妆品企业的准药品。

22. 新注册是指尚未在印度尼西亚获得流通许可的准药品注册。

23. 变更注册是指已获得流通许可的准药品,在行政、安全、功效、质量及/或标签方面发生变更的注册。

24. 通知型轻微变更注册是指不影响准药品安全、功效和/或质量,且不改变流通许可批准信息的特定方面变更注册。

25. 批准型轻微变更注册是指不属于通知型轻微变更注册或重大变更注册类别的变更注册。

26. 重大变更注册是指影响准药品行政、安全、功效和/或质量方面的变更注册。

27. 重新注册是指为延长流通许可有效期而进行的准药品注册。

28. 标签是指包含功效、安全性和使用方法等完整信息,以及与产品相关的其他信息,标注在准药品包装标签和/或随附宣传册上的内容。

29. 准药品广告(以下简称“广告”)是指以图像、文字或其他形式,通过各种方式进行准药品营销和/或贸易的任何说明或声明。

30. 配方是指活性成分和辅料的定性和定量组成。

31. 成分是指活性成分的定性和定量组成。

32. 原厂商是指在国内外以法人或非法人形式设立,指定国内分销商或代理商销售其生产、拥有或控制商品的商业实体。

33. 工作人员是指食品药品监督管理局内被授权官员指派,根据任务书执行检查的员工。

34. 经营者是指在印度尼西亚共和国法律管辖范围内设立并注册,以法人或非法人形式独立或联合从事准药品领域经营活动的商业实体。

35. 流通许可持有人是指已获得流通许可的经营者。

36. 委托方是指根据合同将准药品生产活动转移的经营者。

37. 承接方是指根据合同接受准药品生产任务的制药企业、IOT、UKOT或化妆品企业。

38. 局长是指食品药品监督管理局局长。

39. 食品药品监督管理局(以下简称“BPOM”)是指负责药品和食品监管事务的非部委政府机构。

40. 日是指工作日。

  • 我是否需要包含元数据?

你好!感谢你的反馈——我认为可能是对这个插件的使用方式存在误解。

Advanced Markdown Chunker 的设计初衷是作为知识管道中的分块步骤,位于保存到知识库之前。它从上一步(通常是数据源/文档提取器)接收文本,将其分割成块,然后传递下去。因此,“输入”来自管道,而不是插件本身。

最简单的 UI 流程是:
数据源(文件上传)→ (如需要,文档提取器)→ 分块器(Advanced Markdown Chunker)→ 知识库,然后运行“测试运行”并检查生成的分块。

对于你的“法律”文档,我建议在测试时强制使用可预测的设置(不要使用自动模式):

strategy: structural
enable_hierarchy: true
leaf_only: true
include_metadata: true

关于 document_loader:没错,这是我的疏忽——旧文档中有一个与当前 Dify UI 不匹配的示例。我已经相应更新了 README。

希望这能帮助你更清楚地理解插件的预期用途。