TL;DR
- 对于网络抓取的 RAG,块边界应遵循文档的意义和结构,而不是先遵循令牌限制。
- Markdown 标题对文档效果很好;递归拆分是长段落的实用后备;语义和父子方法需要自己的评估。
- 保留源 URL、标题路径、版本和稳定 ID 与每个块一起,并保护代码围栏、表格和端点/参数上下文。
- 在相同页面和问题集上比较策略;此草稿提供评估方法,而非虚构的基准结果。
引言:拆分是检索设计的一部分
Nstdata Crawl 是此工作流程中的收集层;其 产品概述 描述了下游数据管道的页面和站点检索。
拆分将源文档分成可以嵌入和检索的单位。目标不是产生等大小的文本块。而是使一个段落包含足够的上下文来回答问题,而不拖入无关材料。一个带有标题、API 表、代码示例和页脚的网页与一个无结构的段落并不相同。
一个好的 RAG 块保留了解释段落所需的信息:其标题、页面、版本,通常还有旁边的句子或代码块。一个差的块可能会将端点与其参数分开,或在每个结果中重复导航文本。下面的方法首先准备干净的 Markdown,然后在同一检索任务上比较拆分选择。
什么是 RAG 中的拆分,为什么重要?
检索器搜索块,而不是整个源站点。如果一个块太宽,则相关句子会与无关内容竞争,消耗更多上下文。如果一个块太窄,则检索到的术语可能与其定义、条件或示例分开。这即使在源页面正确捕获的情况下,也可能降低检索的有效性。
拆分无法修复丢失的内容。如果爬虫未能捕获页面的客户端呈现的表格,则没有任何拆分器能够重构它。使用 Crawl 来检索和清理页面,然后在调整拆分器之前检查 Markdown 结构。Nstdata 的 Crawl 指南 记录了 RAG 和代理工作流的 Markdown 输出。
为什么网络抓取的内容需要结构感知的拆分
网络内容包括重复的标题和页脚、嵌套标题、代码示例、表格、链接、通知和版本路径。仅字符拆分器无法识别代码围栏是一个示例,或者标题“身份验证”定义了下一个段落的范围。首先标准化样板,然后保留承载意义的页面结构。
六种常见的 RAG 拆分策略
| 策略 | 边界 | 适合 | 成本或失败模式 |
|---|---|---|---|
| 固定大小 | 字符或令牌 | 快速基线 | 拆分标题、示例和列表 |
| 递归 | 段落、行、句子 | 混合散文 | 分隔符顺序和重叠需要调整 |
| 语义 | 句子之间的意义变化 | 主题变化的散文 | 额外的嵌入工作;阈值敏感 |
| Markdown 标题 | H1/H2/H3 部分 | 技术文档和知识库 | 非常长的部分需要第二次处理 |
| 父子 | 小子项,大父项 | 精确检索加更完整上下文 | 更多 ID 和检索逻辑 |
| 上下文/层次 | 部分加文档上下文 | 碎片页面或多级文档 | 增加的令牌和可能的上下文注入 |
这些是实施模式,而不是排名。正确的选择取决于系统必须回答的问题和缺失上下文的成本。
在拆分之前准备 Markdown
有用的预处理顺序是:拒绝空白或失败的页面,移除提取后存活的重复导航,规范化空白,保留标题/标题层次,然后拆分。保持代码围栏、表格、链接、警告块以及方法/端点对的完整。当前的 Nstdata 输出支持 Markdown 和清理后的 HTML;Markdown 是文本检索的实际起始格式,而在需要自定义解析时,HTML 可能会很有用。





