前几天在社区讨论文档解析时,有朋友提到:“解析成 Markdown 不就够用了吗?”
事实上,我的团队(EasyLink AI,一家AI初创公司)也接触过市面上一些将文档解析成 Markdown 的开源工具,比如MarkItDown。它们在解决简单任务时确实表现不错,尤其是在轻量级的展示场景中。然而,当我们尝试将这些工具应用到更高要求的场景——特别是 RAG(Retrieval-Augmented Generation,检索增强生成)任务中的复杂文档解析时,Markdown 的局限性就暴露出来了。
我们发现将文档解析成Markdown形式在以下方面存在明显不足:“无法表达复杂结构”、“缺乏层次化信息难以还原语义”、“检索结果不够精确”……这些问题清楚地表明,Markdown 的核心设计理念更适合轻量化的内容展示,而难以满足RAG复杂场景下的专业需求。
从文档解析到上下文还原,从语义检索到多模态内容的处理,在 RAG 场景中,更需要一种能够精准表达复杂逻辑关系且对机器友好的形式。在长期的实践中,JSON 的表现成为了EasyLink的最佳选择。今天,EasyLink将深入探讨为什么在 RAG 中,文档解析为 JSON 格式优于 Markdown。
文档解析:从 Markdown 到 JSON 的必然趋势
在 RAG 系统中,文档解析是一环至关重要的步骤。其核心任务,是将结构复杂、格式多样的文档转化为计算机能理解的结构化数据,用于后续的检索和生成。Markdown 因其简洁和易用,在许多文档场景中深受欢迎。但当它被引入 RAG 系统时,局限性也变得明显起来:
Markdown 的局限性
1. 缺失完整的结构信息
Markdown 是一种轻量化标记语言,更多用于文档内容的序列化,而不是结构化存储。它强调内容的展示和排版,而非表达数据的内在逻辑和结构。
例如,Markdown 中的标题、列表、表格虽然可以标记一定的层级关系,但这些结构信息非常粗糙,无法精确表达文档复杂的层级逻辑。在 RAG 系统中,结构化的信息是文档检索和生成的核心。缺失结构化信息的 Markdown 数据会导致下游任务(如切块、组合或检索策略设计)变得复杂且不直观,甚至降低系统的检索准确率。
2. 上下文和语义关系的弱化
Markdown 是一种线性存储的方式,仅通过标题和段落分隔内容,难以表达复杂文档的上下文关系。例如,正文中的图表或引用通常与相关内容紧密关联,但 Markdown 缺乏表达这种语义关系的机制。相比之下,JSON 可以通过嵌套结构和字段关联表达更复杂的语义关系,从而在检索和生成中提供更高的准确性。
3. 对非文本内容的支持有限
Markdown 对于文本以外的内容支持较差,例如表格、图像等非文本数据。Markdown 表格仅仅是一个二维的文本结构,无法表达更复杂的表格语义信息;图片引用只能简单地记录链接,无法进一步描述图片的细节(例如描述文字或坐标信息)。这让 Markdown 难以满足 RAG 中需要处理多模态内容的场景。
4. 额外的后处理负担
由于 Markdown 是文档序列化的中间产物,RAG 系统在解析 Markdown 文档后,通常需要进行大量后处理工作。例如:
-
切块:需要手动定义切块规则(如按段落切块或按标题层级切块)。
-
组合:为了满足检索需求,需要额外设计组合逻辑。
-
优化策略:由于 Markdown 缺乏结构化数据,针对检索和生成的策略开发成本更高。
这些额外的处理步骤不仅增加了系统复杂度,也容易因为解析误差导致任务效果下降。
JSON 的优势
1. 高度结构化:为检索而生
JSON 以嵌套结构的形式,精准地表达文档的层级关系和逻辑结构。例如,一个文档可以通过 JSON 表示为“章节-段落-子段落”的清晰树形结构,直接为下游任务服务。
这种高度结构化的表示方式让 JSON 成为文档解析和信息检索的“天然适配器”。开发者可以轻松定义字段,如title、content、table,甚至为复杂的表格数据、嵌套列表等提供精准的语义表达。
2. 增强的上下文关联
JSON 可以通过嵌套结构表达文档内容的上下文关系。例如,正文中的某段内容可以通过 JSON 字段直接关联到其引用的图表或补充说明。这种能力显著提升了 RAG 系统在多模态场景中的检索能力和生成质量。
3. 更高的扩展性
JSON 格式非常灵活,能够适配多种应用场景。例如,开发者可以为表格字段添加 rows 和 columns 描述数据结构,为图片字段添加 caption 和 metadata 描述图片信息,还可以通过 embedding 字段直接嵌入向量结果。这种扩展能力为 RAG 系统提供了更多可能。
4. 减少后处理成本
JSON 的结构化数据形式能够直接提供分块后的数据,减少了对文档的后处理需求。例如,一个解析为 JSON 的文档可以直接包含 chunk 字段,预定义检索策略,让 RAG 系统可以即开即用。
JSON 示例:结构化文档的实际应用
以下是一个 JSON 示例,展示了如何将一个文档解析为结构化数据:
{
"title": "test.docx",
"nodes": [
{
"id": 1,
"type": "Title",
"text": "Document Title",
"parent_id": -1,
"relation": "part_of",
"composing_blocks": [
{
"page_number": 1,
"coordinates": [
220.21475219726562,
77.0858383178711,
375.25341796875,
100.12960052490234
],
"system": "PixelSpace",
"layout_width": 596,
"layout_height": 842
}
]
},
{
"id": 2,
"type": "Title",
"text": "1. Abstract",
"parent_id": 1,
"relation": "part_of",
"composing_blocks": [
{
"page_number": 1,
"coordinates": [
89.76022338867188,
149.85325622558594,
163.3228759765625,
166.2278289794922
],
"system": "PixelSpace",
"layout_width": 596,
"layout_height": 842
}
]
},
{
"id": 3,
"type": "Text",
"text": "This section provides a brief overview of the document's content. It includes the primary objectives, key themes, and a high-level summary of the discussions. ",
"parent_id": 2,
"relation": "part_of",
"composing_blocks": [
{
"page_number": 1,
"coordinates": [
89.46441650390625,
174.7772216796875,
287.5709533691406,
235.08912658691406
],
"system": "PixelSpace",
"layout_width": 596,
"layout_height": 842
}
]
}
]
}
JSON 示例解析:深入剖析其核心优势
为了更全面地展示 JSON 在文档解析中的结构化和灵活性,这里将深入解析 JSON 示例的关键部分,并进一步探讨它在实际应用中的潜力。
1. 结构化层级关系:构建文档的逻辑框架
在 JSON 示例中,每个节点都通过 id 和 parent_id 字段明确表示了文档的父子层级关系,例如:
-
id: 1 是顶层节点,表示文档的主要标题(Document Title),它的 parent_id 为 -1,表示没有上级节点。
-
id: 2 表示文档的章节标题(1. Abstract),它的 parent_id: 1 表明它是 id: 1 的子节点。
-
id: 3 是正文内容(Text),它的 parent_id: 2 表示该正文属于章节标题 1. Abstract。
这种层级关系的设计不仅直观,而且对复杂文档的解析非常友好。开发者可以基于这种树形结构轻松实现:
-
递归解析:对文档进行层级化拆分,例如将某个章节及其子内容单独提取。
-
结构化检索:基于父子关系快速定位某一节点及其相关内容,例如直接检索一个章节及其所有段落。
此外,这种结构非常适合扩展,能够支持更复杂的文档结构,例如嵌套列表、嵌套表格等场景。
2. 精准的空间信息:还原文档的视觉布局
每个节点的 composing_blocks 字段记录了文档中内容的空间位置信息,包括:
-
page_number:指示内容所在的具体页面。
-
coordinates:用像素表示内容在页面中的位置(以 [左上角 X, 左上角 Y, 右下角 X, 右下角 Y] 格式记录)。
-
layout_width 和 layout_height:记录页面的整体宽高。
这些数据在以下场景中尤为重要:
-
还原原始文档布局:当需要展示解析后的文档时,可以精准地将节点内容还原到原始文档的视觉位置,保持文档的完整性。
-
高亮和标注功能:RAG 系统可以利用坐标信息,对检索到的关键内容进行高亮或注释,提升用户体验。
-
多模态场景的支持:对图像、表格等非文本内容,通过空间信息可以实现更精确的定位和交互。
例如,在解析 PDF 文档时,RAG 系统可以直接利用 coordinates 信息定位文档中的图表区域,并将其与正文相关联,形成更加丰富的检索结果。
3. 内容分类和描述:提升语义表达力
在 JSON 示例中,每个节点通过 type 和 text 字段明确分类和存储内容:
-
type 字段:区分节点的类型,例如 Title 表示标题,Text 表示正文。开发者可以基于此字段快速筛选特定类型的内容,比如提取所有章节标题生成目录。
-
text 字段:存储节点的具体文本内容,直接用于下游的检索和生成任务。
此外,这种分类的潜力还包括:
-
灵活扩展:可以为不同类型的内容添加额外的字段。例如,为 Table 类型添加表格的行列信息,为 Image 类型添加图片的描述文字或嵌入向量。
-
增强语义关联:通过字段扩展,可以增加对上下文的描述。例如,在正文中关联引用的图表或附录内容,进一步强化语义关系。
4. 多模态数据的轻松整合:支持文本、图像和结构化信息
在实际场景中,许多文档包含多模态内容,例如文本、图片、表格等。而 JSON 的设计天然支持对多模态数据的整合:
-
文本内容:可以直接存储在 text 字段中。
-
图片或图表:可以通过 coordinates 和 system 字段记录其位置,同时通过新增字段描述图片的元数据(例如图像说明或内容摘要)。
-
表格数据:可以扩展为嵌套的 JSON 结构,例如为表格增加 rows 和 columns 字段,详细记录每个单元格的内容和位置。
这种整合能力大大简化了多模态文档的解析工作,让 RAG 系统能够处理更加复杂的文档类型。
5. 支持定制化任务:从检索到生成的全流程服务
JSON 的灵活性不仅体现在数据表示上,还体现在对特定任务的支持上。例如:
-
检索优化:可以在解析时预定义检索逻辑,例如为每个节点添加关键词或嵌入向量字段,方便 RAG 系统快速定位相关内容。
-
生成任务支持:通过在 JSON 中增加上下文描述和语义标签字段,RAG 系统在生成回答时可以获取更多的背景信息,提高生成质量。
-
高效切块与组合:JSON 的结构化设计让内容的切块、组合变得更加自然。例如,可以直接基于节点的层级关系和类型字段生成语义单元,无需额外的解析逻辑。
JSON 特性的具体应用与问题优化
JSON 的结构化数据形式不仅具备清晰的逻辑层级和语义关系,还能够通过其灵活的字段扩展能力,为多种实际场景中的问题提供精准解决方案。以下将结合 JSON 数据的特性,详细分析其在几个典型场景中的优化应用。
1. 企业知识管理
问题:
企业内部文档(如 PDF 报告、技术文档、设计文档等)通常包含复杂的内容层级和多样的格式,传统解析方式难以统一文档的逻辑结构。以 Markdown 为基础的解析方式往往导致上下文缺失,无法有效支持知识检索和问答任务。
JSON 优化点及应用:
-
利用嵌套结构表示层级关系:
JSON 中的嵌套结构可以将文档内容的层级逻辑(如章节、段落、条款等)清晰地表示。例如,文档中的“章节-段落-子段落”关系可以直接通过parent_id 和 id 建立树状结构。
优化效果:
-
能够直接实现基于章节或段落的精准检索,无需额外解析逻辑。
-
支持基于层级的摘要生成(如提取各章节的摘要内容)。
-
结合页面空间信息定位内容:
通过page_number 和 coordinates 字段,JSON 能够将文档中的文字、图片等内容与其在页面中的位置绑定。
优化效果:
-
在用户提出问题时,可以高亮显示检索到的关键内容(如图表、段落),提供更直观的反馈。
-
支持视觉化的文档呈现,例如在 RAG 系统中动态展示知识点所在的文档位置。
-
增强的检索策略:
JSON 格式允许为每个节点添加关键词字段或嵌入向量,从而支持语义级的检索。
优化效果:
-
提升了知识库的检索精度,使得系统能够根据用户查询语义更准确地定位相关内容。
2. 法律和合同文档解析
问题:
法律文档和合同通常具有严密的层级逻辑(如章节、条款、条款中的具体条目),同时伴随大量的交叉引用关系。例如,某条款可能引用了其他章节中的条款。传统解析方式往往无法准确还原这种复杂的层级和引用关系,导致检索和生成任务效果较差。
JSON 优化点及应用:
-
表达条款的逻辑层级:
通过 JSON 的嵌套结构,可以精准表达法律文档中“章节-条款-条目”的层级关系。例如,使用parent_id 字段可以标明某一条款属于哪个章节,某一条目属于哪条条款。
优化效果:
-
实现了法律条款的层级化检索,例如快速定位“某章节下的第几条条款”。
-
便于生成法律文档的可视化摘要,将每一条内容以树状结构直观呈现。
-
记录条款之间的引用关系:
通过 JSON 中的自定义字段(如reference),可以清晰记录某条款对其他条款的引用关系。
优化效果:
-
在用户查询某条款时,系统可以自动检索出被引用的相关条款,提供上下文支持。
-
优化了基于引用关系的问答任务,例如解释某条款时,自动引入相关的背景信息。
-
支持复杂内容的分块和组合:
使用 JSON 的分块能力(如chunk 字段)将文档中的条款内容进行逻辑划分,并支持动态组合。
优化效果:
-
可以根据用户需求,动态生成某一章节的摘要或合并多个相关条款。
-
在长法律文档中,实现按需提取,避免全篇扫描的低效操作。
3. 学术文档解析
问题:
学术文档如论文和研究报告往往包含多个部分(如标题、摘要、正文、图表、参考文献),以及复杂的引用和上下文关系。传统解析方式难以同时兼顾文档的层级逻辑和引用结构,尤其在生成问答或摘要时,容易因上下文不足导致结果不准确。
JSON 优化点及应用:
-
细粒度的结构化层级:
JSON 中可以通过type 字段区分文档内容的类型(如标题、正文、表格),并通过嵌套字段进一步表达内容的层级。例如,某章节标题下的正文段落和表格可以直接归属于该章节。
优化效果:
-
系统能够快速检索某章节的所有内容,并按类型区分(如提取所有正文或表格)。
-
针对学术问答场景,能够根据用户的具体问题定位到相关段落或表格内容。
引用关系的还原:
学术文档中的引用(如参考文献、图表编号)可以通过 JSON 的relation 字段记录下来。例如,正文中的某段内容可以标注其引用了第几页的图表或哪一篇参考文献。
优化效果:
-
在问答任务中,可以在回答正文内容时,自动补充相关引用信息,增强语义关联性。
-
支持生成带有完整引用链的学术摘要,便于用户快速了解内容背景。
-
多模态内容的整合:
学术文档中的图表、公式等内容可以通过 JSON 的composing_blocks 字段记录其在页面中的位置信息,同时通过扩展字段存储其描述或计算结果。
优化效果:
-
在图表和正文的结合问答中,系统可以利用 JSON 数据准确定位图表所在的页面位置,并提取相关的描述信息作为补充回答。
-
对于公式等内容,系统可以直接生成基于公式的解释,提升回答的深度。
4. 技术文档与产品手册解析
问题:
技术文档和产品手册通常结构复杂,包含大量的模块化内容(如章节、步骤、代码段、图表等)。传统解析方式难以处理这些内容的模块化特点,且在跨模块检索和组合时效率较低。
JSON 优化点及应用:
-
模块化的表示方式:
通过 JSON 的层级化和字段化表示,可以将每个模块(如步骤、代码段)作为独立节点表示,同时关联其所在章节。
优化效果:
-
系统能够快速检索某一模块,并通过上下文信息为用户提供完整的相关内容。
-
支持模块化输出,例如生成特定步骤的独立文档或摘要。
-
代码与描述的结合:
JSON 支持将代码段作为独立字段存储(如code_block),并通过其他字段存储描述或解释内容。
优化效果:
-
实现代码与解释的动态组合,便于用户理解每段代码的具体功能。
-
在技术问答任务中,能够根据代码段精准定位其含义,并生成对应的技术建议。
结语
综上,我们(EasyLink AI)团队认为,针对RAG场景,将文档解析成JSON 是更优的选择。
1. JSON 的结构化逻辑能够更好地为 LLM 提供标准化、多层次的输入数据,从而降低数据清洗成本,提高模型效率与效果。
2. JSON 的灵活性和扩展性使其能够适配不断发展的多模态文档解析与 RAG(如文本生成、问答生成)任务。
3. Markdown 的轻量特性则更多适合人类用户的知识展示与组织行为,无法满足复杂模型的底层解析需求,局限明显。
想让你的 RAG 应用更智能、更准确?
优质的输入数据是关键。正如你刚刚了解到的,JSON 比 Markdown 能提供更丰富的结构信息。
EasyDoc 专注于将那你的文档高效转化为最优化的 RAG 数据源,让你专注于模型调优而非数据处理。
🚀 免费试用 EasyDoc,提升您的 RAG 应用表现:EasyDoc Home
JSON 是否会凭借在 RAG 和 LLM 技术中的巨大优势,成为训练与应用场景的“主流选择”?欢迎分享你的观点!