通过增强的PDF结构识别彻底改变RAG的效果
myzbx 2025-03-13 18:14 8 浏览
摘要
随着大型语言模型(LLM)的快速发展,检索增强生成(RAG)已成为基于专业知识的问答领域的主导方法。目前各大基础模型公司都已经开放了Embedding和Chat API接口,LangChain等框架也已经集成了RAG流程。看来RAG的关键模型和步骤已经解决了,那么问题来了:专业知识QA体系现在是否已经接近完美?
本文发现,目前的主要方法都依赖于访问高质量文本语料库的前提。然而,由于专业文档主要存储在PDF中,PDF解析的准确性较低,严重影响了基于专业知识的QA的有效性。我们对来自相应现实世界专业文档的数百个问题进行了实证 RAG 实验。结果表明,ChatDOC(chatdoc.com)是一个配备全景和精确 PDF 解析器的 RAG 系统,可以检索更准确和完整的片段,从而获得更好的答案。实证实验表明,ChatDOC 在近 47% 的问题上优于基线,在 38% 的情况下持平,仅在 15% 的情况下落后。它表明我们可以通过增强 PDF 结构识别来彻底改变 RAG。
1 简介
大型语言模型 (LLM) 的训练数据主要来自公开的互联网资源,包括网页、书籍、新闻和对话文本。这意味着LLM主要依赖互联网资源作为培训数据,这些数据庞大、多样且易于访问,支持他们扩大能力。然而,在垂直应用中,专业任务要求LLM利用领域知识,不幸的是,这些知识是私有的,而不是其预训练数据的一部分。
为LLM配备领域知识的一种流行方法是检索增强生成(RAG)。 RAG框架回答问题分四个步骤:用户提出查询,系统从私有知识库中检索相关内容,将其与用户查询结合起来作为上下文,最后要求LLM生成答案。图 1 中通过一个简单的示例对此进行了说明。这个过程反映了遇到问题的典型认知过程,包括查阅相关参考文献并随后得出答案。在此框架中,关键部分是相关信息的准确检索,这对于 RAG 模型的有效性至关重要。
图 1.检索增强生成 (RAG) 的工作流程。
然而,从 PDF 文件中检索的过程充满了挑战。常见问题包括文本提取不准确以及 PDF 文件内表格的行列关系混乱。因此,在RAG之前,我们需要将大文档转换为可检索的内容。转换涉及几个步骤,如图2所示:
图 2.将 PDF 转换为可检索内容的过程。
- 文档解析和分块。它涉及提取段落、表格和其他内容块,然后将提取的内容分成块以供后续检索。
- 嵌入。它将文本块转换为实值向量并将其存储在数据库中。
由于每个步骤都可能导致信息丢失,因此复合损失会显着影响 RAG 响应的有效性。
本文主要解决 PDF 解析和分块的质量是否影响 RAG 的结果的问题。我们将探讨与此问题相关的挑战、方法和现实案例研究。它将包括检查该领域的两种方法,即基于规则的方法和基于深度学习的方法,然后通过实例对其功效进行实证评估。
2 PDF 解析和分块
2.1 挑战和方法概述
对于人类来说,阅读任何文档页面的认知过程都是相似的。当我们阅读一页时,字符被我们的视网膜捕获。然后,在我们的大脑中,这些字符被组织成段落、表格和图表,然后被理解或记忆。然而,计算机将信息视为二进制代码。从他们的角度来看,如图 3 所示,文档可以分为两种不同的类型:
图 3.计算机视图中的两种类型的文档。
- 标记文档:示例包括 Microsoft Word 和 HTML 文档,其中包含
和
等特殊标记,用于将文本组织为段落、单元格和表格。
- 未标记文档:示例包括 PDF,它存储有关每个文档页面上字符、线条和其他内容元素的放置的说明。他们专注于以一种使文档易于人类读者阅读的方式“绘制”这些基本内容元素。它们不存储文档的任何结构信息,例如表格或段落。因此,未标记的文档仅适合人类电子阅读,而无法被机器读取。当尝试将 PDF 中的表格复制到 MS Word 中时,这一点变得很明显,其中表格的原始结构通常会完全丢失。
然而,大型语言模型 (LLM) 在处理序列化文本方面表现出熟练程度。因此,为了使法学硕士能够有效地管理未标记的文档,需要一个能够将分散的字符组织成具有结构的连贯文本的解析器。理想情况下,PDF 解析器应具有以下主要功能:
- 文档结构识别:它应该熟练地将页面划分为不同类型的内容块,如段落、表格和图表。这保证了划分的文本块是完整且独立的语义单元。
- 复杂文档布局的稳健性:即使对于具有复杂布局的文档页面(例如多列页面、无边框表格,甚至具有合并单元格的表格),它也应该能够很好地工作。
目前,PDF解析的方法主要有两类:基于规则的方法和基于深度学习的方法。其中,PyPDF是一种广泛使用的基于规则的解析器,是LangChain中用于PDF解析的标准方法。相反,我们的方法 ChatDOC PDF Parser ( https://pdfparser.io/ ) 是以深度学习模型为基础的。接下来,我们通过介绍方法并深入研究一些现实案例来说明它们之间的区别。
2.2 基于规则的方法:PyPDF
我们首先介绍基于 PyPDF 的解析和分块工作流程。首先,PyPDF 将 PDF 中的字符序列化为长序列,而无需文档结构信息。然后,利用一些分割规则,例如LangChain中的“
RecursiveCharacterTextSplitter”函数,将该序列分割成离散的块。具体来说,该函数根据预定义的分隔符列表(例如换行符“\n”)来划分文档。在此初始分段之后,仅当组合块的长度不大于预定的N 个字符限制时,才合并相邻块。在下文中,在没有上下文歧义的情况下,我们使用“PyPDF”来指代使用 PyPDF+
RecursiveCharacterTextSplitter 进行文档解析和分块的方法。下面将块的最大长度设置为 300 个令牌。接下来我们通过一个案例来观察PyPDF的本质。图 4 中的情况 1是文档中的一个页面,其中混合了表格和双栏文本,其边界难以区分。表格中间的行没有水平线,导致难以识别表格中的行。段落既有单栏布局(适用于表格下方的注释),也有双栏布局(适用于页面下部的段落)。
图 4. PyPDF 在案例 1 上的解析和分块结果(原始文档:[4])。放大查看细节。PyPDF的解析和分块结果如图4所示。在“3可视化”部分,我们可以看到PyPDF正确识别了页面的一列和两列布局部分。但PyPDF也存在三个缺点:
- 它无法识别段落和表格的边界。它错误地将表格分成两部分,并将第二部分与后续段落合并为一个块。
PyPDF 似乎擅长检测段落的边界,因为它不会将一个段落分成多个块。但它实际上并没有解析段落的边界。在“2 Chunking Result”部分中,我们可以看到页面中的每个可视文本行都被解析为结果中以“\n”结尾的行,并且段落末尾没有特殊格式。它正确地对段落进行分块,因为我们使用特殊的分隔符“\n”,它将以句点结尾的行视为段落的结尾。然而,这种启发式在很多情况下可能并不成立。 - 它无法识别表内的结构。在“2 Chunking Result”部分中,在 chunk1 中,表格的上半部分表示为一系列短语,其中一个单元格可以分为多行(例如单元格“China commerce(1)”),并且一些相邻小区可以排成一行(例如第二行中的第三至第五小区,“services(1)菜鸟云”)。这样,表的结构就完全被破坏了。如果为 RAG 检索此块,LLM 无法从中感知任何有意义的信息。 Chunk 2 的情况类似。而且,表头只存在于 Chunk 1 中,因此 Chunk 2 中表的下部变得毫无意义。
- 它无法识别内容的阅读顺序。第 5 块“管理讨论与分析”的最后一行实际上位于页面顶部,但被解析为结果中的最后一句。这是因为 PyPDF 按字符的存储顺序而不是读取顺序来解析文档。当面对复杂的布局时,这可能会导致混乱的结果。
具有复杂跨页表的另一个案例案例 2 的结果如附录中的图 15 所示。
2.3 基于深度学习的方法:ChatDOC PDF Parser
接下来,我们将注意力转向基于深度学习的解析方法,以 ChatDOC PDF 解析器为例。 ChatDOC PDF 解析器 ( https://pdfparser.io/ ) 已在超过一千万个文档页面的语料库上进行了训练。遵循[2]中的方法,它包含一系列复杂的步骤,包括:
- OCR用于文本定位和识别;
- 物理文件对象检测;
- 跨栏、跨页修剪;
- 阅读顺序确定;
- 表结构识别;
- 文档逻辑结构识别。
读者可以参考[2]了解这些步骤的详细信息。解析后,我们使用段落和表格作为基本块,并合并相邻的块,直到达到令牌限制形成一个块。
ChatDOC PDF 解析器旨在一致地以 JSON 或 HTML 格式提供解析结果,即使对于具有挑战性的 PDF 文件也是如此。它将文档解析为内容块,其中每个块指的是表格、段落、图表或其他类型。对于表格,它输出每个表格单元格中的文本,并告知哪些单元格被合并到新单元格中。此外,对于具有分层标题的文档,它会输出文档的分层结构。总而言之,解析的结果就像一个组织良好的Word文件。图5显示了扫描复印页面及其解析结果。左侧显示文档和识别的内容块(具有不同颜色的矩形)。右侧显示 JSON 或 HTML 格式的解析结果。读者可以参考[3]查看该解析结果的现场演示。
图 5.说明 ChatDOC PDF 解析器结果的示例。放大查看细节。
然后,我们检查图 6 中案例 1 的 ChatDOC PDF Parser 的结果。它成功解决了 PyPDF 的三个缺点。
图 6. ChatDOC PDF Parser 对案例 1 的解析和分块结果(原始文档:[4])。放大查看细节。
- 如“3 可视化”部分所示,它识别混合布局并正确地将整个表设置为单独的块。对于段落,如“2分块结果”部分中的块2所示,同一段落中的文本行合并在一起,使其更易于理解。
- 在“2 Chunking Result”部分,在Chunk 1中,我们可以看到表是使用markdown格式表示的,它保留了表的内部结构。此外,ChatDOC PDF 解析器可以识别表格内的合并单元格。由于markdown格式无法表示合并的单元格,因此我们将合并单元格中的整个文本以markdown格式放入到每个原始单元格中。正如您所看到的,在块 1 中,文本“Yearending March 31, 2021”重复了 9 次,这代表与原始 9 个单元格的合并。
- 另外,“管理层讨论与分析”和“112阿里巴巴集团控股有限公司”被识别为页眉和页脚,并放置在解析结果的顶部和底部,与阅读顺序一致。
案例2的另一个复杂且跨页表的案例的结果如附录图16所示。
3 PDF识别对RAG影响的实验
回到本文的主题,文档的解析和分块方式是否会影响 RAG 系统提供的答案的质量?为了回答这个问题,我们进行了系统实验来评估其影响。
3.1 RAG答案质量的定量评估
3.1.1 设置
我们比较了表 1 中列出的两种 RAG 系统:
表 1.两个 RAG 系统的设置:ChatDOC 和 Baseline。
- ChatDOC:使用 ChatDOC PDF 解析器解析文档并利用结构信息进行分块。
- Baseline:使用 PyPDF 解析文档并使用 RecursiveCharacterTextSplitter 函数进行分块。
两个系统的其他组件(例如嵌入、检索和 QA)是相同的。
3.1.2 数据准备
在我们的实验中,我们组装了一个密切反映现实世界条件的数据集,其中包含来自各个领域的 188 个文档。具体来说,该合集包括 100 篇学术论文、28 份财务报告以及 60 份其他类别的文件,例如教科书、课件和立法材料。
然后,我们通过众包收集了 800 个手动生成的问题。经过仔细筛选,我们剔除了低质量题,得到了302道评价题。这些问题分为两类(如表2所示):
表 2.数据集中的问题分为提取问题和综合分析问题。
- 提取性问题是那些可以通过直接摘录文档来回答的问题。通常,他们需要精确的答案,因为他们寻求特定的信息。我们发现,在使用LLM进行评估时,它可能无法区分答案之间细微但重要的差异,因此我们依靠人工评估。我们使用 0-10 等级来对结果进行评分。向注释者提供两种方法的检索内容和答案,并同时对两种方法进行评分。我们显示检索到的内容,因为它通常无法在没有文档内容的情况下评估答案,并一起显示两种方法以促进详细比较,特别是在部分正确的结果上。
- 综合分析问题需要综合多来源、多方面的信息并进行总结。由于答案很长并且需要对给定文档内容进行全面理解,因此我们发现人类评估起来既困难又耗时。因此,我们使用 GPT-4 来评估答案质量,评分范围为 1-10。我们还在一个请求中对两种方法的结果进行评级。但是我们只给出检索到的内容而不给出答案,因为与提取性问题相比,答案很长(因此成本很高),并且更好的检索内容可能意味着更好的答案(因为使用的LLM是相同的)。两种方法的一对结果被评分4次以避免偏差[5],并使用它们的平均值。具体来说,对于同一问题要比较的一对内容(A,B ),我们将A和B都输入到 GPT-4 中进行两次比较和评分。我们还翻转他们的顺序,将B和A喂给GPT-4,并重复请求两次。
3.1.3 结果
提取问题的结果
抽取式问题的结果如表 3 所示。在 86 个抽取式问题中,ChatDOC 在 42 个案例上的表现优于基线,在 36 个案例上表现平平,仅在 8 个案例上低于基线。
表 3. ChatDOC 与 Baseline 的比较结果。
评级分数的分布在图7中进一步详细说明。在分布表中,T_ij=k表示有k个问题,ChatDOC的答案被评为i,而Baseline的答案被评为j。 ChatDOC 得分高于基线的情况(ChatDOC 获胜)显示在左下半部分,而基线得分较高的情况则显示在右上角。值得注意的是,大多数明显获胜的样本都位于左下半部分,这表明了 ChatDOC 的优越性。令人印象深刻的是,ChatDOC 在近一半的案例中获得了满分(10 分),总计 40 分。
图 7.提取问题的评分分布。
综合分析题结果
综合分析问题的结果如表3所示。在216个综合分析问题中,ChatDOC在101个案例中表现优于基线,在79个案例中表现平平,仅在36个案例中低于基线。
在图 8 中,这些问题的分数分布图显示,左下半部分较为集中。这表明 ChatDOC 经常优于基线。值得注意的是,ChatDOC 的大部分检索得分在 8.5 到 9.5 之间,显示出高水平的检索质量。
图8综合分析题评分分布。
综上所述,ChatDOC 明显优于 Baseline,这主要归功于其优越的 PDF 解析方法。
3.2 RAG案例分析
为了使比较更加直观,我们展示了一些 ChatDOC 展示其优越性的案例。
3.2.1 案例 A — 在 Tesla 手册中查找具体信息
案例A涉及查询特斯拉的用户手册,专门针对货运量信息。对于此查询,ChatDOC 和 Baseline 的执行方式有所不同,如图 9 和图 10 所示。这些图显示了检索到的最相关的块以及 LLM 的答案。它们还显示相关块所在的文档页面,并突出显示这些块。在这种情况下,两个模型都定位了表格,但它们提供给 LLM 的文本不同,因此答案不同。具体来说,
- ChatDOC识别表结构,以Markdown格式解释文本(如“检索的文本块”部分所示),这使得语言模型更容易理解。
- Baseline错误地将目标表和上面的表合并为一个chunk并且没有表结构。因此,该块中的文本无法理解(如“检索的文本块”部分所示),LLM 只能回答“未明确提及”。
图 9. ChatDOC 在特斯拉手册中查找信息的结果(原始文档:[6])。
图 10.在特斯拉手册中查找信息的基线结果(原始文档:[6])。
这个案例强调了 ChatDOC 解析方法的有效性,特别是在处理表格并以 LLM 友好的格式呈现它们方面。
3.2.2 案例B——研究论文
在案例 B 中,用户的查询是针对特定的研究论文。它要求系统识别论文中的“表 8”,并枚举其列出的所有因变量。表的标题和内容对于识别这些变量都是必要的。图 11 和图 12 显示了 ChatDOC 和 Baseline 在这个案例。
图 11. ChatDOC 在研究论文中定位特定表的结果(原始文档:[7])。
图 12. Baseline 在研究论文中定位特定表格的结果(原始文档:[7])
- ChatDOC 有效地检索整个表,包括其标题和内容。这种全面的检索可以准确地响应查询。
- Baseline 不会检索真正的“Table 8”,而只会检索“Table 7”下方的文本块(因为它包含“Table 8”的文本)。由于基线的分割策略,“表8”的内容和同一页面上的其他内容被组合成一个大块。该块包含不相关内容的混合,具有较低的相似度分数,因此不会出现在检索结果。
此案例凸显了 ChatDOC 处理复杂文档结构的卓越能力及其对检索特定片段以获得准确响应的影响。
3.3 局限性讨论
虽然 ChatDOC 通常表现良好,但在某些情况下其检索质量不如 Baseline。在这些情况下我们观察到两种模式。
排名和代币限制问题。如果 ChatDOC 首先检索一个大但不相关的表,它会耗尽上下文窗口,从而阻止访问相关信息,如图 13 中的示例所示。这主要是因为嵌入模型没有将相关块排名为顶部结果。这可以通过更好的嵌入模型或更复杂的方式来处理大型表格/段落(例如仅保留 LLM 表格的相关部分)来解决。
图 13. ChatDOC 遇到排名和令牌限制问题的示例。
精细分割的缺点。图 14 显示了需要检索整个表及其标题的情况。然而,ChatDOC 错误地将标题识别为常规段落,从而使标题和表格存储在不同的块中。这导致仅检索部分所需信息,即表格的标题和脚注,而不是表格中的关键内容。改进表格标题识别可以解决这些问题。
图 14. ChatDOC 无法检索相关表的示例(原始文档:[8])。
4 ChatDOC 中的应用
我们在 ChatDOC ( chatdoc.com )上应用了增强的 PDF 结构识别框架,这是一个人工智能文件阅读助手,可以帮助总结长文档、解释复杂概念并在几秒钟内找到关键信息。
在可靠性和准确性方面,它在所有ChatPDF产品中名列前茅。 ChatDOC 的特别之处如下:
- 掌握表格:只需选择任何表格或文本,然后直接深入了解细节。
- 多文件对话:同时讨论大量文档,而不必担心每个文档有多少页。
- 引用支持的回复:所有答案均由从源文档中直接引用的内容支持。
- 处理多种文件类型:与扫描文件、ePub、HTML 和 docx 格式无缝协作。
我们仍在努力发布 ChatDOC PDF Parser 的 API。请通过pdfparser.io订阅等待名单。
5 结论
在 PDF 解析器的帮助下,大型语言模型 (LLM) 能够生成更准确的响应,该解析器可以有效地从文档中提取结构化信息并将其集成到提示中。此过程提高了输入模型的数据的质量和相关性,从而提高了模型的输出。
未来我们将比较更多基于深度学习的文档解析方法,以更全面地理解RAG质量与文档解析质量之间的关系。一些初步实验表明,一些开源 PDF 解析方法无法满足高质量 RAG 的标准。
附录:更多 PDF 解析和分块案例
图 15 中的案例 2具有一个跨越两页的大型无边框表格。图 15 显示了 PyPDF 的结果。仔细检查发现,表格仅表示为文本序列,这使得它们难以解释和理解。桌子分散成三块。这两个案例的结果表明,基于规则的方法(如 PyPDF)往往会在没有真正理解文档内容结构的情况下剖析文档。结果,表格经常被拆散,段落变得混乱,导致原始文档的表示脱节且令人困惑。
图 15. PyPDF 在案例 2 上的解析和分块结果(原始文档:[4])。放大查看细节。
对于 ChatDOC PDF 解析器(如图 16 所示),解析结果明显不同。它不仅保留了文档结构,而且还以保持其固有含义的方式有效地对文档进行了分段。在这种情况下,跨越两页的表格被设置为一个块,其标题位于开头。因此,该块中的信息是独立的。如果为 RAG 检索该块,LLM 可以消化其中的有用信息。
图 16. ChatDOC PDF 解析器在案例 2 上的解析和分块结果(原始文档:[4])。放大查看细节。
相关推荐
- 一键生成高颜值图表!让你的文字瞬间有画面感,职场人必备!
-
哈喽,打工人们!忙碌的周中,大熊又来给你们带来一个超实用的效率神器啦!这次的宝藏网站绝对是那种用过就离不开的"真香"型产品!假设你明天就要做重要汇报,可面对一大堆密密麻麻的文字材料,你...
- 批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式
-
Word文档是我们工作中经常会打交道的一种文档格式,我们也经常会有需要对Word文档进行格式转换的需求,比如将Word格式转换为PDF、将Word文档转换为Excel、将Word...
- 绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)
-
大家好,我是一名酷爱研究AI的产品经理,最近我有个新发现:那些花了你3天做出来的PPT,现在用AI可以1小时搞定!而且颜值还高!为什么AI做PPT比传统方式效率高10倍?我用一张图就能告诉你:AI生成...
- ztext - 简单几行代码创建酷炫3D特效文字的开源JS库
-
把网页上的文字变成酷炫的3D风格,还能制作旋转动效,有了ztext.js,只需要几行代码。ztext能做什么ztext.js是一个能把常规的平面文字变成3D样式的前端开源代码库,让开发者...
- 文字内插入小图片,也太可爱了吧(文字中怎么插图片)
-
图文排版H5手机版秀米有小伙伴留言问添加图片的时候可不可以把图片添加到文字之间比如下面这句话中的小贴纸图片后面可以接着输入文字其实吧这就是咱们的『文字内插入小图片』功能嘛可以用来在文字内加个表情包又...
- Linux环境下C++代码性能分析方法(linux怎么写c++代码)
-
技术背景在开发C++应用程序时,找出代码中运行缓慢的部分是进行性能优化的关键。在Linux系统上,有多种工具和方法可用于对C++代码进行性能分析,每种方法都有其特点和适用场景。实现步骤手动中断调试法在...
- SVG互动图文,让你的文章更有趣!教你4种简单易学的黑科技玩法!
-
如果你是一个公众号创作者,那么你一定想知道如何让你的文章更加吸引人,更加有趣,更加有创意。你可能已经尝试过各种图文排版技巧,但是你是否知道,有一种黑科技可以让你的文章变得更加酷炫,更加互动,更加爆款?...
- Videoscribe怎么实现实心中文汉字的手绘制作
-
很多朋友在制作手绘视频的时候,不知道怎么输入实心的中文汉字,之前我们已经给大家分享了怎么输入汉字的方法,但是有一点遗憾的是输出的汉字是空心的手绘展示,在视觉上并不是非常的美观。经过大家不断的探索,终于...
- 一款用于将文本转化成图表的现代化脚本语言
-
大家好,又见面了,我是GitHub精选君!今天要给大家推荐一个GitHub开源项目terrastruct/d2,该项目在GitHub有超过10.3kStar,用一句话介绍该项目就是:...
- 探秘 Web 水印技术(制作水印网站)
-
作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...
- 不忍心卸载的五款神仙工具(不忍心卸载的五款神仙工具是什么)
-
001.效率工具uTools-装机必备的生产力工具集uTools是一款非常强大的可以装下几乎所有效率工具的电脑生产力工具集,目前拥有Windows、Mac和Linux三个版本。软件界面...
- 「SVG」飞花令!这份最高检工作报告“超有料”
-
原标题:【SVG】飞花令!这份最高检工作报告“超有料”栏目主编:秦红文字编辑:沈佳灵来源:作者:最高人民检察院...
- svg|2025政府工作报告,有没有你关心的数据?
-
··<setattributeName="visibility"begin="click+0s"dur="1ms"fill="freeze"restart="never"to="hi...
- videoscribe只能输入英文,如何输入中文文本?
-
videoscribe只能输入英文,如何输入中文文本?打开VideoScribe软件,打开要添加中文字体的位置。打开Photoshop并在文件中创建一个新的透明背景图层。注意:必须是透明背景层。...
- 五个流行的SVG在线编辑器(svg编辑工具)
-
随着响应网络的发展,越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎,以便在任何设备上呈现图像,甚至一些易于使用的SVG在线编辑器,可以替代PS,本文总结了五种流行的SVG...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)